Você está na página 1de 15

Linguagens e Programao

1 - Introduo aos Compiladores

Ana Madureira
Engenharia Informtica Ano Lectivo: 2011/2012

Tpicos de Discusso:
Linguagens de Programao Linguagens Formais Cdigo Fonte Cdigo Mquina Linguagem fonte/alvo Compiladores Cross-compiler Bootstrapping

Popularidade das Linguagens de Programao

Fonte: TIOBE Programming Community Index for February 2012

Evoluo

Fonte: TIOBE Programming Community Index for February 2012

Tpicos de Discusso:
Linguagens de Programao -Linguagens formais utilizadas na descrio de mecanismos abstractos. Tm como objectivo descrever e comunicar um processo computacional. Linguagens Formais - conjunto de cadeias de smbolos (palavras) de determinado alfabeto. Cdigo Fonte - Linguagens de alto nvel (algortmicas, imperativas, procedimentais, etc..) Cdigo Mquina Linguagem de baixo nvel Compilador - programa, capaz de ler um ficheiro (normalmente de texto) contendo um programa escrito numa dada linguagem de programao e gerar um programa em linguagem alvo equivalente ao programa inicial

Sistema de Computao
Hardware Software
Software de Sistema
Sistema Operativo Software de Linguagens (Tradutores, compiladores,...) Utilitrios (editores, )

Software de Desenvolvimento
Ambientes de programao SGBD- Sistemas de Gesto de Bases de Dados Folhas Clculo,...

Aplicaes
Packages Aplicaes por medida

Software de Linguagens
Integram-se neste grupo programas especiais que se encarregam da traduo de programas escritos numa linguagem de programao para linguagem mquina. Um computador pode utilizar programas escritos em vrias linguagens de programao embora s entenda a linguagem mquina.

Tradutores
Assembler (o primeiro tradutor) Linguagem de baixo nvel (Assembly) (1 instruo da linguagem -> 1 instruo mquina) Compiladores e Interpretadores - Linguagens de alto nvel (1 instruo da linguagem -> vrias instrues mquina) A principal diferena entre um compilador e um interpretador: - o compilador traduz o programa fonte no programa em linguagem mquina que depois executado como um todo. - O interpretador traduz e executa instruo a instruo at concluir o programa.

COMPILADOR

Um COMPILADOR um programa que l um programa escrito numa linguagem (a linguagem fonte) e o traduz num programa equivalente numa outra linguagem a linguagem objecto), identificando a presena de erros no programa fonte.

Compilao o processo de traduo de um programa escrito em linguagem de alto nvel para cdigo em linguagem de mquina.

Funes do compilador
Funo principal: traduzir uma linguagem (fonte) noutra (alvo) Programa fonte: geralmente uma linguagem de alto nvel Programa alvo: geralmente cdigo mquina Outras caractersticas:
reconhecer os programas fonte legais (e ilegais) gerar cdigo mquina correcto gerir a colocao em memria de dados e cdigo gerar o cdigo mquina num formato reconhecido por outros componentes do sistema de desenvolvimento de software (linkers e loaders)

Contexto de um compilador

Um compilador traduz um programa de uma linguagem textual, facilmente entendida por um ser humano, para linguagem mquina, especfica para um processador e um sistema operativo. Em algumas linguagens de programao, o compilador tem o papel de converter o cdigo fonte num cdigo chamado Bytecode (cdigo em bytes), que um estado intermdio entre o cdigo-fonte (escrito numa linguagem de programao especfica) e a aplicao final. Como exemplo de linguagens que utilizam bytecode temos: Java, C# e Lua.

Estrutura Geral de um Compilador

Processo de Compilao
O processo de compilao em duas fases: Anlise Divide o texto fonte em partes Cria representao intermdia Independente da mquina Sntese Constri programa-alvo a partir de cdigo intermdio Dependente da mquina

Estrutura Geral de um Compilador


(Estrutura funcional) Diviso do compilador em vanguarda (front end) e retaguarda (back end)

