2
tópicos
itens
01. Compiladores
02. Tradutores
03. Linguagens de
Programação
04. Histórico das
Linguagens
05. Classificação de
Linguagens
06. Processo de tradução
de um código
07. Funcionamento de
um compilador
08. Construção de
compiladores
09. Ferramentas para
construção
10. Outras ferramentas
parecidas com
compiladores
11. Custo / Benefício do
uso de compiladores
08
Para construir compiladores
1.
2.
3.
4.
5.
6.
construção
Definir metas de uso do compilador
Definir a quantidade de passos de compilação
que o compilador vai ter
Definir a quantidade de blocos de código que o
compilador vai ter
Definir qual o esquema de implementação que
vai ser usado
Definir as linguagens fonte e objeto que serão
tratadas pelo compilador
Definir a plataforma e a linguagem de
programação que será usada para desenvolver o
compilador
08
Definir metas de uso

construção
Requisitos do compilador

Como o compilador será utilizado?
(finalidade, usuário típico, tamanho de um texto fonte, etc)

Deve ser estabelecido um conjunto de metas
(o que é mais importante para o uso deste compilador)


Alguns requisitos podem ser conflitantes entre si
Exemplos de metas




Eficiência do compilador
Eficiência do programa compilado
Clareza nas mensagens de erro
Programas objeto (saída do compilador) otimizados
(em relação ao tempo de execução, a ocupação de
memória, etc…)
1
08
Quantos passos de compilação
construção
Passo de compilação: atividade do compilador
que exige leitura completa do código fonte ou
do código fonte em alguma forma intermediária.

2
Características dos passos de compilação



Cada passo de compilação usa uma linguagem
fonte e uma linguagem objeto
Cada passo de compilação pode ser definido
como sendo um tradutor de um passo
Devemos procurar reduzir ao máximo o número
de passos necessários a um compilador (menos
linguagens intermediárias e menos desgaste)
08
Quantos passos de compilação
Compiladores podem ser classificados como:

Compiladores de um passo
Passo único
(Compilador)

Compiladores de vários passos
Passo 1
Passo 2
Passo n
construção
2
08
Quantos passos de compilação
construção
Vantagens e Desvantagens das classificações


Vantagens de compiladores de um passo
são desvantagens para o de vários passos,
e vice-versa.
Vantagens de compiladores de vários passos:




2
Menor utilização de memória do compilador,
Maior possibilidade de executar otimizações,
Projetos e implementações mais independentes.
Desvantagens de compiladores de vários passos:



Maior volume de entrada e saída
Aumento do tempo de compilação
Aumento da complexidade do projeto total.
08
Quantos passos de compilação
Técnica de BackPatching



construção
2
Algumas linguagens tem dificuldades de
implementar soluções de um único passo
pois permitem uso de elementos
que só serão conhecidos posteriormente
A técnica de BackPatching preenche estas “lacunas”
com informações dos elementos que serão
definidos e conhecidos posteriormente
(pode ser usada para resolver o problema acima)
Observação: este “retorno” do BackPatching não
configura um novo passo de compilação
08
Quantos blocos de código
construção
3
O que é bloco de código



Um compilador,
pode ser organizado de tal forma,
que consiga ser gerado
em pedaços independentes de código de máquina
e que são disponibilizados para o usuário da
linguagem como “o compilador”.
Estes pedaços são chamados de:
blocos de código, ou também de fases e overlays.
Exemplo de um compilador com 3 blocos de código
COMP.EXE
COMP1.DLL
COMP2.DLL
08
Quantos blocos de código
Parte, Passo, Bloco: conceitos




construção
3
Partes do trabalho do compilador,
Passos de compilação e
Blocos de Código são diferentes entre si
Analisador Léxico é um exemplo de uma parte do
trabalho do compilador (um compilador tem oito
partes possíveis)
O passo de compilação é decorrente de uma
organização lógica do funcionamento do compilador
(quantas leituras ele vai ter que realizar para
conseguir executar as partes do trabalho que tem
que ser feitas)
Um bloco de código é produto de uma necessidade
física (limitação de memória por exemplo).
08
Quantos blocos de código
Parte, Passo, Bloco: exemplos



