Escolar Documentos
Profissional Documentos
Cultura Documentos
Motivao
Conhecimento das estruturas e algortmos usados na implementao de linguagens: noes importantes sobre uso de memria, eficincia, etc. Aplicabilidade freqente na soluo de problemas que exigem alguma forma de traduo entre linguagens ou notaes. Implementao de linguagens para um domnio especfico. Geradores e analisadores de cdigo.
Motivao
A disciplina de compiladores faz uso de um grande nmero de conceitos estudados em outras disciplinas do curso: linguagens de programao, algortmos, linguagens formais, arquitetura, engenharia de software.
Compilador
Programa que l um programa escrito em uma linguagem (fonte) e o traduz para uma outra linguagem (destino), reportando erros quando eles ocorrem.
Linguagens
Linguagem fonte: C, Pascal, Java, Fortran, etc. Linguagem destino: linguagem de mquina (assembler) de um processador, de uma mquina virtual (e.g. Java ou .NET), ou qualquer outra linguagem (e.g. C).
Execuo de um programa
entrada
Programa destino
sada
Programa fonte
Interpretador
entrada
sada
Compilador Hbrido
Programa fonte
Tradutor
Mquina Virtual
sada
compilador
Programa em assembler
Fases de um compilador
stream de caracteres Analisador lxico stream de tokens Analisador sinttico rvore sinttica Analisador semntico rvore sinttica Ger. de cdigo intermedirio representao intermediria Otimizador de cdigo representao intermediria Gerador de cdigo Cdigo de mquina
Anlise: front-end do compilador (at gerao de cdigo intermedirio) Sntese: back-end do compilador
Exemplo
position = initial + rate * 60
<identificador, 1> <=> <identificador, 2> <+> <identificador, 3> <*> <number, 60>
Tabela de Smbolos
identificador
1 2 3 position initial rate
tipo
rvore Sinttica
position = initial + rate * 60
= <id,1> <id,2>
+
*
<id,3>
60
Anlise semntica
Verifica o programa em relao a possveis erros semnticos e guarda informaes adicionais
Anlise Semntica
= <id,1> <id,2> <id,3> + * inttofloat 60
Cdigo intermedirio
Idealmente deve ser fcil de produzir e tambm de traduzir para a linguagem-destino. Na prtica, se est gerando cdigo para uma mquina abstrata. Por exemplo, Three-address-code: usa trs operandos por instruo, cada um como se fosse um registrador.
Otimizao de cdigo
Realiza transformaes no cdigo visando melhorar sua performance em aspectos de tempo de execuo, uso de memria, tamanho do cdigo executvel etc.
Gerao de cdigo
Realiza a alocao de registradores (se necessria) e a traduo do cdigo intermedirio para a linguagem-destino.
Gerao de cdigo
LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1
Tabela de Smbolos
Estrutura de dados usada para guardar identificadores e informaes sobre eles:
alocao de memria, tipo do identificador, escopo (onde vlido no programa) se for um procedimento ou funo: nmero e tipo dos argumentos, forma de passagem dos parmetros e tipo do resultado.
Tabela de Smbolos
identificador
1 2 3 position initial rate
tipo
C
Front-end Front-end
C#
Front-end
cdigo intermedirio
Back-end
x86
Back-end
C
Front-end Front-end
C#
Front-end
Back-end
Contexto Histrico
Demanda por linguagens de mais alto nvel que linguagem de mquina e assembler. Nos anos 1950, compiladores eram programas notadamente difceis de se escrever. Avano terico e de tcnicas e ferramentas de implementao tornaram possvel implementar compiladores muito mais facilmente.
Classificaes: Geraes
Linguagens de mquina Linguagens de montagem (Assembly languages) Fortran, Cobol, Lisp, C, C++, C#, Java SQL, Postscript (Domain Specific Languages)
Classificaes: Paradigma
Imperativo como Conceito de estado e comandos que mudam o estado C, C++, C#, Java Declarativo o qu ML, Haskell, Prolog
Classificaes
Von Neumann: C, Fortran, Pascal Orientadas a Objetos: Simula 67, Smalltalk, C++, C#, Java, Ruby Scripting Languages: Awk, JavaScript, Perl, PHP, Python, Ruby, Tcl
nomes
locais (variveis)
valores