IF 688 Teoria e Implementao de Linguagens Computacionais
- Slides: 36
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. 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 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 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 destino e na base a linguagem de implementação.
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 • Hoje, compiladores podem ser desenvolvidos com bem mais facilidade – Geradores de código disponíveis
ORGANIZAÇÃO DE UM COMPILADOR
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 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 – 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 C# Front-end código intermediário Back-end ARM Back-end x 86 Back-end. NET MIPS
ANÁLISE
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 chamadas tokens • Os tokens são consumidos na fase seguinte (parsing)
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 regulares (ERs).
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 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 - … … 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 sintática) que representa a estrutura gramatical do programa
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>, <+>, <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 é 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 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 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 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
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 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 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, 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 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 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 • 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. , 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!
- Sistema computacionais
- Tarzan who weighs 688 n
- 688 class submarine list
- Solicitud de licencia articulo 114 y 115 decreto 688/93
- Financial data systems wrightsville beach nc
- Tarzan che pesa 688 n
- Tarzan che pesa 688 n
- Sitio jerimum enem 2017
- Slides cmsp
- Tipos de linguagem
- Erikson teoria de la personalidad
- Biografia de wanda horta
- Adam smith divisione del lavoro
- Teoria das estruturas
- Teoria personalista
- Teoria del legame di valenza zanichelli
- El comportamiento administrativo
- Modelo de aprendizaje social de krumboltz
- Teoria de angulos
- Teoria del legame di valenza
- Mol
- Teoria tunica corpus
- Teoria della pace democratica
- Teoria de la comunicacion jakobson
- Postulado de planck
- Tilannejohtaminen
- Teoria underfill y overflow
- Teoria geocentrica
- Teoría de lacan
- Teoria del triangulo invertido
- Teoria humanista de la motivacion
- Teoria del rizoma
- Stephen krashen metodo
- Definicin
- Frederick winslow taylor la direzione di stabilimento
- Chester barnard teoria
- Teoria e storia della traduzione