IF 688 Teoria e Implementao de Linguagens Computacionais

  • Slides: 36
Download presentation
IF 688 – Teoria e Implementação de Linguagens Computacionais COMPILADORES – INTRODUÇÃO Marcelo d’Amorim

IF 688 – Teoria e Implementação de Linguagens Computacionais COMPILADORES – INTRODUÇÃO Marcelo d’Amorim

Página da disciplina http: //www. cin. ufpe. br/~if 688 Todo material da disciplina (e.

Página da disciplina http: //www. cin. ufpe. br/~if 688 Todo material da disciplina (e. g. , slides, cronograma de aulas, etc. ) está disponível nesta página! • Requisitos – Linguagem de programação – Linguagens formais e autômatos

Definição de um compilador • Tradutor de uma linguagem mais abstrata (origem) para uma

Definição de um compilador • Tradutor de uma linguagem mais abstrata (origem) para uma mais concreta (destino) public class Hello. World { public static void main(String[] args) { System. out. println("Hello"); }} javac javap public class Hello. World extends java. lang. Object{ public Hello. World(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object. "<init>": ()V 4: return public static void main(java. lang. String[]); Code: 0: getstatic #2; //Field java/lang/System. out: Ljava/io/Print. Stream; 3: ldc #3; //String Hello 5: invokevirtual #4; //Method java/io/Print. Stream. println: (Ljava/lang/String; )V 8: return }

Se um compilador é um tradutor de uma linguagem mais abstrata para uma mais

Se um compilador é um tradutor de uma linguagem mais abstrata para uma mais concreta. . . Onde termina a tradução? • Tradução termina no hardware – Bootstrapping é o processo de tradução para a máquina mais concreta • Cada camada acima caracteriza uma máquina abstrata

Diagrama de “Tombstone” Símbolo à esquerda define linguagem origem. Símbolo à direita define linguagem

Diagrama de “Tombstone” Símbolo à esquerda define linguagem origem. Símbolo à direita define linguagem destino e na base a linguagem de implementação.

Para que serve um compilador? • Diminuir esforço humano – Checar certos tipos de

Para que serve um compilador? • Diminuir esforço humano – Checar certos tipos de erros automaticamente – Gerar código portável – Otimizar código • velocidade, tamanho, energia, etc.

Histórico • Nos anos 50, compiladores eram programas notadamente difíceis de se escrever •

Histórico • Nos anos 50, compiladores eram programas notadamente difíceis de se escrever • Hoje, compiladores podem ser desenvolvidos com bem mais facilidade – Geradores de código disponíveis

ORGANIZAÇÃO DE UM COMPILADOR

ORGANIZAÇÃO DE UM COMPILADOR

Compilador, interpretador, e VM Entrada Pgm. Origem Compilador Pgm. Destino Interpretador Saída Entrada Pgm.

Compilador, interpretador, e VM Entrada Pgm. Origem Compilador Pgm. Destino Interpretador Saída Entrada Pgm. Origem Pgm. Destino Compilador VM Saída

Processo de compilação Programa fonte pre-processador Programa fonte modificado assembler Código objeto (relocável) linker-loader

Processo de compilação Programa fonte pre-processador Programa fonte modificado assembler Código objeto (relocável) linker-loader compilador Programa em assembler Bibliotecas / código objeto Código objeto (executável)

Compilação envolve duas etapas • Análise (front-end) – Cria representações intermediárias do programa –

Compilação envolve duas etapas • Análise (front-end) – Cria representações intermediárias do programa – Verifica presença de certos tipos de erro • Síntese (back-end) – Constrói o programa destino a partir de representações intermediárias

Separação entre front-end e back-end para criação de múltiplos compiladores C Pascal Fortran Front-end

Separação entre front-end e back-end para criação de múltiplos compiladores C Pascal Fortran Front-end C# Front-end código intermediário Back-end ARM Back-end x 86 Back-end. NET MIPS

ANÁLISE

ANÁLISE

Análise do programa fonte • Análise léxica – Organiza caracteres de entrada em grupos,

Análise do programa fonte • Análise léxica – Organiza caracteres de entrada em grupos, chamados tokens • Análise sintática – Organiza tokens em uma estrutura hierárquica • Análise semântica – Checa se o programa respeita regras básicas de consistência

Análise léxica (scanning) • Lê os caracteres de entrada e os agrupa em sequências

Análise léxica (scanning) • Lê os caracteres de entrada e os agrupa em sequências chamadas tokens • Os tokens são consumidos na fase seguinte (parsing)

Exemplo position = initial + rate * 60 Analisador Léxico <identificador, 1>, <=>, <identificador,

Exemplo position = initial + rate * 60 Analisador Léxico <identificador, 1>, <=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <number, 60> nome Tabela de Símbolos tipo 1 position - 2 initial - 3 rate - … …

Exemplo Analisador Léxico O projetista do compilador caracteriza o analisador léxico através de expressões

Exemplo Analisador Léxico O projetista do compilador caracteriza o analisador léxico através de expressões regulares (ERs).

Exemplo Analisador Léxico A geração do analisador léxico é automática a partir da definição

Exemplo Analisador Léxico A geração do analisador léxico é automática a partir da definição das ERs. Ver: FLEX, JLex, etc.

Tabela de símbolos • Estrutura de dados usada para guardar identificadores e informações sobre

Tabela de símbolos • Estrutura de dados usada para guardar identificadores e informações sobre eles. • Por exemplo: – tipo do identificador – escopo: onde o identificador é válido no programa – se for um procedimento ou função: número e tipo dos argumentos, forma de passagem dos parâmetros e tipo do resultado.

Tabela de símbolos nome tipo 1 position - 2 initial - 3 rate -

Tabela de símbolos nome tipo 1 position - 2 initial - 3 rate - … … Usada e atualizada em várias etapas da compilação.

Análise sintática (parsing) • A partir dos tokens cria uma estrutura em árvore (árvore

Análise sintática (parsing) • A partir dos tokens cria uma estrutura em árvore (árvore sintática) que representa a estrutura gramatical do programa

Exemplo <identificador, 1>, <=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <number, 60> Analisador Sintático

Exemplo <identificador, 1>, <=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <number, 60> Analisador Sintático = + <id, 1> <id, 2> * <id, 3> 60

Exemplo Gramática livre de contexto (BNF) caracteriza a linguagem. <identificador, 1>, <=>, <identificador, 2>,

Exemplo Gramática livre de contexto (BNF) caracteriza a linguagem. <identificador, 1>, <=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <number, 60> Analisador Sintático = + <id, 1> <id, 2> * <id, 3> 60

Exemplo livre de a AGramática geração do parser contexto (BNF) partir de uma BNF

Exemplo livre de a AGramática geração do parser contexto (BNF) partir de uma BNF é caracteriza a. Ver automática. linguagem. Bison, JCup, yacc, etc. <identificador, 1>, <=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <number, 60> Analisador Sintático = + <id, 1> <id, 2> * <id, 3> 60

Exemplo livre de a Para cada classe AGramática geração do parser contexto (BNF) gramatical

Exemplo livre de a Para cada classe AGramática geração do parser contexto (BNF) gramatical da. BNFé partir de uma caracteriza a. Ver haverá uma estrutura automática. linguagem. de dados Bison, JCup, yacc, etc. correspondente. <identificador, 1>, <=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <number, 60> Analisador Sintático = + <id, 1> <id, 2> * <id, 3> 60

Análise léxica e sintática hoje Foo. lex JLex Foo. Lexer. java Foo. Lexer. cl

Análise léxica e sintática hoje Foo. lex JLex Foo. Lexer. java Foo. Lexer. cl ass Foo. jcup JCup Foo. Parser. j ava Foo. Parser. c lass Bar. foo

Análise semântica • Procura possíveis erros semânticos e guarda informações contextuais adicionais • Exemplo

Análise semântica • Procura possíveis erros semânticos e guarda informações contextuais adicionais • Exemplo Point p = new Point(1, -2); Circle c = new Circle(p, 5); Erro: Construtor de Circle recebe 3 números com parâmetro.

SÍNTESE

SÍNTESE

Código intermediário (IR) • Representações intermediárias de código facilitam análise e transformação • Exemplo:

Código intermediário (IR) • Representações intermediárias de código facilitam análise e transformação • Exemplo: 3 endereços (MIPS) – cada instrução usa não mais que três operandos

Exemplo: 3 endereços id 1 = id 2 + id 3 * inttofloat(60) t

Exemplo: 3 endereços id 1 = id 2 + id 3 * inttofloat(60) t 1 = inttofloat(60) t 2 = id 3 * t 1 t 3 = id 2 + t 2 id 1 = t 3 Qual a vantagem de se usar tal representação?

Otimização de código • Realiza transformações no código com objetivo de melhorar algum aspecto

Otimização de código • Realiza transformações no código com objetivo de melhorar algum aspecto relevante – tempo de execução, consumo de memória, tamanho do código executável, etc. • Pode ser específico de arquitetura ou geral – Específica: Register allocation – Geral: Constant (folding and) propagation

Específica: Register Allocation • É mais eficiente realizar operações manipulando dados próximos a CPU,

Específica: Register Allocation • É mais eficiente realizar operações manipulando dados próximos a CPU, em registradores • Register Allocation associa cada variável do programa a um registrador com o objetivo de minimizar spilling* t 1 = inttofloat(60) t 2 = id 3 * t 1 t 3 = id 2 + t 2 id 1 = t 3 * Spilling é o processo de descarga e recarga de registradores a partir da memória

Geral: Constant Propagation t 1 = inttofloat(60) t 2 = id 3 * t

Geral: Constant Propagation t 1 = inttofloat(60) t 2 = id 3 * t 1 t 3 = id 2 + t 2 id 1 = t 3 t 2 = id 3 * 60. 0 t 3 = id 2 + t 2 id 1 = t 3

Geração de código • Traduz código intermediário para a linguagem-destino t 2 = id

Geração de código • Traduz código intermediário para a linguagem-destino t 2 = id 3 * 60. 0 id 1 = id 2 + t 2 Gerador de código . . . LDF R 2, id 3 MULF R 2, #60. 0 LDF R 1, id 2 ADDF R 1, R 2 STF id 1, R 1

Estrutura do curso • Análise – Análise Léxica – Análise Sintática – Análise Semântica

Estrutura do curso • Análise – Análise Léxica – Análise Sintática – Análise Semântica • Síntese – Otimização de código – Geração de código – Ambiente de execução

Uso da tecnologia de compiladores • Ferramentas de inspeção de código – E. g.

Uso da tecnologia de compiladores • Ferramentas de inspeção de código – E. g. , Lint and Find. Bugs • Descoberta de erros – E. g. , Coverity and Klockwork • … Você não precisa ser um engenheiro de compiladores para ter interesse na área!