Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
compiladores interpretadores montadores filtros pr-processadores carregadores linkers compilador cruzado (cross-compiler) auto-compilvel (bootstraping) auto-resident compiler compilers (ou translator writing systems ou compiler generators)
estrutura de um compilador formas de organizao de um compilador processo de execuo de uma linguagem de alto-nvel
LR(K)
Linha do Tempo
54-57 Compilador Fortran
LL(K)
Histrico
Inicialmente os programas eram escritos em cdigo de mquina (computadores tinham pouca memria)
Temor: que fosse impossvel ou que o cdigo objeto fosse to ineficiente a ponto de ser intil!
Histrico
Primeira Linguagem de alto nvel (Fortran) e seu compilador, graas a Backus, entre 1954 e 1957
Muito esforo, pois grande parte dos processos de traduo ainda no eram entendidos naquele tempo, Entretanto com relao a otimizao de cdigo estava a frente no seu tempo.
Chomsky inicia estudos da estrutura da linguagem natural (ingls) no fim dos 50 incio dos 60s
Determinao de algoritmos eficientes para reconhecer gramticas livres de contexto: 1960 e 1970.
Embora tratem de um subconjunto das GLC, as gramticas determinsticas LL(K) e LR(K) so capazes de representar todas as linguagens de programao, sintaticamente.
4
Histrico
Vantagens da separao entre reconhecimento de tokens de uma linguagem e suas regras (sintaxe) levou ao uso de mtodos para expressar os tokens (uso de autmatos finitos e expresses regulares) O estudo dos autmatos finitos e ER Geradores de analisadores lxicos (Lex unix em 1975)
Histrico
Com uma maior compreenso da anlise sinttica surgiram mtodos para automatizar partes do desenvolvimento de compiladores
Geradores de analisadores sintticos (YACC unix em 1975), que so usados para gerar compiladores Vejam outros em: http://catalog.compilertools.net/
Dcada de 70 e 80 houve projetos para automatizar a gerao de outras partes do compilador (gerao de cdigo) Um exemplo o BEG (back end generator - http://www.hei.biz/beg/)
BEG was used to produce an industrial compiler family for C, Modula-2, Fortran-77, and Pascal, for the SPARC processors.
mas a maioria dos cc so na verdade parser generators com a possibilidade de incluir cdigo para A. Semntica e Gerao. Veja: http://en.wikipedia.org/wiki/Comparison_of_parser_generators
6
Compilador
Linguagem Fonte
tradutor
Compilador um tradutor que transforma automaticamente uma linguagem de programao de alto nvel para alguma outra forma que viabilize sua execuo. E sai de cena. Um tempo depois o usurio pede ao SO para rodar o programa.
Linguagem de programao de alto nvel
Compilador
Mensagens de erros estticos e gerao de cdigo para os dinmicos
Resumo
O compilador controla o processo durante a compilao, o programa objeto tem o controle durante a execuo. Esta caracterstica ser diferente nas duas outras formas de implementao de linguagens de alto nvel: a interpretao pura e o modelo hbrido. 8
Tarefas
Deve transformar a L.F. em uma L.A. equivalente Deve informar os erros do programa fonte, caso existam Permite que os programas sejam independentes de mquina (portabilidade)
Principal: gere cdigo corretamente Seja capaz de tratar de programas de qualquer tamanho que a memria permita Velocidade da compilao no a caracterstica principal Tamanho do compilador j no mais um problema atualmente User-friendliness se mede pela qualidade das mensagens de erros A importncia da velocidade e tamanho do cdigo gerado depende do propsito do compilador --- velocidade do cdigo vem em primeiro lugar
10
Tecnologia de Compiladores
Os primeiros compiladores foram construdos ad hoc, sem tcnicas, eram vistos como processos complexos e de alto custo
Hoje, o processo bem entendido, sendo a construo de um compilador uma rotina, embora a construo de um compilador eficiente e confivel seja ainda uma tarefa complexa.
11
Tecnologia de Compiladores
linguagens de formatao de textos (nroff, troff, latex, sgml) silicon compilers que transformam uma linguagem de especificao de circuitos VLSI em um projeto de circuitos linguagens de acesso a banco de dados (query languages) editores de texto orientados a sintaxe analisadores estticos de programa que podem descobrir variveis no inicializadas, cdigo que nunca ser executado, etc. checadores de entrada de dados em qualquer sistema interpretadores de comandos de um S.O.
12
13
Os compiladores podem ser distinguidos de acordo com o tipo de linguagem objeto que eles geram:
Cdigo de Mquina Puro: geram cdigo para um conjunto de instruo de mquina sem assumir a existncia de rotinas do SO ou rotinas de biblioteca. Isto quer dizer que o compilador no est contando com nenhum ambiente de execuo Esta abordagem rara e utilizada para implementar as linguagens que sero utilizadas para escrever o SO e outros programas de baixo nvel. Cdigo de Mquina Aumentado: gerao de cdigo para uma arquitetura aumentada com as rotinas do SO (salvar registradores, acessar BIOS) e de suporte linguagem (I/O, alocao dinmica, e funes matemticas) que devem ser carregadas com o programa. A combinao de cdigo de mquina do compilador + rotinas do SO + rotinas de suporte chamada Mquina Virtual. Esta abordagem mais freqente.
14
Cdigo de Mquina Virtual: caso extremo de definio de uma mquina virtual em que o cdigo gerado composto inteiramente de instrues virtuais: gerao para uma mquina hipottica. Existe um interpretador que roda sobre o hardware fsico e emula o hardware de um projeto diferente. Abordagem atrativa pela facilidade de transportar para mquinas diferentes. Se a mquina virtual simples, escrever um interpretador tarefa fcil (geralmente a escolha para um compilador didtico) Exemplo: Pascal P-Compiler
15
Compiladores tambm podem ser distinguidos pelo formato do cdigo objeto que eles geram:
Linguagem Assembly (Montagem): esta abordagem simplifica a traduo pois vrias decises so deixadas para o montador (endereo de jumps, por exemplo).
Esta abordagem no comum, pois precisa de um passo adicional feito pelo montador, que lento. Algumas vezes o cdigo em assembly um produto extra de alguns compiladores (psedoassembly languages) para checagem de corretude.
Pode-se checar a sada e verificar a corretude (assembly mais legvel). til para cross-compilers (compilador que roda em uma mquina e gera cdigo para outra) pois gera um arquivo facilmente transportvel.
Cdigo Binrio Relocvel: cdigo em que as referncias externas e endereos de memria no esto decididos (so endereos simblicos).
Um passo extra de link-edio (link-editor) necessrio para adicionar as rotinas de biblioteca e outras rotinas pr-compiladas (.obj) que so referenciadas dentro do programa compilado, e assim produzir o cdigo binrio absoluto. (Permite compilao independente). 16
Imagem de Memria (Load-and-Go): a sada do compilador carregada diretamente na memria e executada ao invs de ser deixada em um arquivo.
Esta abordagem rpida pois no exige link-edio, mas o programa deve ser recompilado a cada execuo. Por ser mais rpido til para a fase de depurao e uso de estudantes novatos. Exemplo: Turbo Pascal.
17
Interpretao Pura
Programas so interpretados por outro programa (interpretador)
Sistemas Hbridos
Oferecem um compromisso entre compiladores e interpretadores puros
18
Compilador
Interpretador
Diferente do compilador, o interpretador fica durante a execuo do programa: ele tem o controle. O interpretador implementa uma mquina virtual, cuja linguagem a linguagem de alto nvel. L comandos nesta linguagem, executa um por vez e continua. Execuo lenta (10 a 100 vezes mais lento que programas compilados), mas fornece melhor mensagens de erros (pode incluir timos debugadores. Atualmente raro para as linguagens tradicionais, mas est havendo um retorno com as linguagens de script para a Web (por exemplo, 20 JavaScript, PHP)
Sistemas Hbridos
H a traduo para uma linguagem intermediria para facilitar a interpretao. Aqui a linguagem intermediria bem diferente da lnguagem fonte. Quando o tradutor inicial simples, dizemos que a linguagem interpretada, quando complexo, que o modelo hbrido. Mais rpido que interpretao pura Exemplos: Programas Perl so compilados parcialmente para detectar erros antes da interpretao.
Implementaes iniciais de Java foram hbridas; o cdigo intermedirio, byte code, fornece portabilidade para qualquer mquina que tenha um interpretador de byte code e um ambiente de execuo (juntos, so Machine) chamados de Java Virtual 21
Interpretador de Bytecodes
Mquina Virtual
Montador
Linguagem de mquina
Filtro
Lf no preparada (extenses)
Pr-processador
Lf preparada
Compilador
Compilador cruzado roda em uma mquina e produz cdigo para outra. Compilador auto-residente (ou nativo) executado na mesma mquina para qual gerou cdigo objeto.
Em: http://en.wikipedia.org/wiki/Bootstrapping_(compilers):
A large proportion of programming languages are bootstrapped, including BASIC, C, Pascal, Factor, Haskell, Modula2, Oberon, OCaml, Common Lisp, Scheme, Python and more.
Compilador auto-compilvel. Porque algum faria um compilador para uma linguagem sendo implementado nela prpria????
Auto-compilvel
H vantagens? Facilita o transporte de uma mquina para outra. Suponha que queremos uma linguagem L para as mquinas A e B.
1o. Passo: C
S A A
Pode ser escrito numa linguagem aceita por A, assembly por exemplo
26
2o. Passo: C
L A S
L A S
S A A
L A A
L B B
L B L
do que escrever um outro compilador (s temos que mudar a gerao de cdigo). Processo em dois passos: C
ou L B L
C C
L A A
L B L
L B A
L B B
L B A
L B S
27
Compiler Compilers
geradores de analisadores lxicos (LEX, por exemplo) geradores de analisadores sintticos (YACC, por exemplo, possui tambm chamadas de rotinas para as aes semnticas e gerao de cdigo) Geradores de cdigo (recebem uma representao intermediria - abstract syntax trees to graph-based intermediate representations - e uma descrio da mquina alvo)
Ambiente de Execuo
Infra-estrutura com que o programa objeto conta para sua correta execuo: uma interface com o SO um conjunto de rotinas que deixam disponveis os recursos oferecidos pela linguagem (rotinas aritmticas, trigonomtricas, pacotes grficos, etc.) um conjunto de procedimentos de manuteno do ambiente: gerenciamento de memria, da passagem de parmetros, do controle da recursividade, etc.
29
Pascal P-Compiler
Escrito por um grupo encabeado por N. Wirth. Este compilador gera cdigo chamado P-Code para uma mquina virtual pilha . Problema: a velocidade era 4 vezes menor que o cdigo compilado, mas podemos traduzir o P-Code para um cdigo de mquina real. Este mtodo difundiu o Pascal (Pascal UCSD) e o tornou disponvel para uma grande variedade de mquinas.
http://en.wikipedia.org/wiki/P-Code
30
Stack Machine
Register Machine
No passado mquinas a pilha reservavam uma parte da memria principal para avaliar expresses. Esta implementao era mais lenta que o uso de registradores pois requer muitas referncias memria principal. Mquinas como Lilith, Burroughs e HP usam um pequeno array de registradores rpidos para implementar a pilha de expresses. Uma mquina a pilha pode ser mais rpida do que mquinas baseadas em registradores, pois necessitam de poucas instrues. Atende bem linguagens com procedimentos recursivos, pois seu uso est intimamente relacionado ao uso de pilhas. Mquinas a pilha suportam efetivamente linguagens de alto nvel estruturadas por blocos (proc. e funes).
31
b:= a + 2
MOV a, R1 ADD #2, R1 MOV R1, b
linguagem de alto nvel compilador gera cdigo assembly Pode ser carregado a partir de uma posio L de memria assembler/compilador gera cdigo de mquina relocvel 00 00000000 * 10 00000010 * bit de relocao, associado 00 00000100 * a cada operando no cod. relocvel acesso direto link editor gera cdigo de mquina absoluto acesso imediato e escolheu L = 15 end. de a (15) end. de b (19) Tabela de smbolos do montador a 0 b 4
32
01 01 01 R1
Montador
Programa-fonte
(linguagem de alto nvel)
Compilador
Programa-objeto
(linguagem de mquina relocvel)
Programa-objeto
(linguagem de mquina absoluta)
Bibliotecas do usurio
33
Back-end (Sntese)
Tratamento de Erros
Tabelas
Anlise sinttica
parser
estrutura sinttica
semantic routines
Anlise semntica
Tratamento de erros
Gerador de cdigo
Prog. objeto
35
Anlise Lxica: responsvel por ler o arquivo em que est armazenado o programa fonte (da esquerda para a direita) e por reconhecer os tokens (ou itens lxicos) e lhes dar um rtulo:
Palavras reservadas: begin, if, var, ... s_begin, s_if, s_var, ... Identificadores: X, Y, Z, integer, boolean... id id id id id Smbolos simples e compostos: ; , := + .. s_; s_, s:= s_+ Constantes:
Esses rtulos so usados na formao das regras sintticas e alguns tokens podem ser inseridos na Tabela de Smbolos Deve tambm reportar ao usurio a ocorrncia de erros lxicos:
inteiras e reais: 23 23.4 n_int n_real caracteres e strings: a compiladores caractere cadeia lgicas: true, false id id
fim inesperado de arquivo, mal formao de constantes (inteiras, reais, lgicas, literais), caracteres no permitidos no vocabulrio terminal da linguagem.
36
Anlise Sinttica: responsvel por processar os tokens at reconhecer uma regra sinttica que, posteriormente ser analisada semanticamente, dado que a gramtica livre de contexto.
Deve tambm reportar ao usurio a ocorrncia de erros sintticos: then esperado, ) esperado
37
Anlise Semntica =
Anlise de contexto + Checagem de tipos + Bookkeeping (gerenciamento da Tabela de Smbolos) + Gerao de Cdigo Intermedirio (RI)
As rotinas semnticas podem gerar alguma RI do programa ou gerar diretamente cdigo objeto. Devem reportar os erros de contexto e de tipos:
varivel no declarada, nmero de parmetros reais no bate com o nmero de parmetros formais, tipo inteiro esperado, incompatibilidade de tipos, etc.
Se uma RI gerada, ento ela serve como entrada ao gerador de cdigo para produzir um programa em linguagem de mquina ou montagem. A RI pode, opcionalmente, ser transformada por um otimizador global para que um cdigo de mquina mais eficiente seja gerado.
38
eliminao de clculos repetidos dentro de malhas trazendo-se para fora do loop. Eliminao de sub-expresses iguais:
A := B + C + D E := B + C + F T1 := B + C A := T1 + D E := T1 + F
Gerao de Cdigo: gera cdigo relocvel, absoluto ou de montagem. O. Local: melhorias no cdigo objeto.
39
As vrias fases de um compilador podem ser executadas em seqncia ou ter sua execuo combinada: Compilao em Vrios Passos: A execuo de algumas fases terminam antes de iniciar a execuo das fases seguintes.
Possibilidades de Organizao
Todas as fases so intercaladas, nenhuma RI gerada. Quando as linguagens permitem o comando: goto rtulo .... rtulo Alguns compiladores deixam a informao de endereo em branco e s a preenchem quando encontram o endereo. Esta tcnica se chama backpatching (remendo) O otimizador toma o cdigo de mquina gerado e olhando somente umas poucas instrues por vez melhora tal cdigo.
41
Um nico passo para Anlise e Sntese da RI mais um passo para a Gerao de Cdigo
Nestas duas opes algumas fases terminam antes de outras. Existe o aumento do tempo de compilao, pois os dados podem ser guardados em arquivos. Como vantagem temos a possibilidade de gerar verdadeiras otimizaes no cdigo gerado ou na RI. 42
Nosso Projeto
Notao EBNF para as regras da GLC vai definir os programas gramaticalmente corretos. Uso de uma ferramenta para gerar parser + analisador lxico: JavaCC. Semntica Esttica (de tempo de Compilao) ser fornecida oportunamente (ser implementada no P3). Gerao para a linguagem MEPA tambm ser fornecida oportunamente (P2 e P4) Compilador de um Passo: todas as fases entrelaadas; compilador dirigido por sintaxe (programa principal).
43