construção
3
Um passo de compilação pode realizar
por exemplo parte de um analisador léxico, o
analisador sintático inteiro e parte do analisador
semântico numa única leitura.
Um único bloco de código pode fazer a compilação
inteira implementada em várias leituras (ou seja
em vários passos)
Um único passo de compilação pode precisar de
diversas rotinas que foram organizadas em vários
blocos de código diferentes.
08
Qual o esquema de implementação
O que é



construção
4
O compilador precisa realizar as oito partes do
trabalho (analisador léxico, analisador sintático,
analisador semântico,...) definidas anteriormente
O código escrito do compilador, as rotinas que
foram criadas para que ele funcionasse (que faz
todas as oito partes do trabalho citadas acima),
normalmente é organizado em três pedaços:
1) analisador léxico, 2) analisador sintático e 3)
semântico e geração de código (completa)
Esquema de implementação é a decisão sobre como
estes 3 pedaços estarão se comunicando entre si
para formar o compilador
08
Qual o esquema de implementação
construção
Programa Principal: analisador sintático
4
ANALISADOR LÉXICO
ANALISADOR
SINTÁTICO
ROTINAS DE ANÁLISE SEMÂNTICA E
GERAÇÃO DE CÓDIGO



Esquema mais popular de implementação
Chamado de compilação dirigida pela sintaxe
(ou syntax-driven)
Será o esquema a ser utilizado na construção do
projeto de implementação da disciplina
08
Qual o esquema de implementação
construção
Programa Principal: analisador léxico
ANALISADOR
LÉXICO



ANALISADOR
SINTÁTICO
ANALISADOR
SEMÂNTICO E
GERAÇÃO DE
CÓDIGO
Segundo esquema mais popular
Analisador sintático é chamado quando já é
possível montar parte da árvore
Analisador sintático decide quando chamar
semântico e rotinas de geração de código
4
08
Qual o esquema de implementação
construção
Principal: semântico e geração de código
ANALISADOR
SEMÂNTICO E
GERAÇÃO DE
CÓDIGO



ANALISADOR
SINTÁTICO
4
ANALISADOR
LÉXICO
O semântico/geração de código toma a iniciativa de
controlar e seqüencializar as atividades de
compilação
Chama o analisador sintático
O sintático por sua vez chama o léxico
08
Qual o esquema de implementação
construção
Implementação através de co-rotinas
ANALISADOR
LÉXICO



ANALISADOR
SINTÁTICO
4
ANALISADOR
SEMÂNTICO E
GERAÇÃO DE
CÓDIGO
Representa uma iteração infinita.
Cada um roda independente num processador ou
numa máquina diferente
Todos repetem permanentemente a tarefa a que se
destinam.
08
Linguagens fonte e objeto


construção
Como formalizar as linguagens fonte e
objeto do compilador
Maneiras de formalizar linguagens:


Enumeração
Por gramáticas formais



5
Dispositivos geradores de linguagens
Construídos através do estabelecimento de Leis de
Formação
Por reconhecedores ou autômatos


Dispositivos de teste de linguagens
Construídos através da especificação de Regras de Teste
08
Linguagens fonte e objeto
construção
5
08
Plataforma de desenvolvimento
e linguagem de programação

Questões a solucionar



construção
Quais as plataformas de máquinas
envolvidas (qual a plataforma que será usada
para desenvolvimento do compilador e qual a
plataforma onde o compilador deverá rodar
depois de pronto)?
Em que linguagem de programação o
compilador será desenvolvido?
6
De acordo com as respostas às questões acima os
compiladores podem ser classificados em alguns
grupos.
08
Plataforma de desenvolvimento
e linguagem de programação

construção
Classificação dos compiladores em relação à
plataforma de máquina utilizada no seu
desenvolvimento:


6
Autoresidente: todo compilador que roda
depois de pronto na mesma plataforma de
máquina em que ele foi desenvolvido.
Cruzado (ou cross-compiler): todo compilador
que roda depois de pronto em uma plataforma
de máquina (chamada de máquina hospedeira)
diferente da plataforma de máquina que foi
usada no seu desenvolvimento.
08
Plataforma de desenvolvimento
e linguagem de programação

