Introdução à Compilação Prof. Leandro Magno Slides adaptados a partir do material cedido pelos professores Heloise Manica Paris Teixeira, Yandre M. G.

Slides:



Advertisements
Apresentações semelhantes
Software Prof. Lucio Mauro Duarte Prof. Avelino Zorzo
Advertisements

Parte 1: Organização de Computadores
gerador de código intermediário
1.3.2 – Linguagem Assembly Um programa em linguagem de máquina sofre de total falta de clareza O programa é uma sequência de linhas numeradas Cada linha.
Introdução à Ciência da Computação Linguagens de Programação.
Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 32 Departamento de Informática Centro.
Entrada e Saída Introdução.
Linguagem de Montagem Visão geral.
Paradigmas de Linguagens Conceitos Básicos
Paradigmas de Programação
Seminários de Compiladores
Deyvisson, Rafael M.P., Renato, Robson C.F., Rodolfo
Software Básico Silvio Fernandes
Compiladores Prof. Yandre Maldonado Compiladores - Prof. Yandre - 1.
Prof. Heloise Manica Paris Teixeira
Introdução a Informática
Ferramentas Programação
Curso Sistemas de Informação Disciplina: Arquitetura de Software
Softwares.
Linguagem de Prog. e Programas
Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Verificação de Tipos.
Tradutores de Linguagens
Arquitetura de Computadores
Linguagens de Programação
Prof. Msc. Raul Paradeda Aula 2 Introdução
Estrutura de um tradutor
Professor Fernando Luís
Paradigmas de programação
Lógica de Programação UNIDADE 1 – Introdução a) Computador
PROGRAMAÇÃO I UNIDADE 1.
Aula prática - análise contextual
Representação de Instruções
Software Básico Silvio Fernandes Universidade Federal Rural do Semi-Árido Departamento de Ciências Ambientais Ciência da Computação Aula 02: Introdução.
Aula 1 - Introdução ao C Ameliara Freire.
PCI- Introdução à Computação
Algoritmos 1º Semestre Materia: Informática Profº: Cristiano.
Teoria e Implementação de Linguagens Computacionais – IF688
Avaliação da Linguagem de Programação
Análise Léxica Primeira fase de um compilador
Organização e Arquitetura de Computadores
Geração de Código Intermediário
Análise Léxica.
Capítulo II Gramáticas e Linguagens
Lógica Estruturada Aplicada
Geração de Código aula-12-geração-de-código.pdf.
Execução de programas Cap. VIII.
Analise Semântica aula-10-analise-semântica.pdf.
Analisador Léxico Prof. Alexandre Monteiro
Laboratório de Programação I Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Projeto de Linguagens de Programação
Processadores de Linguagens
Back-End Compilação aula-11-back-end.pdf.
Faculdade Pernambucana - FAPE Setembro/2007
Algoritmos e Programação I
COMPILADORES 04 Prof. Marcos.
Semântica de Linguagens de Programação
Compiladores – IF688 Professor: André Santos
Algoritmos e Programação MC102
Linguagens de Programação
SISTEMAS DE INFORMAÇÃO
Faculdade Pernambuca - FAPE
tópicos 01. Compiladores 02. Tradutores 03. Linguagens de Programação
Introdução à lógica de programação
Compilador Software que traduz o texto (linguagem fonte) que representa um programa para código máquina(linguagem alvo) capaz de ser executado pelo.
Influencias sobre o Projeto da Linguagem
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
MATA56 Tipos, Verificação de Tipos Agenda Objetivo desta aula: Introduzir os principais aspectos semânticos de variáveis Palavras-chave – nomes.
LÓGICA DE PROGRAMAÇÃO Curso: Técnico em Informática Professor: Ronaldo Disciplina: Lógica de Programação.
COMPILADORES 02 Prof. Marcos. COMPILADORES Do Programa à Execução Computadores das mais variadas arquiteturas têm funcionamento:
Transcrição da apresentação:

Introdução à Compilação Prof. Leandro Magno Slides adaptados a partir do material cedido pelos professores Heloise Manica Paris Teixeira, Yandre M. G. e Costa e Profa. Valéria D. Feltrim (DIN – UEM)

Tipos de Tradutores TRADUTORES INTERPRETADORES PRÉ-PROCESSADOR COMPILADORES MONTADORES