Caractersticas Existncia de uma representao intermdia do programa fonte (mquina abstracta) A vanguarda mapeia o programa fonte numa representao intermdia A retaguarda produz o cdigo mquina (mquina concreta) a partir da representao intermdia Simplifica a produo de compiladores para vrias mquinas concretas Simplifica a produo de compiladores para vrias linguagens fonte Duas passagens cdigo mais eficiente que numa nica passagem

Vantagens da representao intermdia

Front end

Funes:
Reconhecer programas vlidos Produzir mensagens de erro Produzir a representao intermdia Produzir um mapa de armazenamento preliminar

Back end

Funes:
Traduzir a representao intermdia em cdigo mquina Escolher as instrues correspondentes a cada operao definida na representao intermdia Decidir que informao manter nos registos do processador Assegurar a concordncia com os formatos usados por outros componentes do sistema de desenvolvimento de software

Anlise lxica
Agrupa sequncias de caracteres em tokens - as unidades bsicas da sintaxe Nesta fase realizada uma Anlise linear do cdigo fonte,o ficheiro de entrada varrido carcter a carcter->varrimento.
Smbolos especiais (espao em branco, smbolos de pontuao e new line) so utilizados para estabelecer os limites das palavras. Eliminao de espaos em branco e comentrios. Durante a anlise lxica, as palavras ou lexemas so guardados na tabela de smbolos e classificados de acordo com a linguagem, em palavras reservadas, comandos, variveis e tipos bsicos. Identificao de erros lxicos ("overflow" de campo numrico, uso de smbolos no pertencentes ao alfabeto da linguagem). Agrupamento de caracteres em sequncias com um determinado significado tokens
Identificador y Smbolo de atribuio = Identificador x Sinal + Carcter 'a' Smbolo de terminao ;

Exemplo: y = x + 'a';

Recorre-se de: Expresses Regulares Autmatos Finitos

Anlise sintctica
responsvel pela verificao da correcta formao dos comandos da linguagem, de acordo com as regras especificadas pela gramtica da linguagem. Agrupamento hierrquico dos tokens. Regras recursivas Definio recursiva duma expresso
um identificador uma expresso um nmero uma expresso se e1 e e2 so expresses, ento e1 + e2, e1 * e2, (e1) tambm so expresses

Anlise Semntica
Trata da apreenso do significado associado concretizao das estruturas sintcticas identificadas na fase anterior A apreenso do significado num compilador implementa-se pelo clculo de uma srie de atributos (valores que caracterizam) associados s classes sintcticas definidas na gramtica da linguagem Exemplos de atributos:
Tipos dos identificadores (variveis, procedimentos, classes, ) Tipos e valores das constantes (literais) endereos de armazenamento na memria (relativos)

Calculados os atributos so efectuadas algumas verificaes, principalmente para evitar a existncia de inconsistncias, tais como:
Os identificadores foram previamente declarados Numa expresso os tipos dos operandos e operadores so compatveis

10

Gerao da representao intermdia


O programa fonte depois de verificado semanticamente transformado numa representao intermdia:
deve ser fcil de produzir representar bem todas as caractersticas da linguagem fonte representar bem as operaes disponveis na mquina alvo deve ser fcil de traduzir para instrues mquina (alvo)

Algumas formas de representao intermdia:


Grficas: rvores sintcticas abstractas com anotaes (os atributos da

anlise semntica) Lineares: Sequncia de instrues para uma mquina genrica e abstracta
Existem vrias formas: mquinas de 0 ou 1 endereos (mquinas de stack; p-code) mquinas de 2 endereos (prximas de alguns processadores reais) mquinas de 3 endereos (de mais alto nvel) Hbridas: Grafos de fluxo entre blocos de instrues

Optimizao do cdigo intermdio


Fase opcional, que pode exigir vrias passagens sobre a representao intermdia Tentativa de melhoramento da representao intermdia por forma a facilitar a produo de melhor cdigo mquina:
mais rpido e/ou mais compacto (que utiliza menos memria)