construção
Classificação dos compiladores em relação à
linguagem de programação utilizada no seu
desenvolvimento:


6
Autocompilável: todo compilador que usa
(em algum momento da sua construção) como
linguagem de programação para o seu
desenvolvimento a mesma linguagem de
programação que deve ser traduzida por ele.
Normal: todo compilador que não se encaixa na
definição de compilador autocompilável (acima).
08
Plataforma de desenvolvimento
e linguagem de programação
construção
Método de BootStrapping


Uma das técnicas mais utilizadas para a
obtenção de compiladores do tipo autocompilável
Para a compreensão da técnica definiremos dois
momentos distintos:




6
o momento inicial onde começa o processo e
o momento final quando o compilador tiver sido
produzido.
No primeiro inicial dispomos de recursos para
iniciar o desenvolvimento
No momento final conseguimos atender aos
requisitos propostos para o compilador
08
Plataforma de desenvolvimento
e linguagem de programação
construção
BootStrapping: recursos e requisitos

Elementos utilizados e suas siglas:






6
LD
MD
LC
MC
:
:
:
:
Linguagem a ser usada no desenvolvimento
Máquina a ser usada no desenvolvimento
Linguagem que se quer compilar
Máquina onde o compilador vai executar (rodar)
Recursos: Dispomos da linguagem LD para
desenvolvimento do compilador e da maquina MD
Requisitos: Queremos construir um compilador
para textos fontes na linguagem LC e que
funcione depois de pronto na máquina MC
08
Plataforma de desenvolvimento
e linguagem de programação
construção
BootStrapping: notação de diagramas T


6
Representa um compilador
Indica as três linguagens envolvidas no processo
Linguagem 1: Linguagem fonte do compilador
Linguagem 2: Linguagem objeto do compilador
Linguagem 3: Linguagem de desenvolvimento
08
Plataforma de desenvolvimento
e linguagem de programação
construção
BootStrapping: exemplo de um processo





6
Passo 1: Escrevemos na linguagem LD um
compilador para interpretar fontes na linguagem LC
Passo 2: Compilamos o compilador gerado no passo 1,
gerando um compilador na linguagem de maquina MD
Passo 3: Re-escrevemos o compilador do passo 1 na
própria linguagem LC e gerando código para a máquina MC
Passo 4: Compilamos o compilador escrito no passo 3 no
compilador obtido no passo 2 gerando um novo compilador
para a linguagem LC rodando na maquina MD,
Passo 5: Compilamos o compilador obtido no passo 3 no
compilador obtido no passo 4 gerando um novo compilador
para a linguagem LC disponível para ser executado na
maquina MC.
08
Plataforma de desenvolvimento
e linguagem de programação
BootStrapping: Justificativas
construção
6
Quais as vantagens de se utilizar um
compilador do tipo autocompilável
 Quais as vantagens de se utilizar a
geração do compilador para uma máquina
hospedeira (compilador cruzado)

09
ferramentas
ferramentas
Ferramentas para construção de compiladores


Normalmente a construção de compiladores
é um processo de desenvolvimento
completo onde é produzido todo o código do
compilador pelas técnicas normais de
desenvolvimento de software.
Existem entretanto algumas ferramentas
que se propõem a construir parte do
trabalho de um compilador ou mesmo um
compilador completo.
09
ferramentas
ferramentas
Para construir partes do compilador.
Exemplo1:
 Gerador de analisadores léxicos
Também
 Entrada
 Saída
 Exemplo

conhecidos como Scanner Generators
: expressões regulares
: analisador léxico
: LEX (unix)
Desenvolvido por Eric Schmidt e Mike Lesk para
o Unix. Foi incluído no padrão POSIX.
Gera código em C.
Versão famosa open source do lex é o
Flex (fast lexical anayzer)
09
ferramentas
ferramentas
Para construir partes do compilador.
Exemplo2:
 Gerador de analisadores sintáticos
Conhecidos
 Entrada
:
 Saída
:
 Exemplo
:

