Você está na página 1de 71

Compiladores

Estrutura e funcionamento
de um compilador

Ma. Vanessa Ma)as Leite


• Unidade de Ensino: 1

• Competência da Unidade: Compreender a estrutura de


um compilador.

• Resumo: visão geral do estudo de compiladores e


apresentar as opções de ambientes para o
desenvolvimento.

• Palavras-chave: Sintaxe, semân)co; léxico; Linguagens.

• Título da Teleaula: Estrutura e Funcionamento de um


compilador.

• Teleaula nº: 1
Conceitos

Estrutura de um
compilador
Linguagem de Programação
Linguagem de programação: é um método que segue um
padrão para transmitir instruções para um computador
• Linguagens de baixo nível;
• Linguagens de alto nível.
Linguagens de Programação
Assembly: MOV AX, 5; // Move 5 para AX
• Próxima a linguagem de máquina (baixo nível); MOV BX, 4; //Move 4 para BX
ADD AX, BX; // Soma AX com BX
• É relacionada com a arquitetura
HLT; //Finaliza o programa
de computadores;
FORTRAN, ALGOL, COBOL:
• Primeiras linguagens de alto nível.
LISP:
• Paradigma funcional;
• U)liza expressões matemá)cas como estrutura de
dados elementares
Linguagens de Programação
• Sintaxe: descreve se o programa foi escrito
corretamente;
• Nomes: regras para nomear as en)dades;
• Tipos: )pos de valores que a linguagem pode
manipular (decimal, booleano, árvores ...)
• Semân>ca: efeito que determinado comando tem
sobre os valores envolvidos.
a = b ; // a semân)ca deve analisar se os
//)pos das variáveis a e b são
//compadveis com as regras da LP;
Paradigmas de Programação
Paradigma imperativo:
• Fundamentado no modelo de von Neumann;
• O programa quanto as suas variáveis são
armazenados juntos;
• A estrutura e os recursos da linguagem, permitem
uma transcrição quase direta da solução algorítmica;
• Cobol, Fortran, C, Ada e Perl.
Paradigmas de Programação
Paradigma orientado a objeto:
• O programa é uma coleção de objetos, o qual
interagem entre si, trocando mensagens;
• Modelar o mundo como peças (objetos), de forma
abstrata sem atribuir valores, e somente depois
desenvolver (implementar) a solução relacionando
os diversos objetos e comportamentos;
• C++, C#, Java, Python.
Paradigma Funcional:
• Modela um problema computacional como uma
coleção de funções matemá)cas;

Paradigma Lógico:
• Modela um problema declarando qual resultado o
programa deve obter, em vez de como ele deve ser
ob)do.
esta(umido, true).
esta(pra_chuva, true) :- esta(umido,true).

?- esta(pra_chuva, Resposta).
Tipos de Compiladores
• Montadores: traduz o código Assembly em código de
máquina;
• Compiladores: traduz o código em alto-nível em uma
linguagem alvo;
• Interpretadores: as instruções são executadas
diretamente;
• Compiladores híbridos: todos os passos de uma
compilação, mas gera código intermediário, que será
executado por uma MV.
Fonte: Livro texto
Conceitos

Fundamentos de
linguagens formais
Linguagens Formais
• Alfabeto (∑): É um conjunto finito, não vazio, de
símbolos os quais são formadas as cadeias.
Ex.: ∑= {a, b}.

• Símbolo (caractere): é uma en)dade abstrata


básica a qual não é definida formalmente.
Ex.: letras; números; a, b.
Linguagens Formais
• Palavra: É uma sequência finita de símbolos do
alfabeto justapostos.
Ex.: aa, aba, bbb...

Palavra vazia: representada pelos símbolos λ


ou por ε, é uma palavra sem símbolo.
Linguagens Formais
Concatenação:
A concatenação b de duas cadeias a e a’ é a cadeia
formada pela justaposição das sequências de símbolos
a e a’, nesta ordem. Denota-se como b = a.a’ ou
simplesmente b = aa

