Você está na página 1de 12

11/10/2019

• Unidade de Ensino: 1

Compiladores • 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.
Estrutura e funcionamento • Palavras-chave: Sintaxe, semântico; léxico; Linguagens.
de um compilador
• Título da Teleaula: Estrutura e Funcionamento de um
compilador.
Ma. Vanessa Ma.as Leite • Teleaula nº: 1

Estrutura de um
compilador

Linguagem de Programação Linguagens de Programação


Linguagem de programação: é um método que segue um Assembly: MOV AX, 5; // Move 5 para AX

padrão para transmitir instruções para um computador • 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
• Linguagens de baixo nível; HLT; //Finaliza o programa
de computadores;
• Linguagens de alto nível. FORTRAN, ALGOL, COBOL:
• Primeiras linguagens de alto nível.
LISP:
• Paradigma funcional;
• Utiliza expressões matemáticas como estrutura de
dados elementares

1
11/10/2019

Linguagens de Programação Paradigmas de Programação


• Sintaxe: descreve se o programa foi escrito Paradigma imperativo:
corretamente; • Fundamentado no modelo de von Neumann;
• Nomes: regras para nomear as entidades;
• O programa quanto as suas variáveis são
• Tipos: tipos de valores que a linguagem pode armazenados juntos;
manipular (decimal, booleano, árvores ...) • A estrutura e os recursos da linguagem, permitem
• Semântica: efeito que determinado comando tem uma transcrição quase direta da solução algorítmica;
sobre os valores envolvidos. • Cobol, Fortran, C, Ada e Perl.
a = b ; // a semântica deve analisar se os
//tipos das variáveis a e b são
//compatíveis com as regras da LP;

Paradigmas de Programação Paradigma Funcional:


• Modela um problema computacional como uma
Paradigma orientado a objeto: coleção de funções matemáticas;
• O programa é uma coleção de objetos, o qual
interagem entre si, trocando mensagens; Paradigma Lógico:
• Modelar o mundo como peças (objetos), de forma • Modela um problema declarando qual resultado o
abstrata sem atribuir valores, e somente depois programa deve obter, em vez de como ele deve ser
desenvolver (implementar) a solução relacionando obtido.
os diversos objetos e comportamentos;
esta(umido, true).
• C++, C#, Java, Python. 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

2
11/10/2019

Linguagens Formais
• Alfabeto (∑): É um conjunto finito, não vazio, de
Fundamentos de símbolos os quais são formadas as cadeias.
Ex.: ∑= {a, b}.
linguagens formais
• Símbolo (caractere): é uma en.dade abstrata
básica a qual não é definida formalmente.
Ex.: letras; números; a, b.

Linguagens Formais Linguagens Formais


• Palavra: É uma sequência finita de símbolos do Concatenação:
alfabeto justapostos. A concatenação b de duas cadeias a e a’ é a cadeia
Ex.: aa, aba, bbb... 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
Palavra vazia: representada pelos símbolos λ
ou por ε, é uma palavra sem símbolo. a = aaa
a’= bbb
b = aa’ = aaabbb
a³= aaaaaaaaa

Linguagens Formais Linguagens Formais


A representação de todas as palavras sobre um Linguagem formal (L):
alfabeto , é ∑*, onde: Uma linguagem formal L é um conjunto de palavras
∑* denota o conjunto de todas as palavras possíveis sobre um alfabeto;
sobre o alfabeto (incluindo ε);
∑" representa o conjunto de todas as palavras possíveis
sobre o alfabeto , exceto a palavra vazia
O conjunto de regras (produções) que geram a
linguagem é chamado de Gramática.

3
11/10/2019

GramáNca Gramática
• Coleção finita de regras; Gramá.ca caracterizada como G=(V,T,P,S), onde:
• V Variáveis. Conjunto finito de símbolos variáveis ou
• Para gerar uma palavra, as regras devem
não- terminais;
ser aplicadas sucessivamente;
• A linguagem é definida pelo conjunto de • T alfabeto (å). Símbolos dos quais as sentenças da
palavras gerada pela gramá.ca. linguagem são cons.tuídas. Dá-se o nome
de terminais aos elementos do å.

Gramática
Gramática caracterizada como G = (V,T,P,S), onde:
• P conjunto de todas as leis de formação utilizadas
pela gramática para definir a linguagem. A cada regra
Hierarquia de
da formação dá-se o nome de produção
da gramática;
Chomsky e BNF
• 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ática.

Fundamentos das Linguagens Formais Hierarquia de Chomsky


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. Fonte: Livro texto

4
11/10/2019

Linguagem Livre de Contexto BNF (Backus-Naur Forms)


Quase sempre as Linguagens de Programação (LPs) • Notação formal para as LLC;
pertencem a classe das Linguagens Livres de • Metalinguagem- linguagem para definir outra
Contexto (LLC): linguagem;

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

BNF (Backus-Naur Forms) EBNF (Extended Backus-Naur Forms )


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

EBNF (Extended Backus-Naur Forms )

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


Projeto NEW
<digito> ::= ‘0’ | ‘1’ | ‘2’ | ‘3’ | ... | ‘9’
<var> ::= ( ‘_’ | <letra> ) { ‘_’ | <letra> | <digito> } (Language New
Compiler )

5
11/10/2019

• Você deve apresentar os princípios projeto de Princípios de uma Linguagem:


uma linguagem e os .pos de paradigmas • Sintaxe: descreve se o programa foi escrito
existentes; corretamente;
• Apresentar o conceito da linguagem modelo • Nomes: regras para nomear as entidades;
LOGO; • Tipos: tipos de valores que a linguagem pode
• Apresentar os elementos básicos de uma manipular (decimal, booleano, árvores ...)
linguagem; • Semântica: efeito que determinado comando
• Qual seria a melhor técnica de representar uma tem sobre os valores envolvidos.
linguagem?

Paradigmas de Linguagem: Apresentação da Linguagem modelo LOGO:


• 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.
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’ Exercício
<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> )

6
11/10/2019

Classifique as linguagens Formais

Planejamento da
construção de um
Compilador

Bootstrapping Bootstrapping
O primeiro compilador foi escrito em código de máquina, O bootstrapping possui 3 passos:
sua construção foi trabalhosa, porém, como vantagem a • 1º passo: para a linguagem ‘A’, escrevemos
rapidez e serviu como base para todos os outros através do
o compilador na linguagem de máquina ‘M’;
processo de bootstraping.
• 2º passo: agora, para a linguagem ‘A’, escrevemos um
outro compilador na própria linguagem ‘A’ ;
A bootstrapping é a técnica para produzir a
• 3º passo: a saída do 2º passo será entrada para
autocompilação.
o primeiro compilador, aquele
construído no 1º Passo.

Bootstrapping Bootstrapping

Fonte: Livro texto Fonte: Livro texto

7
11/10/2019

Cross-Compilers O que esperar de um bom compilador


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

Ferramentas de Apoio
Ferramentas de apoio para o desenvolvimento dos
Ferramentas para o compiladores:
• Geradores de analisadores léxicos;
desenvolvimento • Geradores de analisadores sintáticos; e

de um Compilador
• Geradores de código.

Termos Geradores de analisadores léxicos:


• Token: é o nome da produção da gramá.ca; • Permitem a automatização do processo de
• Lexema: é o elemento do token; criação de autômatos;
• Scanner: é o gerador de analisador léxico;
• Lexer: é o analisador léxico;
• Reconhecimento das sentenças regulares a
• Parser: é o gerador de analisador sintá.co; partir da especificação na notação EBNF.
• Parsing: é o analisador sintá.co;
• Assembly: linguagem de baixo nível;
• Assembler: é o compilador para a linguagem assembly.

8
11/10/2019

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, constitui o backend.
Fonte: Livro texto

O que analisar para construir um Compilador?


• Finalidade;
• Eficiência; Etapas do
• Plataforma;
• Linguagem de desenvolvimento; desenvolvimento

• Apresentar uma proposta de cronograma e as Finalidade – neste caso será uma linguagem para fins
ferramentas necessárias para desenvolver o educacionais.
compilador;
• Será criado apenas o frontend ou frontend e backend?
• Con.nuidade das palestras des.nadas à capacitação
dos seus profissionais, com um workshop sobre Eficiência
ferramentas que agilizam a construção dos • A compilação precisa ser rápida?
compiladores.
• 2.1 O executável gerado precisa ser rápido?

9
11/10/2019

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- • Ferramentas u.lizadas:


compilers;
(a) a JDK, para o Java - linguagem na qual o compilador será
• A linguagem para escrever o compilador será o Java, construído.
pois permite o uso de ferramentas de apoio que
agilizaram o desenvolvimento, tal como o JFLEX & CUP (b) o JFLEX&CUP ou JAVACC para o frontend.
para o frontend e o JASMIN para o backend, esse, sendo (c) o JASMIN para o backend.
um assembler para a JVM, garante a possibilidade de
executáveis mul.plataforma. (d) uma IDE para desenvolvimento, que poderá ser o
Eclipse ou o Netbeans;

• O banco de dados de um cliente apresenta duplicidades


e dados inválidos ou fora das normas;

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


presentes em alguns campos, tais como nome, razão

e-mails
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.

10
11/10/2019

• A estrutura básica do e-mail é: O domínio pode conter:

nome-parte-local@dominio. .po.pais. • Letras maiúsculas e minúsculas do alfabeto inglês. –


Números de 0 a 9.
Ao trecho nome-parte-local pode conter:
• O caractere ‘-‘ (traço). Atenção: ‘-’ não pode aparecer
• Letras maiúsculas e minúsculas do alfabeto inglês.
no início, nem o final.
Acentos nem sempre são reconhecidos por todos os
servidores.
• O Tipo pode conter apenas letras, limitado a 3
• Números de 0 a 9. caracteres.

• Os seguintes caracteres: !, #, $, %, &, -, _, ~. O Npo: três caracteres


• O caractere ‘.’ (ponto) (exceto no início). 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>}
Exercício
<pais> ::= <letra><letra>
<.po> ::= <letra><letra><letra>
<letra> ::= ‘a’ | ‘b’ | ‘c’ | ... | ‘z’ | ‘A’ | ‘B’ | ‘C’ | ... | ‘Z’
<digito> ::= ‘0’ | ‘1’ | ’2’ | ‘3’ | ... | ‘9’
<caracter> ::= ‘!’ | ‘#’ | ‘$’ | ‘%’ | ‘&’ | ‘-‘ | ‘_’ | ‘~’

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.
Recapitulando
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.

11
11/10/2019

Ø Conceitos de linguagem:
• Alfabeto;
• Palavra;
• Linguagem;
• Gramá.ca.

Ø BNF e EBNF.

Fonte: (Aho, 2008)

Ferramentas de apoio para o desenvolvimento


dos compiladores:
• Geradores de analisadores léxicos;
• Geradores de analisadores sintá.cos; e
• Geradores de código.

Fonte: Livro texto

12

Você também pode gostar