Algumas optimizaes:
Reconhecer e propagar valores constantes Mover clculos para locais onde o nmero de execues menor Reconhecer clculos redundantes e elimin-los Remover cdigo que redundante ou inalcanvel

As optimizaes no podem alterar resultados parciais ou finais do programa fonte

11

Optimizao final (peephole)


Optimizao efectuada localmente no cdigo mquina atravs da anlise de sequncias curtas de instrues Certas sequncias podem ser substitudas por outras equivalentes,
mas mais eficientes: Incremento em vez de soma deslocamento (shift) em vez de multiplicao Eliminao de instrues redundantes, inteis ou inalcanveis

Exemplo: Compilao de uma instruo de atribuio de uma dada linguagem de acordo com as regras gramaticais:
Atribuio a compilar: ... position := initial + rate * 60

... <atribuio> id := <expresso> <expresso> <expresso> * <expresso> | <expresso> + <expresso> | id | num

12

Tabela de smbolos
Estrutura de dados onde guardada toda a informao relativa aos identificadores utilizados no programa fonte
acedida por, quase, todos os mdulos do compilador
Os mdulos de anlise criam as entradas na tabela, e medida que vo recolhendo informao sobre os identificadores vo-na a armazenando Os mdulos de sntese usam essa informao para gerar cdigo intermdio ou final

A tabela de smbolos deve suportar eficientemente operaes de criao, consulta e remoo de entradas, em diversos nveis (scopes) Informao tipicamente armazenada na tabela de smbolos:
nome do identificador (lexema) - geralmente funciona como chave tipo do identificador e outros atributos (local, global, codificvel, etc) endereo (relativo) onde se situa a entidade representada pelo identificador (varivel, procedimento, funo, etc.)

Deteco e recuperao de erros


possvel encontrar erros em praticamente todas as fases da compilao A maior parte dos erros detectada nas fases de anlise (lxica, sintctica e semntica) Quando um erro detectado deve ser emitida uma mensagem esclarecedora e dever-se- prosseguir na compilao Sempre que um erro detectado dever-se- recuperar desse erro (descartando parte do texto fonte ou assumindo uma correco do erro) por forma a que a tarefa de anlise em curso possa prosseguir.

13

Representao por esquema T


Lf Li
Pascal Cdigo 68000 Cdigo 68000 Pascal Cdigo 68000

Lo

Lf Linguagem fonte Lo Linguagem objecto Li Linguagem de implementao

Representao por esquema T


Admitamos que escrito um Esta descrio tambm utilizada para simbolizar processos de traduo complexos que envolvem vrios compilador para ling. Pascal atravs da ling. de estdios, linguagens ou mquinas implementao C para gerar cdigo 68000, ou seja Pascal C 68000. Se existir um compilador para linguagem C que corra numa mquina 68000 e que gere cdigo para essa mesma mquina, este caracterizado por C 68000 68000. Se Pascal C 68000 executado sobre C 68000 68000, obtm-se um compilador Pascal 68000 68000.

Pascal

Cdigo 68000 C C Cdigo 68000

Pascal Cdigo 68000 Cdigo 68000

Cdigo 68000

Descrio em cascata

Pascal C 68000 + C 68000 68000 = Pascal 68000 68000

14

Cross-Compiler
Pascal Cdigo 68000 C C PDP11 PDP11 PDP11 Pascal Cdigo 68000

Cross-compiler: compilador que corre sobre uma mquina e gera cdigo objecto para outra mquina

Cross-compiler

Um compilador pode ser escrito em qualquer linguagem, mas existem ferramentas prprias para o seu desenvolvimento (ex: FLEX, LEX, YACC, BISON) e linguagens capazes de expressar de forma clara uma determinada estrutura (ex: C, Pascal, Algol 68, etc).

Bootstrapping
A tcnica de bootstrapping consiste na construo de um compilador, usando uma linguagem de implementao L, que compile a prpria linguagem L. usada para:
obter um novo compilador de uma linguagem L2, usando um compilador j existente de uma linguagem L1, em que L1 um subconjunto de L2 obter um novo compilador mais optimizado da mesma linguagem

15

Você também pode gostar