a = aaa
a’= bbb
b = aa’ = aaabbb
a³= aaaaaaaaa
Linguagens Formais
A representação de todas as palavras sobre um
alfabeto , é ∑*, onde:
∑* denota o conjunto de todas as palavras possíveis
sobre o alfabeto (incluindo ε);
∑" representa o conjunto de todas as palavras possíveis
sobre o alfabeto , exceto a palavra vazia
Linguagens Formais
Linguagem formal (L):
Uma linguagem formal L é um conjunto de palavras
sobre um alfabeto;

O conjunto de regras (produções) que geram a


linguagem é chamado de Gramá)ca.
Gramá>ca
• Coleção finita de regras;
• Para gerar uma palavra, as regras devem
ser aplicadas sucessivamente;
• A linguagem é definida pelo conjunto de
palavras gerada pela gramá)ca.
Gramá>ca
Gramática caracterizada como G=(V,T,P,S), onde:
• V Variáveis. Conjunto finito de símbolos variáveis ou
não- terminais;

• T alfabeto (å). Símbolos dos quais as sentenças da


linguagem são constituídas. Dá-se o nome
de terminais aos elementos do å.
Gramática
Gramá)ca caracterizada como G = (V,T,P,S), onde:
• P conjunto de todas as leis de formação u)lizadas
pela gramá)ca para definir a linguagem. A cada regra
da formação dá-se o nome de produção
da gramá)ca;

• S é um elemento de N, o qual dá início ao processo


de geração de sentenças. S é chamado de símbolo
inicial da gramá)ca.
Conceitos

Hierarquia de
Chomsky e BNF
Fundamentos das Linguagens Formais
Uma linguagem L qualquer é definida pela
gramá)ca de um determinado alfabeto å, sendo a
gramá)ca o conjunto das regras e o alfabeto um
conjunto finito, não vazio.

A par)r das regras que regem a gramá)ca, foi


estabelecida uma hierarquia para as linguagens.
Hierarquia de Chomsky

Fonte: Livro texto


Linguagem Livre de Contexto
Quase sempre as Linguagens de Programação (LPs)
pertencem a classe das Linguagens Livres de
Contexto (LLC):

P: A→α tal que A Î V e α Î V e/ou α Î ∑*


BNF (Backus-Naur Forms)
• Notação formal para as LLC;
• Metalinguagem- linguagem para definir outra
linguagem;
BNF (Backus-Naur Forms)
• < > : Não terminais;
• ::= : definido como;
• | : “ou” lógico;

<letra> ::= a | b | c | ... | z


<digito> ::= 0 | 1 | 2 | 3 | ... | 9
<variavel> ::= <letra> | <letra> <digito>
EBNF (Extended Backus-Naur Forms )
Os seguintes meta-símbolos adicionais do EBNF são:
• [ ] – indica uma parte opcional, que pode repetir
0 ou 1 vez;
• { } – indica uma parte que pode repetir 0 ou n
vezes;
• ( ) – indica precedências dentro da regra;
• ‘ ‘ – indica um caractere a tratar como terminal.
EBNF (Extended Backus-Naur Forms )

<letra> ::= ‘a’ | ‘b’ | ‘c’ | ... | ‘z’


<digito> ::= ‘0’ | ‘1’ | ‘2’ | ‘3’ | ... | ‘9’
<var> ::= ( ‘_’ | <letra> ) { ‘_’ | <letra> | <digito> }
Resolução da SP

Projeto NEW
(Language New
Compiler )
• Você deve apresentar os princípios projeto de
uma linguagem e os )pos de paradigmas
existentes;
• Apresentar o conceito da linguagem modelo
LOGO;
• Apresentar os elementos básicos de uma
linguagem;
• Qual seria a melhor técnica de representar uma
linguagem?
Princípios de uma Linguagem:
• Sintaxe: descreve se o programa foi escrito
corretamente;
• Nomes: regras para nomear as en)dades;
• Tipos: )pos de valores que a linguagem pode
manipular (decimal, booleano, árvores ...)
• Semân>ca: efeito que determinado comando
tem sobre os valores envolvidos.
Paradigmas de Linguagem:
• Paradigma Impera)vo;
• Paradigma Orientado a objetos;
• Paradigma Funcional;
• Paradigma Lógico;
Elementos de uma Linguagem:
• regra do nome das variáveis, )pos dos dados,
instruções de controle, além da indicação de
início e fim de programa.
Apresentação da Linguagem modelo LOGO:

