Você está na página 1de 23

linguagem de mquina: 0000 0001 0011 0010

Problemas: dificuldade em ler, escrever, editar; controle explcito dos endereos de


memria para dados e para o prprio programa;
Linguagem de Montagem
Assembly language
Uso de um programa montador (assembler)
Linguagens de alto nvel devem suportar os seguintes conceitos:
uso de expresses, usando notao semelhante matemtica;
tipos de dados primitivos e compostos;
estruturas de controle como if-then-else, while, for etc.;
declaraes de variveis, tipos, funes, procedimentos etc.;
abstrao: o que feito x como feito;
encapsulamento (ou abstrao de dados): classes, pacotes, mdulos (orientao a
objetos).
Processadores de Linguagens de Programao
Sistemas que manipulam programas expressos em alguma linguagem de programao:
editores, tradutores, compiladores, interpretadores.
Ferramentas de software (Unix) x processadores integrados (IDEs: Integrated
Development Environments)
Especificao de Linguagens de Programao
Sintaxe: define a forma do programa: palavras reservadas, organizao das frases;
Restries contextuais (semntica esttica): regras de escopo e regras de tipo;
Semntica: significado do programa. Podemos ver o significado do programa como uma
funo mapeando a entrada no resultado (denotacional); ou baseado no seu
comportamento (operacional);
Especificao informal: texto em linguagem natural (ingls ou outra). Riscos:
especificao imprecisa, incompleta ou ambgua.
Especificao formal: consistente, completa, no ambgua. Porm mais difcil de
escrever e difcil de ser entendida por pessoas que no conhecem a notao utilizada.

Sintaxe
especificada usando gramticas livres de contexto (BNF Backus-Naur Form):
Conjunto finito de smbolos terminais: >=, while, ;.
Conjunto finito de smbolos no-terminais: Programa, Comando, Expresso, Declarao.
Um Smbolo inicial (um dos no-terminais):
Programa:Conjunto finito de regras de produo.
rvore Sinttica
Cada gramtica livre de contexto G gera uma linguagem (seqncia de smbolos
terminais).
Uma rvore sinttica de G uma rvore com labels ordenada em que: as folhas so
smbolos terminais; os ns so smbolos no-terminais.
Uma frase de G uma seqncia de smbolos terminais de uma rvore sinttica.
Uma sentena de G uma S-frase de G, onde S o smbolo inicial.
Sintaxe
Sintaxe concreta:
Define a estrutura das frases, a ordem em que sub-frases devem ser escritas, e os
smbolos terminais que as delimitam;
Define como escrever programas sintaticamente bem formados;
No utilizada para a descrio semntica do programa;
Sintaxe Abstrata
Usada como referncia na descrio semntica do programa
No gera frases, mas se baseia na estrutura das frases do programa
Gera rvores sintticas abstratas (Abstract Syntax Trees ASTs)
Nas ASTs cada n representa uma produo, com uma sub-rvore para cada subfrase
Restries Contextuais
Necessrias para expressar situaes em que a possibilidade de a frase ser bem
formada depende do seu contexto.
Regras de escopo: ocorrncia de ligao (declarao) x ocorrncia de uso
Exemplos: declarao de variveis, let
Ligao esttica x Ligao dinmica
Esttica = em tempo de compilao, sem rodar o programa;
Dinmica: s rodando o programa

Regras de Tipos
Normalmente, valores so classificados em tipos.
Cada operao na linguagem tem uma regra de tipos, que define os tipos esperados
para os operandos e o tipo do resultado (se existir).
Qualquer operao utilizando um valor com tipo de errado gera um erro de tipos.
Classificao de Linguagens em Relao a Tipos
Estaticamente tipada: todos os erros de tipos podem ser detectados estaticamente, sem
executar o programa.
Dinamicamente tipada, se (alguns) erros de tipos s podem ser detectados durante a
execuo do programa.
Regras de tipos: exemplo
Regra de tipos para o operador >:
se os dois operandos so do tipo int, ento o resultado do tipo bool;
Regra de tipos para while E do C:
E deve ser do tipo bool;

Em linguagens dinamicamente tipadas


Uma varivel pode assumir diversos valores, de tipos diferentes, durante a execuo do
programa;
Em linguagens estaticamente tipadas
Toda expresso bem-formada E tem um tipo nico T, que pode ser inferido (descoberto)
sem avaliar E;
Quando E for avaliada, ela vai gerar um valor do tipo T.
Semntica da Linguagem
Ver especificao informal, no livro, para:
Atribuio;
Chamada de funes;
Comando sequencial;
If;
While;

