Sei sulla pagina 1di 43

Breve Histrico & Conceitos Bsicos

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)

60-70: parsers eficientes para GLC

70 e 80: automatiza o de outras partes do compilador

40: Computador de Programa Armazenado

Incio 60: Hierarquia das gramticas formais de Chomsky

1975: Geradores de analisadores lxicos e sintticos LEX e YACC

Histrico

Computador de programa armazenado (von Neumann) final da dcada de 40

Inicialmente os programas eram escritos em cdigo de mquina (computadores tinham pouca memria)

Linguagem de montagem para facilitar a programao

Necessidade de um programa (montador) para traduzir para cdigo de mquina

Prximo passo: linguagem de alto nvel

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

Complexidade das gramticas e os algoritmos para reconhec-las: tipo 0, 1, 2, 3.

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

Linguagem Alvo (Objeto)

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

Linguagem de mquina, ou Linguagem assembly, Cdigo de uma mquina virtual

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)

Propriedades de um bom compilador

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

A tecnologia de compiladores largamente empregada em muitas reas:


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

Formas de Classificar Compiladores

De acordo com o tipo de linguagem objeto gerado

De acordo com o formato do cdigo objeto gerado

13

Alternativas para a sada de um compilador (1/4)

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

Alternativas para a sada de um compilador (2/4)

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

Alternativas para a sada de um compilador (3/4)

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

Alternativas para a sada de um compilador (4/4)


O cdigo relocvel e o cdigo assembly permitem compilao modular, interfaces com outras linguagens (cross-languages references, isto , chamadas de rotinas em assembly ou em outras linguagens de alto nvel -- Amzi Prolog) e rotinas de biblioteca.

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

Mtodos de Implementao de Linguagens de Alto Nvel


Compilao
Programas so traduzidos em linguagem de mquina

Interpretao Pura
Programas so interpretados por outro programa (interpretador)

Sistemas Hbridos
Oferecem um compromisso entre compiladores e interpretadores puros
18

Compilador

Traduo lenta Execuo rpida


19

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

O conceito no novo...Pascal P-code difundiu a linguagem Pascal


22

Compilador Just in Time


Une bytecodes com compilao dinmica Traduz inicialmente para uma linguagem intermediria (bytecode) Ento compila a linguagem intermediria dos subprogramas em cdigo de mquina nativa quando eles so chamados (tempo de execuo) para executar na mquina nativa Este cdigo mantido para chamadas subsequentes
Sistemas JIT so muito usados para Java e C# (produz .NET CIL que pode ser usada por vrios front-ends. 23

Montadores, Filtros, e Prprocessadores


Linguagem de montagem

Montador

Linguagem de mquina

Linguagem de alto nvel (dialeto do Algol)

Filtro

Linguagem de alto nvel muito semelhante Lf (Algol 60)

Lf no preparada (extenses)

Pr-processador

Lf preparada

Compilador

Processamento de macros, incluso de arquivos


24

Compilador cruzado, auto-residente, auto-compilvel C LF LO


LD

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????

Lisp foi a primeira linguagem a ter um em 1962


25

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

Agora suponha que desejamos ter C Como temos C


L A S

L B B

fica mais fcil convert-lo em C

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

compilador cruzado para A

27

Compiler Compilers

Ferramentas para auxiliar o desenvolvimento de compiladores:

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)

Um exemplo o BEG (back end generator - http://www.hei.biz/beg/)

sistemas complexos que produzem o compilador inteiro (toolkit)


Vejam outros em: http://catalog.compilertools.net/ http://www.thefreecountry.com/programming/compilerconstruction.shtml


28

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

Exemplo de Cdigo Binrio Relocvel


Duas classes de instrues precisam de mais informaes:
referncias a endereos de variveis e funes externas. referncias a endereos de memria, por exemplo:

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

0001 0011 0010 cod.

01 01 01 R1

0001 0011 0010

01 00 00001111 01 10 00000010 01 00 00010011

Execuo de linguagens Programa-objeto de alto nvel (linguagem de


montagem)

Montador

Programa-fonte
(linguagem de alto nvel)

Compilador

Programa-objeto Interpretador direto Resultados de execuo Hardware


(linguagem intermediria)

Programa-objeto
(linguagem de mquina relocvel)

Programa-objeto
(linguagem de mquina absoluta)

Interpretador de linguagem intermediria

Tradutor de linguagem intermediria

Carregador e ligador Bibliotecas do sistema

Bibliotecas do usurio

33

estrutura conceitual de um compilador (1)


Fases da Anlise: A Lxica, A Sinttica, A Semntica
txt Programa fonte Front-end (Anlise)
Representao Intermediria

Back-end (Sntese)

exe Programa objeto

Tratamento de Erros

Tabelas

Fases da Sntese: Otimizao Global, Gerao de Cdigo, Otimizao Local


34

estrutura conceitual de um compilador (2)


Prog. fonte (cadeia de caracteres) Anlise lxica
scanner tokens

Anlise sinttica
parser

estrutura sinttica

semantic routines

Anlise semntica

representao Intermediria (RI)

Tabela de smbolos e atributos


usada em todas as fases da compilao

Tratamento de erros

Otimizador global global optimization


code generator

Gerador de cdigo

peephole Otimizador optimization local

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.

Pode ou no gerar uma estrutura sinttica. Em muitos casos s aceita ou o programa.

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

O. Global: melhorias que, em geral, independem da linguagem de mquina. Por exemplo:

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

formas de organizao de um compilador

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.

Vantagem: possibilidade de otimizaes no cdigo Desvantagem: aumento do Tempo de Compilao

Compilao de um Passo: O programa-objeto produzido medida que o programa-fonte processado.


Vantagem: eficincia Desvantagem: dificuldade de introduo de otimizaes


40

Possibilidades de Organizao

Um nico passo para Anlise e Sntese

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.

nico passo + Peephole Optimization (local)

41

Um nico passo para Anlise e Sntese da RI mais um passo para a Gerao de Cdigo

O front-end independente de mquina. Facilidade para portar

Vrios passos para a Anlise Vrios passos para a Sntese

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

Potrebbero piacerti anche