Fonte: Livro texto


<program> ::= ‘aprenda’ <nome> [‘:’ <nome> ] { <listaComandos> } ‘fim’
<nome> ::= <letra> { <letra> | <digito> }
<letra> ::= ‘a’ | ‘b’ | ‘c’ | ... | ‘z’ | ‘A’ | ‘B’ | ... | ‘Z’
<digito> ::= ‘0’ | ‘1’ | ’2’ | ‘3’ | ... | ‘9’
<listaComandos> ::= <atribua> | <cmd1> | <cmd2> | <cmd3> | <cmd4>
<atribua> ::= ‘atribua” ’ <nome> <numero>
<numero> ::= <digito> { <digito> }
<cmd2> ::= ( ‘parafrente’ | ‘pf’ | ‘paratrás’ | ‘pt’ |
‘paradireita’ | ‘pd’ | ‘paraesquerda’ | ‘pe’ |
‘mudecp’ ) ( <numero> | ‘:’<nome> )
Interação

Exercício
Classifique as linguagens Formais
Conceitos

Planejamento da
construção de um
Compilador
Bootstrapping
O primeiro compilador foi escrito em código de máquina,
sua construção foi trabalhosa, porém, como vantagem a
rapidez e serviu como base para todos os outros através do
processo de bootstraping.

A bootstrapping é a técnica para produzir a


autocompilação.
Bootstrapping
O bootstrapping possui 3 passos:
• 1º passo: para a linguagem ‘A’, escrevemos
o compilador na linguagem de máquina ‘M’;
• 2º passo: agora, para a linguagem ‘A’, escrevemos um
outro compilador na própria linguagem ‘A’ ;
• 3º passo: a saída do 2º passo será entrada para
o primeiro compilador, aquele
construído no 1º Passo.
Bootstrapping

Fonte: Livro texto


Bootstrapping

Fonte: Livro texto


Cross-Compilers
• usam a técnica de bootstrapping e são escritos
em um ambiente, mas rodam em outro.
• Produzem um código executável para uma
plataforma diferente da qual está sendo
u)lizada.
• Ferramentas para auxiliar no desenvolvimento;
O que esperar de um bom compilador
• Gera o código alvo correto;
• Faz a análise do código fonte de acordo
com a especificação da linguagem;
• Usar algoritmos adequados para a otimização
dos códigos;
• Gerenciamento da memória;
• Portável para diferentes plataformas.
Conceitos

Ferramentas para o
desenvolvimento
de um Compilador
Ferramentas de Apoio
Ferramentas de apoio para o desenvolvimento dos
compiladores:
• Geradores de analisadores léxicos;
• Geradores de analisadores sintá)cos; e
• Geradores de código.
Termos
• Token: é o nome da produção da gramá)ca;
• Lexema: é o elemento do token;
• Scanner: é o gerador de analisador léxico;
• Lexer: é o analisador léxico;
• Parser: é o gerador de analisador sintá)co;
• Parsing: é o analisador sintá)co;
• Assembly: linguagem de baixo nível;
• Assembler: é o compilador para a linguagem assembly.
Geradores de analisadores léxicos:
• Permitem a automa)zação do processo de
criação de autômatos;

• Reconhecimento das sentenças regulares a


par)r da especificação na notação EBNF.
Geradores de analisadores léxicos (scanner):
• Leem a especificação em um padrão EBNF e
geram um programa que analisa o arquivo
fonte escrito de acordo com a especificação;
• As ferramentas scanners e parsers compõem
o frontend do compilador e estão associados
a parte de análise;
• A parte da síntese, onde é gerado o código
alvo, cons)tui o backend.
Fonte: Livro texto
O que analisar para construir um Compilador?
• Finalidade;
• Eficiência;
• Plataforma;
• Linguagem de desenvolvimento;
Resolução da SP

Etapas do
desenvolvimento
• Apresentar uma proposta de cronograma e as
ferramentas necessárias para desenvolver o
compilador;

• Con)nuidade das palestras des)nadas à capacitação


dos seus profissionais, com um workshop sobre
ferramentas que agilizam a construção dos
compiladores.
Finalidade – neste caso será uma linguagem para fins
educacionais.

• Será criado apenas o frontend ou frontend e backend?

Eficiência