Let;
Tradutores e Compiladores

Tradutores recebem um texto expresso em uma linguagem fonte e geram um texto


semanticamente equivalente em uma linguagem destino.

Java para x86

x86 assembler

Assembler x Compilador

Um assembler traduz de uma linguagem de montagem para o cdigo de mquina


correspondente.
Uma instruo de mquina para cada instruo em assembly language.

Um compilador traduz de uma linguagem de alto nvel para uma linguagem de


baixo nvel.
Vrias instrues de mquina para cada linha de comando da linguagem de altonvel.

Outros tipos de tradutores

Tradutores entre linguagens de alto nvel.

Disassembler

De(s)compilador

Linguagens

Linguagem fonte

Linguagem destino

Linguagem de implementao

Programa expresso
na linguagem

Mquina M

Tradutor de S para T

Representao de

expresso na

um interpretador

linguagem L

Traduo de um programa fonte P


expresso na linguagem S em um
programa objeto expresso na
linguagem T usando um tradutor de S
para T executando na mquina M

Cross-compiler

Roda em uma mquina hospedeira, mas gera cdigo para outra mquina.

Usado quando a mquina destino tem pouca memria, no tem compilador ou


outras ferramentas.

Compilao em dois estgios

Compiladores

Permitem execuo dos programas com mxima performance, em linguagem de


mquina.

Entretanto existe o tempo de espera pela compilao.

Interpretadores

Recebe um programa fonte escrito em uma linguagem fonte, e o executa


imediatamente.

Ele l, analisa e executa as instrues do programa fonte, uma de cada vez.

Resultados imediatos, sem a traduo do programa para cdigo objeto antes da


execuo.

Uso de Interpretadores

Programador trabalha em modo interativo, e quer ver o resultado de uma instruo


antes de entrar a prxima;

Programas descartveis, em que velocidade de execuo no to importante;

Execuo de instrues apenas um vez, ou raramente;

Formato de instrues simples, podendo ser analisada fcil e eficientemente.

Execuo (de linguagem de alto nvel) at 100 vezes mais lenta que a verso
compilada;

Inadequado quando o programa vai ser executado em produo, ou execuo


frequente, ou instrues tem formato complicado, difcil de ser analisado.

Exemplos de Interpretadores: Basic: Lisp: Shell do Unix e do DOS e Interpretador SQL

Interpretao de um programa P
expresso em uma linguagem S,
usando um interpretador para S
executando na mquina M

Mquina Real x Abstrata

Interpretive Compiler

Combina caractersticas de
interpretadores e compiladores.

Compila para uma linguagem


intermediria, e interpreta esta
linguagem.

Linguagem intermediria: simples


e rpido de traduzir para ela, e
simples e rpida de interpretar.

Exemplo: Java, no JDK

Compiladores Portveis

Bootstrapping um compilador interpretador

Bootstrap como estratgia para melhorar eficincia

O Processo de Compilao

Fases da compilao

Anlise sinttica (e lxica)

Anlise contextual

Gerao de cdigo

As fases esto associadas s trs partes da especificao de uma linguagem:


sintaxe, restries contextuais (semntica esttica) e semntica.

Ferramentas Complementares a um Compilador

Vrios componentes fazem parte do processo de compilao: preprocessador,


compilador, assembler, carregador e/ou link-editor.

Scanning/Parsing

Anlise lxica l a seqencia de caracteres e a organiza como tokens


seqencias de caracteres com algum significado

Anlise sinttica agrupa caracteres ou tokens em uma estrutura hierrquica com


algum significado

Passos

Um passo uma travessia do programa fonte, ou de uma representao interna


dele.

Um compilador de um passo atravessa o programa uma nica vez.

Um compilador de mltiplos passos faz vrias travessias

O projeto de um compilador diretamente relacionado ao nmero de passos

Compilao em mltiplos passos

Mdulo principal (driver)


chama cada um dos
passos, responsveis pela
anlise sinttica, anlise
contextual e gerao de
cdigo.

Compilao em passo nico

Analisador sinttico vai


realizando/chamando as
atividades de anlise contextual e
gerao de cdigo, medida que
l e reconhece o programa

Pontos relevantes no Projeto de um Compilador

Velocidade possvel vantagem para um passo

Espao possvel vantagem para um passo (dados x programa)

Modularidade vantagem de mltiplos passos

Flexibilidade vantagem de mltiplos passos

Transformaes/otimizaes de programas vantagem de mltiplos passos

