COMPILADORES
Aula 02
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
COMPILADOR X INTERPRETADOR COMPILADORES
- Vantagens:
- Vantagens:
1) A execução do programa é mais rápida. 2) Estruturas de dados mais completas; 3) Permitem a otimização de código fonte.
- Desvantagens:
- Desvantagens:
1) Várias etapas de tradução;
2) Processo de correção de erro e de depuração é mais demorado;
3) Programação final é maior, o que gera a necessidade de mais memória;
INTERPRETADORES
-Vantagens:Vantagens:
1) Depuração é mais simples; 2) Consomem menos memória;
3) Resultado imediato do programa ou rotina desenvolvida.
- Desvantagens:Desvantagens:
1) A execução do programa é mais lenta. 2) Estrutura de dados demasiadamente simples;
3) Necessário fornecer o programa fonte ao utilizador;
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Estrutura de um Tradutor
• Independentemente da linguagem a ser traduzida
ou do programa objeto a ser gerado, os tradutores, de um modo geral, compõem-se de funções padronizadas, que compreendem a análise do programa fonte e a posterior síntese para a derivação do código objeto.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Análise Léxica:
O objetivo é identificar sequências de caracteres que O objetivo é identificar sequências de caracteres que constituem unidades léxicas (TOKENS).
constituem unidades léxicas (TOKENS).
- Os caracteres pertencem ao alfabeto da linguagem? - Identificar Tokens;
- Desprezar comentários e espaços em branco; - Inicia a construção de Tabela de Símbolos;
- Envia mensagens de erro em caso de unidades léxicas não aceitas pela linguagem em questão.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
TOKENS:
Constituem classes de símbolos tais como:Constituem classes de símbolos tais como:
- Palavras reservadas; - Delimitadores;
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
TOKENS:
Podem ser representados:Podem ser representados:
- Através do próprio símbolo (delimitadores, palavras reservadas);
- Ou par ordenado, no qual o primeiro elemento indica a classe do símbolo e o segundo, um índice para uma área onde o próprio símbolo foi armazenado (tabela de identificadores)
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Análise Léxica:
A saída do analisador léxico é uma cadeia de Tokens A saída do analisador léxico é uma cadeia de Tokens que é passada para a próxima fase, a Análise Sintática.
que é passada para a próxima fase, a Análise Sintática.
- O analisador léxico é implementado como uma subrotina que funciona sob o Comando do Analisador Sintático;
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Exemplo de um Analisador Léxico:
Programa fonte Pascal:
While I < 100 do I := J + I;While I < 100 do I := J + I;
Após passar pelo analisador léxico:
[while,] [id,7] [<,] [cte,13] [do,] [id,7] [:=,] [id,12] [+,] [id,7] [;,] [while,] [id,7] [<,] [cte,13] [do,] [id,7] [:=,] [id,12] [+,] [id,7] [;,] Cadeia de tokens produzida pelo analisador léxico
[ CLASSE DO SÍMBOLO , ÍNDICE DE TABELA ]
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Análise Sintática:
Tem por função verificar se a estrutura gramatical do Tem por função verificar se a estrutura gramatical do programa esta correta.
programa esta correta.
- Identifica sequência de símbolos através de uma varredura ou PARSING da sequência de tokens;
- Produz a árvore de derivação resultante da aplicação das regras gramaticais da linguagem.
- Detecção de erros de síntaxe, identificando a posição e tipo de erro ocorrido;
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Exemplo:
Considere o comando Pascal:
While <expressão> do <comando>While <expressão> do <comando>
Neste caso, a estrutura <expressão> deve apresentar-se sintaticamente correta, e sua avaliação deve retornar um valor do tipo lógico.
Ou seja,
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Análise Semântica:
Tem por função verificar se as estruturas do programa Tem por função verificar se as estruturas do programa irão fazer sentido durante a execução.
irão fazer sentido durante a execução. Exemplos:
Exemplos:
-Verifica se um identificador declarado como variável é utilizado para tal;
-Verifica se existe compatibilidade entre os operandos e operadores em expressões;
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Análises Sintáticas e Semânticas:
As regras gramaticais que definem as construções da As regras gramaticais que definem as construções da linguagem podem ser descritas através de PRODUÇÕES linguagem podem ser descritas através de PRODUÇÕES (regras que produzem, geram) cujos elementos incluem (regras que produzem, geram) cujos elementos incluem SÍMBOLOS TERMINAIS (Fazem parte do código fonte) e SÍMBOLOS TERMINAIS (Fazem parte do código fonte) e SÍMBOLOS NÃO-TERMINAIS (geram outras regras).
SÍMBOLOS NÃO-TERMINAIS (geram outras regras).
No exemplo que segue, as produções são apresentadas na Forma Normal de No exemplo que segue, as produções são apresentadas na Forma Normal de Backus (Backus Naur Form ou BNF)
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Símbolos terminais = Negrito
Símbolos não-terminais = delimitados por “<“ e “>”; PRODUÇÕES BNF
<comando> <while> | <atrib> | ...
<while> while <expr_bool> do <comando> <atrib> <variavel> := <expr_arit>
<expr_bool> <expr_arit> < <expr_arit>
<expr_arit> <expr_arit> + <termo> | <termo> <termo> <numero> | <variavel>
<variavel> I | J <numero> 100
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
<comando> <while>
while <expr_bool> do <comando>
<expr_arit> < <expr_arit> <atrib>
<termo> <termo> <variavel> := <expr_arit>
<variavel> <numero> I <expr_arit> + <termo>
I 100 <termo> <variavel>
<variavel> I
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Geração de Código Intermediário:
Esta fase utiliza a representação interna produzida Esta fase utiliza a representação interna produzida pelo analisador sintático e gera como saída uma pelo analisador sintático e gera como saída uma sequência de código.
sequência de código.
Esse código pode, eventualmente , ser o código objeto Esse código pode, eventualmente , ser o código objeto final mas, na maioria das vezes, constitui-se num código
final mas, na maioria das vezes, constitui-se num código
intermediário, pois a tradução de código fonte para
intermediário, pois a tradução de código fonte para
objeto em mais de um passo apresenta algumas
objeto em mais de um passo apresenta algumas
vantagens.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Vantagens da tradução em mais de um passo:
-Possibilita a otimização de modo a obter-se o código
-Possibilita a otimização de modo a obter-se o código
objeto final mais eficiente;
objeto final mais eficiente;
-Resolve, gradualmente, as dificuldades de passagem de
-Resolve, gradualmente, as dificuldades de passagem de
código de alto nível para baixo nível;
código de alto nível para baixo nível;
A geração de Cod. Interm. pode estar distribuído nas
A geração de Cod. Interm. pode estar distribuído nas
fases anteriores OU mesmo NÃO EXISTIR no caso da
fases anteriores OU mesmo NÃO EXISTIR no caso da
tradução direta para o código objeto, quando o tradutor é
tradução direta para o código objeto, quando o tradutor é
bem simples.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Código Intermediário e o Código Objeto Final:
A grande diferença é que o Código Intermediário não A grande diferença é que o Código Intermediário não especifica detalhes, tais como quais registradores serão
especifica detalhes, tais como quais registradores serão
usados, quais endereços de memória serão
usados, quais endereços de memória serão
referenciados, etc...
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Exemplo de Código Intermediário :
PROGRAMA FONTE PASCAL
While I < 100 do I := J + I; While I < 100 do I := J + I;
PROGRAMA CÓDIGO INTERMEDIÁRIO
L0 if I < 100 goto L1 L0 if I < 100 goto L1 goto L2goto L2 L1 TEMP := J + I L1 TEMP := J + I
I:= TEMPI:= TEMP
goto L0goto L0 L2 ...
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Otimização de Código:
Esta fase tem por objetivo otimizar o código Esta fase tem por objetivo otimizar o código intermediário em termos de velocidade de execução e intermediário em termos de velocidade de execução e espaço de memória.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Exemplo de Código Otimizado :
CÓDIGO INTERMEDIÁRIO L0 if I < 100 goto L1 L0 if I < 100 goto L1 goto L2goto L2 L1 TEMP := J + I L1 TEMP := J + I I := TEMPI := TEMP goto L0goto L0 L2 ... L2 ... CÓDIGO OTIMIZADO L0 if I >= 100 goto L2 L0 if I >= 100 goto L2 I := J + II := J + I goto L0goto L0 L2 ... L2 ...
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Geração de Código Objeto:
Esta fase tem por objetivos: Produção de código Esta fase tem por objetivos: Produção de código objeto, reserva de memória para constantes e variáveis, objeto, reserva de memória para constantes e variáveis, seleção de registradores, etc.
seleção de registradores, etc.
É a fase mais difícil, pois requer uma seleção cuidadosa das instruções e dos registradores da máquina alvo a fim de produzir código objeto eficiente.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Exemplo de Código Objeto:
CÓDIGO OBJETO L0 MOV AX, I CMP AX, 100 JGE L2 MOV AX, J MOV BX, I ADD BX MOV I, AX L2 ... CÓDIGO INTERMEDIÁRIO OTIMIZADO L0 if I >= 100 goto L2 L0 if I >= 100 goto L2 I := J + II := J + I goto L0goto L0 L2 ... L2 ...
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Gerência de tabelas:
Este módulo compreende um conjunto de tabelas e Este módulo compreende um conjunto de tabelas e rotinas associadas que são utilizadas por quase todas as rotinas associadas que são utilizadas por quase todas as fases do tradutor.
fases do tradutor.
Algumas tabelas são fixas para cada linguagem, por exemplo, a tabela de palavras reservadas, tabela de delimitadores, tabela de símbolos, etc...
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Estrutura das tabelas:
A estrutura que possui importância fundamental é A estrutura que possui importância fundamental é aquela que é montada durante a análise do programa aquela que é montada durante a análise do programa fonte, com informações sobre:
fonte, com informações sobre:
-Declaração de variáveis;
-Declaração dos procedimentos ou subrotinas; -Parâmetros de sub-rotinas; etc;
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Estrutura das tabelas:
Essas informações são armazenadas na Tabela de Tabela de Símbolos
Símbolos.
-A cada ocorrência de um identificador no programa fonte, a tabela é acessada, e o identificador é procurado na tabela. Quando encontrado, as informações associadas a ele são comparadas com as informações obtidas no programa fonte, sendo que qualquer nova informação é inserida na Tabela.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Característica da Tabela de Símbolos:
Deve ser estruturada de uma forma tal que permita Deve ser estruturada de uma forma tal que permita rápida inserção e extração de informações, porém deve rápida inserção e extração de informações, porém deve ser tão compacta quanto possível
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Atendimento a erros:
Este módulo tem por objetivo “tratar os erros” que Este módulo tem por objetivo “tratar os erros” que são detectados em todas as fases de análise do são detectados em todas as fases de análise do programa fonte.
programa fonte.
Qualquer fase analítica deve prosseguir em sua análise ainda que erros tenham sido detectados
É fundamental que o tradutor prossiga na tradução, após a detecção de erros, de modo que o texto seja totalmente analisado.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Geradores de Compiladores:
Atualmente a implementação de linguagens de Atualmente a implementação de linguagens de programação é apoiada por sistemas geradores de programação é apoiada por sistemas geradores de compiladores (compiler-compilers, compiler generators, compiladores (compiler-compilers, compiler generators, translator-writing systems).
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Classificação dos grupos:
• Geradores de analisadores léxicosGeradores de analisadores léxicos
• Geradores de analisadores sintáticosGeradores de analisadores sintáticos
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Geradores de analisadores léxicos:
• Geram automaticamente reconhecedores para Geram automaticamente reconhecedores para símbolos léxicos a partir de especificações de gramáticas símbolos léxicos a partir de especificações de gramáticas ou expressões regulares.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Geradores de analisadores sintáticos:
• Produzem reconhecedores sintáticos a partir de Produzem reconhecedores sintáticos a partir de gramáticas livres de contexto.
Tradução de Linguagens de Programação
Tradução de Linguagens de Programação
Geradores de geradores de código:
• recebem como entrada regras que definem a recebem como entrada regras que definem a tradução de cada operação da linguagem intermediária tradução de cada operação da linguagem intermediária para a linguagem de máquina.
Atividade
Atividade
Responder o questionário da atividade 01.