• A compilação precisa ser rápida?

• 2.1 O executável gerado precisa ser rápido?


Plataforma

• O programa resultante da compilação, o executável,


será rodado na mesma máquina?

• O compilador será desenvolvido na mesma plataforma


para a qual irá gerar os executáveis?

Linguagem

• Em qual linguagem se pretender escrever o


compilador?

• Seria possível o uso de ferramentas?


Fonte: Livro texto
• A implementação deverá usar a técnica de cross-
compilers;

• A linguagem para escrever o compilador será o Java,


pois permite o uso de ferramentas de apoio que
agilizaram o desenvolvimento, tal como o JFLEX & CUP
para o frontend e o JASMIN para o backend, esse, sendo
um assembler para a JVM, garante a possibilidade de
executáveis mul)plataforma.
• Ferramentas u)lizadas:

(a) a JDK, para o Java - linguagem na qual o compilador será


construído.

(b) o JFLEX&CUP ou JAVACC para o frontend.

(c) o JASMIN para o backend.

(d) uma IDE para desenvolvimento, que poderá ser o


Eclipse ou o Netbeans;
Resolução da SP

Padronizando
e-mails
• O banco de dados de um cliente apresenta duplicidades
e dados inválidos ou fora das normas;

• O obje)vo deste trabalho é padronizar as informações


presentes em alguns campos, tais como nome, razão
social, endereço e e-mail.

• Você deve criar uma especificação para o


reconhecimento de e-mails, assim poderá ser
facilmente implementado um algoritmo para fazer a
consistência dos dados.
• A estrutura básica do e-mail é:

nome-parte-local@dominio. )po.pais.

Ao trecho nome-parte-local pode conter:

• Letras maiúsculas e minúsculas do alfabeto inglês.


Acentos nem sempre são reconhecidos por todos os
servidores.
• Números de 0 a 9.
• Os seguintes caracteres: !, #, $, %, &, -, _, ~.

• O caractere ‘.’ (ponto) (exceto no início).


O domínio pode conter:

• Letras maiúsculas e minúsculas do alfabeto inglês. –


Números de 0 a 9.

• O caractere ‘-‘ (traço). Atenção: ‘-’ não pode aparecer


no início, nem o final.

• O Tipo pode conter apenas letras, limitado a 3


caracteres.

O >po: três caracteres

O país: limitado a 2 letras;


<email> ::= <partelocal>’@’<domínio>[‘.’<)po>][‘.’<pais>]

<partelocal> ::= <letra>{ <letra> | <digito> | <caracter> |


’.‘<letra> | ’.‘ <digito> }

<domínio> ::= <letra>{<letra> | <digito> | ’-‘<letra> | ’-


‘<digito>}

<pais> ::= <letra><letra>


<)po> ::= <letra><letra><letra>

<letra> ::= ‘a’ | ‘b’ | ‘c’ | ... | ‘z’ | ‘A’ | ‘B’ | ‘C’ | ... | ‘Z’
<digito> ::= ‘0’ | ‘1’ | ’2’ | ‘3’ | ... | ‘9’
<caracter> ::= ‘!’ | ‘#’ | ‘$’ | ‘%’ | ‘&’ | ‘-‘ | ‘_’ | ‘~’
Interação

Exercício
Sobre os paradigmas de programação clássicos, analise as
afirma)vas a seguir:
I- O paradigma impera)vo tem uma natureza matemá)ca,
sendo muito u)lizado em programação para inteligência
ar)ficial.
II- O paradigma orientado a objetos tem como princípio a
abstração de dados. Linguagem como C++, Java e C# são
exemplos de linguagens orientadas a objetos.
III- O paradigma lógico visa desenvolver a solução
declarando qual resultado o programa deve alcançar, em
vez de como o programa deve alcançar tal resultado.
Conceitos

Recapitulando
Fonte: (Aho, 2008)
Ø Conceitos de linguagem:
• Alfabeto;
• Palavra;
• Linguagem;
• Gramá)ca.

Ø BNF e EBNF.
Fonte: Livro texto
Ferramentas de apoio para o desenvolvimento
dos compiladores:
• Geradores de analisadores léxicos;
• Geradores de analisadores sintá)cos; e
• Geradores de código.

Você também pode gostar