Caractersticas da linguagem fonte podem inviabilizar o uso de um passo nico


se a linguagem permite o uso de uma funo antes da sua definio, por exemplo.

Exemplo
public class Compiler {
public static void compileProgram (...) {
Parser parser = new Parser (...);
Checker checker = new Checker (...);
Encoder generator = new Encoder(...);
Program theAST = parser.parse();
checker.check(theAST);
generate.encode(theAST);
}
...
Anlise Sinttica Parte 1

Subfases:

Anlise lxica (scanning): transforma o texto do programa em uma


sequncia de tokens (smbolos como identificadores, literais, operadores,
palavras-chave, pontuao etc.

Parsing: verifica a seqencia de tokens para determinar a estrutura das


frases.

Representao da estrutura das frases (rvore sinttica abstrata).

Gramticas

Uso de EBNF: BNF + expresses regulares:

| , *, ( )

Transformaes em gramticas: Fatorao esquerda

XY|XZ

X (Y | Z)

Transformaes: Eliminao de recurso esquerda


Transformaes: substituio de smbolos no terminais
starters [[X]] o conjunto de smbolos terminais que podem iniciar uma string gerada por
X
Parsing

Algortmos de parsing: so classificados em bottom-up parsing e top-down parsing

Definem a ordem em que a parse tree construda (na prtica ela no


construda de verdade)

Bottom-up parsing

O parser examina os smbolos terminais da string de entrada, da esquerda para a


direita, e reconstri a rvore sinttica de baixo (ns terminais) para cima (em
direo ao n-raiz).

Top-down parsing

O parser examina os smbolos terminais da string de entrada, da esquerda para a


direita, e reconstri a rvore sinttica de cima (n-raiz) para baixo (em direo aos
ns terminais).

Recursive descent parsing

Top-down.

Grupo de N mtodos parseN, um para cada smbolo no-terminal.

Elimine recurso esquerda e fatorize esquerda.

Cada mtodo faz o parsing de uma frase-N:


private void parseNoun();
private void parseVerb();
private void parseSubject();
private void parseObject();
private void parseSentence();

rvores Sintticas Abstratas (ASTs)


Comando

Expresso

Declarao

Scanning (Anlise lxica) (cases and takeIt)

funciona de forma semelhante ao parser, mas em um maior nvel de detalhe.

Especificado usando expresses regulares/EBNF (Gramtica lxica)

Smbolos terminais so caracteres

Viso geral

Anlise Lxica
Fase da compilao responsvel por extrair os tokens do cdigo fonte de um
programa.

Os tokens de uma linguagem comumente so especificados atravs de Expresses


Regulares
[a-z][a-z0-9]*
[0-9]+

identifier
intLiteral

Anlise Sinttica

Fase da compilao responsvel por determinar se uma dada cadeia de entrada


pertence ou no linguagem definida por uma gramtica
Tem como entrada os tokens processados pela anlise lxica

Produz uma estrutura comumente denominada AST abstract syntax tree


Espeficao
BNF - Backus-Naur form
S, A, B, C, D : no-terminais
a,b,d: terminais

Algoritmos de parsing e gramticas


Top-down

Recursive-descent / LL(1)

Bottom-up

LR, SLR, LALR, LR(k)

Recursive descent
Algoritmo baseado em previses
Funes mutuamente recursivas
Uma funo para cada no-terminal
Uma clusula para cada produo

Desenvolvendo um recursive descent parser


Cada no terminal 'X' dar origem a um mtodo/funo parseX();
Produes do tipo 'A | B' daro origem a clusulas cases
Vantagens
Fcil de implementar
Desvantagens
Performance
Gramtica reconhecida possui restries
Sem recurso esquerda
Deve estar fatorada
Gramticas Ambguas

Uma gramtica ambgua se a partir dela uma sentena pode dar origem a duas
arvores de parsing
Problemticas para a compilao
Eliminao de ambigidade quase sempre possvel
Transformaes na gramtica
Mais um top down

Algoritmos bottom-up

Algoritmos LL(k) precisam decidir que produo usar tendo visto apenas k tokens
da entrada
Algoritmos bottom-up so baseados em tcnicas LR(k)
Left-to-right parse, Right-most derivation, k-symbol-lookahead
Baseados no conceito de autmato a pilha
Pilha + lookahead
Duas tipos de aes
Shift:
Coloca o primeiro token da entrada no topo da pilha
Reduce:
Escolhe a regra X::= A B C
Retira C, B, A da pilha
Coloca X na pilha
Gramticas LR
LR(0)
Olham apenas para a pilha
SLR
Melhoramento sobre o LR(0)
LR(1)
Lookahead de 1 smbolo
Consegue descrever a maioria das linguagens de programao
LALR(1)
Melhoramento sobre o LR(1)
Diminu o tamanho da tabela de parsing
Parsing LR de Gramticas Ambguas
Gramticas ambguas ocasionam conflitos em parsers LR
Shift-reduce conflict
O parser no consegue decidir se empilha o prximo smbolo da
entrada, ou se reduz para uma regra j disponvel
Reduce-reduce conflict
O parser pode realizar uma reduo para duas regras distintas

Caso clssico: dangling-else


Sintaxe abstrata
Apenas reconhecer se uma sentena pertence ou no a linguagem especificada
por uma gramtica no o suficiente
necessrio produzir uma estrutura que sirva de base para a prxima fase do
processo de compilao
Parse trees nunca so montadas na prtica
AST Abstract Syntax Tree
Capturam a essncia da estrutura de uma gramtica abstraindo no-terminais
Representao possvel
Java: Classes que possam se relacionar a fim de montar uma rvore
Pode ser produzida atravs da insero de aes semnticas no parser

Anlise Contextual

Tem o objetivo de verificar se o programa est de acordo com as restries


contextuais da linguagem fonte.

Tipicamente, em uma linguagem com tipos estticos e ligao esttica ela:


o

Verifica regras de escopo;

Verifica regras de tipos;

Consiste de duas fases:


o

Identificao: associa ocorrncias de nomes a suas definies

Verificao de tipos: aplica regras de tipos para cada expresso, inferindo os


tipos, e depois compara com os tipos esperados.

Identificao

Faz a ligao entre uso de nomes e sua definio.

Usa uma tabela de identificao (tabela de smbolos), com nome e atributos de


cada identificador.

Cada definio tem o seu escopo parte do programa sobre a qual ela tem efeito.

Um bloco delimita o escopo da declarao.

Estrutura de Blocos de um programa

Define a organizao da tabela de smbolos.

Monoltica: Basic, Cobol;

O nico bloco o programa inteiro, ou seja, todas as declaraes esto em


um escopo global.

Regras de escopo:

nenhum identificador pode ser declarado mais de uma vez;

Nenhum identificador pode ser usado sem ter sido definido.

Plana: Fortran;

O programa pode ser particionado em vrios blocos disjuntos.

Dois nveis de escopo:

Escopo local: ocorrencias de identificadores declarados localmente so


restritos a um bloco em particular

Outras declaraes tm escopo global

Aninhada: Pascal, Ada, C, Java

Blocos podem ser aninhados um dentro do outro.

Vrios nveis de escopo:

Declaraes no nvel mais externo tm escopo global (nvel 1)

Declaraes dentro de um bloco interno so locais ao bloco; cada bloco est


dentro de outro bloco, com um nvel a mais.

Atributos representados pela AST

Informaes sobre atributos so guardadas como ponteiro (referncia) para os ns


da rvore que contm as declaraes, onde ficam informaes de tipos etc.

Ambiente padro

Informaes sobre tipos, variveis e constantes predefinidas

java.lang em Java

Prelude em Haskell

Verificao de Tipos

Inferencia dos tipos de construes mais simples, e em seguida das construes


mais complexas

Literais: o tipo de um literal obtido diretamente:


325 um inteiro, a um caracter etc.

Identificador: o tipo do identificador obtido de sua declarao.

Aplicao de operador unrio: expresso O E onde O tem tipo T1 T2, verificado


que E tem tipo equivalente a T1 e deduz que O E tem tipo T2 .

Aplicao de operador binrio: expresso E1 O E2 onde O tem tipo T1 T2 T3,


verificado que E1 tem tipo equivalente a T1 , E2 tem tipo equivalente a T2 e
deduz que E1 O E2 tem tipo T3 .

Equivalncia de tipos

Equivalncia estrutural: tipos so equivalentes se sua estrutura a mesma.


Em Java a comparao seria feita com o mtodo equals na classe Type.

Equivalncia por nome: toda ocorrncia de um construtor de tipos (array ou


registro) cria um novo tipo distinto; a comparao feita atravs da comparao
dos ponteiros para objetos que representam tipos (em Java, usaria ==)

Algortmo de anlise contextual - Decoration

O resultado da identificao pode ser guardado atravs de um ponteiro do local de


uso para o local da definio na rvore do programa;

O resultado da verificao de tipos guardado anotando em cada n da rvore o


seu tipo (e.g. a classe Expression tem um atributo que guarda seu tipo).

Implementando a anlise contextual

Uso do padro de projetos Visitor

Esse padro de projeto ser usado tambm para gerao de cdigo.

Classe visitor e seus objetos livro


Respostas 2002-2
1 V Uma instruo em assembler tem ligao direta com uma instruo em mquina
2 V Um scanner utilizado para identificar sequencias de caracteres e organiz-las e
classific-las em vrios tipos de tokens
3 V N anlise sinttica verificada se a estrutura das frases do programa est
correta.
4 F Na contextual, tipos verificado se o numero de argumentos de uma funo esta
correto.
5 F A verificao de tipos de um programa realizada atraves da analise
conterxtual/semantica (tipos/escorpo)
6 V - Sintaxe especificada formalmente pela BNF, mas a espeficicao semantica no
muito usada
7 F - Sintatica
8 F A fase do compilador que verifica se um else aparece depois de um if a sintatica
9 F BNF ou EBNF a notao utilizada para especificar a analise sinttica
10 V a verificacao de que uma variavem tem que estar definida antes de ser utilizada
feita pela analise contextual
11 V Existem regras automaticas para transformar uma gramatica recursiva a
esquerda em uma outra que no recursiva a esquerda

12 V Um compilador pode ser dividido em vrias fases


13 V Um compilador pode ser dividido em vrios passos
14 F - Mas existem com apenas um passo
15 V Arvores Sintaticas abstratas so utilizadas pela analise contextual para a
verificao de tipos
16 V rvores de parsing (Parse trees) servem para entender a analise sintatica, mas
na pratica no so construidas pelo compilador.
17 F As sequencias de letras que formam os tokens so reconhecidas na analise lxica
18 F 19 F Os parsers top-down so facilmente desenvolvido a partir de uma gramatica sem
recurso a esquerda
20 V Recursive descent parsers so um tipo de parser top-down que podem ser
facilmente escritos utilizando uma funo recursiva
21 V Em uma linguagem estaticamente tipada, os erros so verificados antes de o
programa comear a executar
22 F A BNF s define a sintaxe. No define a semntica.
23 F
24 F
25 F
26 F faltou um else
27 F Escorpo esttico usa uma tabela
28 F Escorpo dinmico usa uma pilha
29 F
30 V O processo de bootstraping caracterizado pela compilacao de uma linguagem
utilizando um compilador dessa mesma linguagem
31 V O processo processo de bootstraping completo sempre precisa de um compilador
escrito em outra linguagem que depois ser descartado
32 V A diferena entre uma mquina real e uma mquina abstrata que uma
maquina abstrata usa um interpretador para executar as instrucoes de um programa,
enquanto que a maquina real usa uma CPU para executar as instruces
33 V Um cross compiler um compilador que roda em uma mquina mas que gera
cdigo para outra
34 V
35 F Uma mquina abstrata normalmente possui um cdigo menos eficiente
36 F

37 F O processo de bootstraping pode ser utilizado para melhorar a eficiencia de um


compilador
38 V O uso de expresses uma das caracteristicas da linguagens de alto nvel
39 F Interpretadores geram cdigo
40 F possivel combinar o uso de compiladores e interpretadores

41

Respostas 2002-1
1 - Fases do Front-End do Compilador: Analise lxica, Analise sinttica, Analise Semntica
e Gerao de Cdigo intermedirio
2 - Fases do Back-End do Compilador: Analise da representao intermediria(Compiler
analysis), Otimizao e Gerao de cdigo
3 As fases que fazem uso da tabela de simbolo so: ........................................
4 As fases que se comunicam pelo envio/solicitao de tokens so Analise lxica,
Analise sinttica
5 Na Analise contextual/semantica se verifica se a quantidade de argumentos passados
para uma funo est correto
6 A fase da analise lxica responsavel por reconhecer se uma determinada sequencia
de caracteres valida
7 A verificao de tipos feita na analise semntica

8 A analise sintatica a fase que normalmente especificada pelas gramaticas livre do


contexto (estrutura da frase)
9 A analise sintatica que responsavel pela verificao das estruturas das frases
10 A analise lxica a fase normalmente especificada por expressoes regulares (nomes
de variaveis e numeros)
11 A analise semantica fase responsavel por verificar se uma variavel que esta sendo
usada foi declarada ou no
12 - A fase da analise lxica responsavel por reconhecer se uma determinada
sequencia de caracteres valida