Tradutor: programa que transforma um programa fonte escrito numa linguagem em um programa equivalente escrito em uma linguagem diferente; Pré-processador: programa que transforma um programa escrito em uma linguagem estendida em um programa equivalente escrito em linguagem original; Prog. Linguagem A Prog. Linguagem B Tradutor Prog. Linguagem Estendida Prog. Linguagem Original Pré- processador Compilador

Montador: tradutor que transforma um programa escrito em uma linguagem simbólica (de baixo nível) em instruções equivalentes em linguagem de máquina; Prog. Linguagem Simbólica Instruções em Linguagem de Máquina Montador Alto nível Simbólica Instruções em Ling. de Máquina b := a+2; MOV a, R1 ADD #2, R1 MOV R1, b MOV a, R1 ADD #2, R1 MOV R1, b Compilação Montagem 1xn 1x1

Compilador é um programa que traduz o código fonte escrito em uma linguagem de mais alto nível para outra linguagem de mais baixo nível; a linguagem original é chamada de linguagem fonte, e a linguagem final é chamada de linguagem destino ou alvo; Programa Linguagem Fonte Compilador Programa Linguagem Alvo Mensagens de Erro

Interpretador: tradutor que funciona em tempo de execução. Estes programas traduzem programas codificados em linguagem de alto nível para um código intermediário e o coloca em execução. executam instrução por instrução do código-fonte Programa Fonte Código Intermediário em Execução Interpretador

Interpretadores vs. compiladores Qual a diferença entre compilação e interpretação? Interpretadores Menores que os compiladores Mais adaptáveis a ambientes computacionais diversos Tempo de execução maior Ex. Javascript, Python, Perl Compiladores Compila-se uma única vez, executando-se quantas vezes se queira Tempo de execução menor Ex. C, Pascal, Delph, etc... Compiladores híbridos (Java) Compila-se para um código intermediário/virtual, que, por sua vez, é interpretado por uma máquina virtual

Variedade de compiladores Linguagem Fonte Fortran C Pascal Modula Algol... Máquina Alvo Intel Mips Sparc... A máquina alvo pode estar entre um microprocessador e um supercomputador

Motivos para desenvolver um compilador? Em que situações é necessário construir um novo compilador? Criação de uma nova Linguagem Extensão de uma linguagem existente Surgimento de uma nova máquina Desempenho do compilador existente

A análise cria uma representação intermediária do código Estrutura Geral de um Compilador (Modelo de compilação de Análise e Síntese) Análise Léxica Análise Sintática 1. Análise 2. Síntese Análise Estrutural Análise Semântica Geração de Código Intermediário Otimização de Código Geração de Código Alvo Gera o código a partir da representação intermediária

Estrutura geral de um compilador programa-fonte analisador léxico analisador sintático analisador semântico gerador de código intermediário otimizador de código gerador de código programa-alvo Tabela de símbolos Tabela de palavras e símbolos reservados Manipulação de erros dados de entrada saída