como Parser Generators
gramática livre de contexto
analisador sintático
YACC (unix)
YACC: Yet Another Compiler Compiler. Desenvolvido por Steven
C. Johnson (AT&T) para o Unix. Gera código em C.
Foi reescrito para outras linguagens (ML, Ada, Java, Limbo) e
versões Berkeley Yacc, GNU Bison, MKS yacc and Abraxas yacc
09
ferramentas
ferramentas
Para construção de compiladores completos





ComComs
Compiler Compilers
Compiler Generators
Sistema de Escrita de tradutores
Geradores de compiladores
Exemplo 3:
 Coco/R (Hanspeter Mössenböck, Albrecht Wöß,
Markus Löberbauer, University of Linz)
 Versões para C#, Java e C++
 Portado por outras pessoas para Delphi, Pascal, etc
10
outras ferramentas que fazem análise

semelhante
Editores Estruturados





Fornecidos como parte do ambiente de desenvolvimento
de uma linguagem ou como recurso independente, mas
vinculado a uma definição específica de uma linguagem,
Executa a criação e manipulação de textos como um editor
de textos normal, mas direcionado para fontes em
determinada linguagem,
Checa se as entradas
estão corretas,
Coloca palavras chaves
automaticamente,
Procura delimitadores
de blocos de programa
(begin, end, if, endif,
etc...)
10
outras ferramentas que fazem análise

semelhante
Pretty-print








Formatadores de código fonte
Arruma o código escrito em determinada linguagem
Chamados também de code beautifier
Disponíveis para PHP, Java, C++, C, Perl, JavaScript, CSS,
XML, etc...
Faz identação automática de linhas
Adiciona comentários
Remove espaços em branco
Adiciona quebra de linha
depois de ; } etc
exemplo
10
outras ferramentas que fazem análise

Static Checker
 Lê, analisa e descobre
erros em potencial no
programa fonte, sem
traduzir ou executar o
programa objeto,
 Detecta partes do
programa que nunca
serão executadas,
 Detecta que variável é
executada sem a
definição
 Detecta código morto
 Checa padrões
 Testa complexidade
semelhante
10
outras ferramentas que fazem análise

semelhante
Outros Tradutores de Linguagens de Programação




Interpretadores (desenv interativo, debugs)
Montadores (por definição)
Decompiladores
Demontadores (disassemblers)
10
outros usos das técnicas


semelhante
Formatadores de texto

Entrada:

Saída...:
Seqüências de caracteres e de
códigos de controle (embutidos ou
explícitos).
Texto formatado.
Silicom Compilers

Entrada:

Saída...:
Sinais lógicos ou grupos
de sinais num circuito.
Circuito final numa linguagem própria ou em
formato a ser gravado
na placa.
10
outros usos das técnicas


Query Interpreters

Entrada:

Saída...:
Predicados contendo operadores booleanos,
relacionais, matemáticos, ...
Registros que satisfazem as condições dos
predicados solicitados.
Editor de Figuras



semelhante
Entrada:
Saída...:
Seqüências de localizações e ações.
Figuras desenhadas.
Produtor de Programas Estruturados

Entrada:

Saída...:
Sequência de comandos em formato não
estruturado.
Programas estruturados.
11
custo/benefício
custo/benefício
Justificar o uso de compiladores


Implica necessariamente em justificar a
utilização das linguagens de programação
de alto nível
A tradução automática feita pelos compiladores
produz programas menos eficientes que os
criados diretamente na linguagem objeto e isto
envolve custos e benefícios.
11
custo/benefício

Custos



custo/benefício
Desenvolvimento não trivial de compiladores
Produção de aplicações (geradas) sem o mesmo poder de
otimização do que aplicações feitas diretamente em
assembler (ou outra linguagem de baixo nível).
Benefícios









Redução do custo de Desenvolvimento
Redução do tempo de Desenvolvimento
Aumento da produtividade do Programador
É desnecessário otimizar todo o programa
Redução do número de linhas de código
Maior legibilidade do programa
Aumento da confiabilidade do programa
Facilidade de manutenção
Baixos custos de migração (portabilidade)
2
Download

comp20072_-_Conceitos_Basicos_-_parte2