Fases da compilação Lexical: palavras (tokens) do programa i, while, =, [, (, <, int Erro: Sintática: combinação de tokens que formam o programa comando_while while ( expressão ) comandos Erro: while ( expressão comandos Semântica e contextual: adequação do uso Tipos semelhantes em comandos (atribuição, por exemplo), uso de identificadores declarados Erros: i=1 Geração de código: especificidades da máquina-alvo e sua linguagem Alocação de memória, uso de registradores Erro: a[ ]

Estruturas da compilação Tabela de Símbolos É uma estrutura de dados com algoritmos apropriados para a manipulação de seus dados (listas, árvores, arranjos,...); A estrutura de dados que manipula esta tabela deve permitir rápido armazenamento ou recuperação dos dados. Guarda informações sobre os identificadores: Nome Endereço Tipo

Estruturas da compilação Como saber durante a compilação de um programa o tipo e o valor dos identificadores, escopo das variáveis, número e tipo dos parâmetros de um procedimento, etc.? Tabela de símbolos IdentificadorClasseTipoValor... ivarinteger1... fatproc--...

Estruturas da compilação Como diferenciar palavras e símbolos reservados (while, int, :=) de identificadores definidos pelo usuário? Tabela de palavras e símbolos reservados int while :=...

Analisador léxico Identifica no arquivo fonte os símbolos pertencentes à linguagem; Reconhecimento e classificação dos tokens Expressões regulares, autômatos x:=x+y*2

Analisador sintático Verificação da formação do programa Com base em uma gramática livre de contexto Exemplo: regras abaixo definem o comando WHILE (Pascal) comando comandoWhile | comandoIf | comandoAtrib, |... comandoWhile WHILE expr_bool DO comando; expr_bool expr_arit < expr_arit | expr_arit > expr_arit |... expr_arit expr_arit * termo | termo |... termo expr_arit | NÚMERO | IDENTIFICADOR

Analisador sintático Verificação da formação do programa Com base em uma gramática livre de contexto Representação explícita ou não da árvore de derivação comando_atribuição id 1 := id 1 op id 2 op num := id 1 + * id 2 num

Analisador semântico Verificação do uso adequado id 1 := id 1 op id 2 op num (id 1 ) int := (id 1 op id 2 op num) int busca_tabela_símbolos(id 1 )=TRUE busca_tabela_símbolos(id 2 )=TRUE

Analisador semântico Exemplos de verificações semânticas: Compatibilidade de tipos... var A: boolean; B: real; … A:=B+0,5; Duplicidade de identificadores: Var A, A, B: integer; Compatibilidade entre parâmetros formal e atual: procedure X (a, b: integer); begin... end;... X(a, b, c);

Gerador de código intermediário Gera um conjunto de instruções, equivalentes ao programa fonte, para uma máquina hipotética. Ex.: A:=(B+C) * (D+E) Gera-se quádruplas: (+, B, C, T1) (+, D, E, T2) (*, T1, T2, A) A maior diferença entre o código intermediário e o código objeto é que o intermediário não especifica detalhes de baixo nível de implementação, tais como endereços de memória e registradores, entre outros.

Gerador de código intermediário Esta representação intermediária tem as seguintes vantagens: Possibilita a otimização do código intermediário, a fim de obter código objeto final mais eficiente; Resolve, de maneira gradual, problemas da passagem do código fonte para objeto

Gerador de código intermediário Geração de código intermediário/preliminar id 1 := id 1 op id 2 op num temp1 := id 2 * 2 temp2 := id 1 + temp1 id 1 := temp2 Variáveis temporárias geradas pelo compilador Código de três endereços ( tipo de código no qual cada instrução deve ter, no máximo, três operandos)

Otimizador de código Intermediário Função: melhorar o código intermediário de forma que ocupe menos espaço e/ou execute mais rápido. Exemplo temp1 := id 2 * 2 temp2 := id 1 + temp1 id 1 := temp2 temp1 := id 2 * 2 id 1 := id 1 + temp1 temp2 é usada apenas uma vez atribuição de valor a id 1

Gerador de código Objeto Sua principal função é gerar o código equivalente ao programa fonte para uma máquina real, a partir do código intermediário otimizado. Geração do código para a máquina-alvo temp1 := id 2 * 2 id 1 := id 1 + temp1 MOV id 2 R1 MULT 2 R1 MOV id 1 R2 ADD R1 R2 MOV R2 id 1

Tokens e seus lexemas Árvore sintática (implícita ou explícita) Tabela de símbolos única

Passagens Compiladores com várias passagens Compilador de uma única passagem Passagem: leitura de um arquivo de entrada e escrita de um arquivo de saída Em relação a passos de compilação, como são classificados os compiladores?

Passagens Compiladores com várias passagens (n-passos) Vantagens Menor utilização da memória do computador, já que cada passo exerce apenas uma parte das funções de todo o compilador. Maior possibilidade de se efetuar otimizações Os projetos e implementações das várias partes do compilador são mais independentes. Desvantagens Maior volume de entrada/saída (tipicamente acesso a disco ou à rede) Em geral há aumento do tempo de compilação. Aumento do projeto total, com necessidade de introdução das linguagens intermediárias.

Passagens Compilador de uma única passagem O programa alvo ou objeto já é o produto final do compilador, ou seja, o programa em linguagem de máquina desejado. código-fonte código-alvo Todo processo de compilação em memória: o código-alvo é gerado enquanto o código-fonte é lido. Possíveis problemas: Falta de memória

Exercícios Em que situações é necessário construir um novo compilador ? Qual a diferença entre compilação e interpretação? Porque programas compilados em geral apresentam maior desempenho? Em relação a passos de compilação, como são classificados os compiladores? Defina token. Qual(is) a(s) principais função(ões) do analisador léxico, sintático e semântico? Considere a linguagem de programação Pascal e dê pelo menos um exemplo para cada tipo de erro: léxico, sintático e semântico. Explique as etapas que constituem o processo de compilação e seu inter-relacionamento.