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
01
conceito de compilador




compilador
qual o conceito que você tem?
o que fazem os compiladores?
que características têm?
para que servem?
brainstorm
compilador
02
de um modo geral
tradutor
o que é


pode ser pessoa, máquina, programa, etc...
efetua conversão entre duas linguagens
conceitos
 texto
 linguagem
 fonte
 objeto
:
:
:
:
elemento trabalhado
universo conhecido
entrada do tradutor
saída do tradutor
02
tradutor
de um modo geral
elementos envolvidos
LF
T
F
conceitos
fonte
objeto
TRADUTOR
texto
TF
TO
LO
T
O
linguagem
LF
LO
LF: Linguagem Fonte.
É o conjunto de todas as possíveis entradas para
o tradutor. É a linguagem que o tradutor conhece e
sobre a qual ele vai trabalhar.
02
tradutor
de um modo geral
elementos envolvidos
LF
T
F
conceitos
fonte
objeto
TRADUTOR
texto
TF
TO
TF: Texto Fonte.
Pertence a linguagem fonte.
Entrada para o tradutor.
É o texto que deve ser convertido.
LO
T
O
linguagem
LF
LO
02
tradutor
de um modo geral
elementos envolvidos
LF
T
F
conceitos
fonte
objeto
TRADUTOR
texto
TF
TO
LO
T
O
linguagem
LF
LO
LO: Linguagem Objeto.
Conjunto de todas as possíveis saídas do tradutor.
É a linguagem sobre a qual vão ser gerados os
resultados do trabalho de tradução.
02
tradutor
de um modo geral
elementos envolvidos
LF
T
F
conceitos
fonte
objeto
TRADUTOR
texto
TF
TO
LO
T
O
linguagem
LF
LO
TO: Texto Objeto.
Pertence a Linguagem Objeto.
Saída do tradutor.
É o texto gerado pelo tradutor como conversão
do texto fonte fornecido.
02
de um modo geral
tradutor
características



deve gerar um texto correspondente
mantendo equivalência de significados
e
mantendo apenas as informações relevantes
02
tradutor
para o estudo de compiladores
Tradutores de um modo geral
subconjunto
para o estudo de
compiladores
A tradução que nos interessa



(subconjunto)
feita por programas de computador
feita de forma automática
entre linguagens de programação
02
tradutor
para o estudo de compiladores
Com a limitação feita no universo dos tradutores
temos diversos tradutores que variam de acordo
com: os tipos das linguagens envolvidas e
a natureza do trabalho realizado.
Principais tradutores do subconjunto:





Montadores
Compiladores
Interpretadores
Decompiladores
Demontadores
Tradutores de um modo geral
subconjunto
para o estudo de
compiladores
02
para o estudo de compiladores

Montadores
Linguage
m de
baixo nível


tradutor
MONTADOR
Linguage
m de
máquina
Linguagem de entrada é LP de baixo nível
Linguagem de saída é LP de máquina
02
para o estudo de compiladores

Compiladores
Linguage
m de alto
nível


tradutor
COMPILADOR
(?)
Propicia
execução
futura
A linguagem objeto do compilador pode ser de alto
ou de baixo nível. A linguagem fonte deve ser de
alto nível.
O código gerado pela compilação será executado
posteriormente (e provavelmente inúmeras vezes).
Neste outro momento serão fornecidos os dados e
saídas particulares a cada execução.
02
para o estudo de compiladores

Compiladores
Linguage
m de alto
nível



tradutor
COMPILADOR
(?)
Propicia
execução
futura
Por esta classificação também são considerados
como compiladores: filtros e preprocessadores.
Filtro: quando o tradutor efetua conversão entre
duas linguagens de alto nível muito semelhantes
Preprocessador: preparação de um texto para que
seja submetido posteriormente a um outro
compilador.
02
tradutor
para o estudo de compiladores

Interpretadores
Dados de entrada
No compilador
(?) Propicia
execução Código
Executável
futura
Gerado
No interpretador
 Nos interpretadores não
existe texto objeto.
 A tradução e a execução
do código é feita ao mesmo
tempo. Não existe tempo
de compilação e tempo
de execução.
Dados de saída
Dados de entrada
Linguagem
alto nível
Texto fonte
Interpretador
Dados de saída
02
para o estudo de compiladores

Decompiladores
Linguage
m de
baixo nível


tradutor
DECOMPILADOR
Linguage
m de alto
nível
Linguagem de entrada é LP de baixo nível
Linguagem de saída é LP de alto nível
03
O que são

linguagem
de programação
Linguagem a ser utilizada como meio de
comunicação entre homem e máquina.
Para que servem


Estabelecer uma linguagem a meio caminho
entre a linguagem utilizada pelo homem e
linguagem utilizada pela máquina.
Capacitar o usuário a ajudar a máquina a
resolver problemas de seu interesse.
03
A primeira tradução:



linguagem
de programação
Do problema para a linguagem de
programação
Feita pelo homem,
Chamada de programação
As outras traduções:



Da linguagem de programação para a
solução a ser executada
Feita pela máquina,
Uma delas é a compilação
04
1940
1980
1990
estágio pré-lingual (1940)




1950
1960
1970
Programas feitos em
linguagem de máquina.
Primeiras idéias:
Construção de mecanismos
para facilitar o
entendimento pelo homem
destes programas.
Conceito de compilador
não existia ainda.
As máquinas eram
programadas pelo código
dos programas, mas
também por botões,
interruptores e plugues.


2000
2010
histórico de
compiladores
1944: Konrad Zuze, engenheiro
alemão, projetou na Suíça o
Plankalkül (LP com declaração
de variáveis, valores estruturados, passagem de parâmetros
em procedimentos, etc). Não foi
implementada.
Fim dos anos 40: Herman
Goldstine lança os fluxogramas
(forma de alto nível para representar programas). Sugestão
de John Von Newmann, Adele
Goldstine e Arthur Banks.
Fim dos anos 40, aparecem
implementações do Short Code
/ Short Order Code (linguagem
interpretada e muito simples).
04
1940
1950
1960
1970
1980
1990
reinado do baixo nível (1950)



Computadores passam a ser
programados em Assembly.
Aplicações envolviam cálculo
numérico e muito esforço
era feito para converter
fórmulas numéricas em
instruções Assembly.
Para melhorar esta tarefa
surgem as primeiras
linguagens de alto nível: os
Autocodes. Possuíam 26
identificadores (de A a Z)
que permitiam a conversão
simples de fórmulas.
2000




2010
histórico de
compiladores
O primeiro compilador real
AUTOCODE (máquina existente, implementado e em uso)
em 1952 por Donald Knuth.
Primeiros compiladores. Não
existe data exata, nem o nome
do inventor, nem local.
Vários grupos trabalharam,
experimentaram e implementaram muitas linguagens ao
mesmo tempo.
Primeiro grande projeto de
linguagem de programação:
FORTRAN (“IBM Mathematical
FORmula TRANslation System”)
em 1954 por John Backus.
Envolveu equipe de 18 homens
ano.
04
1940
1950
1960
1970
1980
1990
2000
2010
histórico de
compiladores
explodem as linguagens (1960)



surgimento de uma série de linguagens de programação,
como por exemplo as mais significativas: COBOL, Lisp, Algol
60, BASIC, PL/1.
Novas idéias para a época:
 Dados estruturados (COBOL, PL/1),
 Recursão (Lisp Algol60),
 Interação com o usuário (BASIC) e
 “Big is beautiful” (COBOL e PL/1)
Programas “sérios” ainda feitos em assembly
04
1940
1950
1960
1970
1980
1990
2000
2010
histórico de
compiladores
menor dependência da máquina (1970)





Palavra de ordem: portabilidade.
Surgimento da programação estruturada.
Aparecimento de Linguagens estruturadas como: Pascal, Algol
68 (finalizada em 1975) e C.
Avanços da tecnologia de compiladores.
Linguagem Assembly ainda é muito usada para operações
críticas de tempo de resposta.
04
1940
1950
1960
1970
1980
1990
2000
2010
histórico de
compiladores
reduzindo complexidades (1980)



Redução na complexidade da programação e do
gerenciamento da programação, obstáculo para a construção
e o funcionamento dos sistemas. Linguagens clássicas como
Ada e Modula-2 passam a ser acompanhadas de sistemas
gerenciadores como Make e APSE (Ada Programming Suport
Environment).
Novas maneiras de se pensar em programação: Smalltalk
(programação orientada a objeto) e Miranda (programação
funcional).
Grande parte do código da sonda Giotto que explorou o
cometa Halley em 14 de março de 1986 foi feito em assembly.
04
1940
1950
1960
1970
1980
1990
2000
2010
histórico de
compiladores
paralelismo e distribuição (1990)


Inclusão sistemática destes conceitos em uma linguagem:
occam, extensões de paralelismo em C++ e novas
linguagens: Hermes, Linda, Orca, SR, Ada 9X.
Introdução do hardware RISC (com operações não intuitivas)
pode finalmente decretar o fim do uso da linguagem
assembly.
04
1940
1950
1960
1970
1980
1990
2000
2010
histórico de
compiladores
componentes e web (2000)



Novas versões das linguagens comerciais prevêem cada vez
mais inclusão de conceitos de orientação a objeto.
Desenvolvimento em “n” camadas.
Suporte e integração ao ambiente web. Aplicações podem
estar tratando um grande volume de transações. Necessidade
de otimizações de recursos.
04
1940
1950
1960
Xxx (2010)

xxx
1970
1980
1990
2000
2010
histórico de
compiladores
04
1940
1950
1960
histórico de
compiladores
Primeiros compiladores
 Programas difíceis de se construir. Sem técnicas,
conceitos, documentação, máquina, etc.
 Programas autônomos. Sem estrutura uniforme.
 Operação especifica e manual. Transformações
sucessivas em formas intermediárias melhoradas para
se chegar ao executável.
1970
1980
1990
2000
2010
Compiladores atuais
 Linguagens poderosas.
 Ambientes de programação sofisticados.
 Ferramentas automáticas.
 Integrados com outros elementos do sistema.
 Operação simplificada e relativamente padrão.
04
1940
1950
1960
1970
1980
1990
2000
2010
histórico de
compiladores
Primeiros compiladores
 Programas difíceis de se construir. Sem técnicas,
conceitos, documentação, máquina, etc.
O que se verificou
 Programas autônomos. Sem estrutura uniforme.
• número reduzido de componentes básicos a
 Operação especifica e manual. Transformações
serem utilizados
sucessivas
em formas
intermediárias melhoradas para
• funções
padronizadas.
se chegar ao executável.
O que provocou as mudanças:
• Acúmulo de experiências.
• Observação dos resultados.
• Desenvolvimento de teorias e técnicas
Compiladores atuais
relacionadas a compiladores.
 Linguagens poderosas.
• Desejo/necessidade/vontade dos usuários.
 Ambientes de programação sofisticados.
 Ferramentas automáticas.
 Integrados com outros elementos do sistema.
 Operação simplificada e relativamente padrão.
05
classificação das linguagens




Por
Por
Por
Por
classificações
paradigma
paradigma geral
geração
dependência de máquina
05
por paradigma

classificações
Conceito de paradigma
Conjunto de métodos coerentes que foram
usados no tratamento de um domínio
específico de problemas.
Pelos quatro maiores paradigmas
Linguagem
 Linguagem
 Linguagem
 Linguagem

imperativa
orientada a objeto
de programação funcional
de programação em lógica
05
por paradigma geral
classificações
Outra classificação pela forma de pensar

Operacionais ou Não declarativas
Onde você determina COMO resolver o
problema

Declarativas
Onde você determina O QUE quer resolver
05
por geração

Primeira Geração
Segunda Geração
Terceira Geração
Quarta Geração
Quinta Geração

Sexta Geração




classificações
linguagens de máquina
linguagens Assembly
linguagens procedurais
linguagens de Aplicação
técnicas de IA,
linguagens de inferência
redes Neurais
05
p/dependência de máquina

Linguagem de baixo nível (LLL)




ou linguagem orientada a Usuario (UOL)
Exemplo: FORTRAN, Algols, Pascal, C, Ada
Linguagem de Altíssimo Nivel (VHLL)


Linguagem de Máquina (ML)
Linguagem de Montagem (AL),
Exemplo: Assembly, Autocode, Bytecode
Linguagem de Alto Nível (HLL)


classificações
Exemplo: SETL, Prolog, Miranda
Ling. orientada a problemas específicos (POL)
05
p/dependência de máquina
classificações
Linguagem orientada a Problemas Específicos
Linguagem de Altíssimo Nível
Linguagem
de Alto Nível
Linguagem de
Máquina
06
visão geral
processo de tradução
Texto fonte bruto
exemplo:
PREPROCESSADOR 1
Texto fonte preparado 1
PREPROCESSADOR 2
Texto fonte preparado 2
COMPILADOR
Texto em linguagem de montagem
MONTADOR
Texto em ling máquina relocável
LOAD/LINK-EDITOR
Texto em ling máquina “absoluta”
06
preprocessadores
processo de tradução
Texto fonte bruto


Produzem dados de entrada
para os compiladores
Realizam:






processamento de macros
inclusão de arquivos (header files)
preprocessadores racionais
(flow-of-control, data structures)
extensões de linguagem (Equel)
É um módulo opcional
Podem existir vários
encadeados até se chegar
ao compilador
PREPROCESSADOR 1
Texto fonte preparado
1
PREPROCESSADOR 2
Texto fonte preparado
2
COMPILADOR
Texto em linguagem de
montagem
MONTADOR
Texto em ling máquina
relocável
LOAD/LINK-EDITOR
Texto em ling máquina
“absoluta”
06
compiladores
processo de tradução
Texto fonte bruto



o último compilador
do processo de tradução
os proprocessadores
também são compiladores
produzem textos em
linguagem de montagem
PREPROCESSADOR 1
Texto fonte preparado
1
PREPROCESSADOR 2
Texto fonte preparado
2
COMPILADOR
Texto em linguagem de
montagem
MONTADOR
Texto em ling máquina
relocável
LOAD/LINK-EDITOR
Texto em ling máquina
“absoluta”
06
montadores (assemblers)



processo de tradução
Embutido na maior parte dos
compiladores comerciais, embora
não seja parte da compilação.
Trabalha sobre linguagem
assembly
Implementação mais comum
através dos montadores de
duas passagens



passo: leitura do código fonte
primeiro passo procura todos os
identificadores e monta tabela
de símbolos separada do compilador
segundo passo monta linguagem de
máquina relocável.
Texto fonte bruto
PREPROCESSADOR 1
Texto fonte preparado
1
PREPROCESSADOR 2
Texto fonte preparado
2
COMPILADOR
Texto em linguagem de
montagem
MONTADOR
Texto em ling máquina
relocável
LOAD/LINK-EDITOR
Texto em ling máquina
“absoluta”
06
loader/linkeditores
processo de tradução
Texto fonte bruto


Resolve referências de dados e
instruções entre os vários
módulos que devem compor
o código executável.
Monta um código absoluto de
vários módulos em linguagem
de maquina relocável (várias
compilações ou bibliotecas
prontas)
PREPROCESSADOR 1
Texto fonte preparado
1
PREPROCESSADOR 2
Texto fonte preparado
2
COMPILADOR
Texto em linguagem de
montagem
MONTADOR
Texto em ling máquina
relocável
LOAD/LINK-EDITOR
Texto em ling máquina
“absoluta”
06
exemplo de tradução (1/3)




processo de tradução
Suponha a expressão
x = 2y + 7 (texto fonte)
Precisa ser preparada
Depois compilada
É transformada em linguagem
assembly de uma máquina
hipotética




mov y,R1,
mul #2,R1,
add #7,R1,
mov R1,x
Texto fonte bruto
PREPROCESSADOR 1
Texto fonte preparado
1
PREPROCESSADOR 2
Texto fonte preparado
2
COMPILADOR
Texto em linguagem de
montagem
MONTADOR
Texto em ling máquina
relocável
LOAD/LINK-EDITOR
Texto em ling máquina
“absoluta”
06
exemplo de tradução (2/3)

formato da instrução


código das operações: load 0001,
store 0100, mul 0010, add 0011
formas de endereçamento




código da operação, registrador,
operador (endereco ou absoluto),
forma de endereçamento
códigos de operação


processo de tradução
00: na instrução
01: endereçamento direto
10: endereçamento indireto
endereço ocupa quatro bytes
Texto fonte bruto
PREPROCESSADOR 1
Texto fonte preparado
1
PREPROCESSADOR 2
Texto fonte preparado
2
COMPILADOR
Texto em linguagem de
montagem
MONTADOR
Texto em ling máquina
relocável
LOAD/LINK-EDITOR
Texto em ling máquina
“absoluta”
06
exemplo de tradução (3/3)

Transformação em código
de máquina relocável





processo de tradução
0001
0010
0011
0100
01
01
01
01
00000000
00000010
00000111
00000100
01 *
00
00
01 *
transformação em código
de máquina absoluto


endereço de carga 00001001
refazer endereços relocaveis
Texto fonte bruto
PREPROCESSADOR 1
Texto fonte preparado
1
PREPROCESSADOR 2
Texto fonte preparado
2
COMPILADOR
Texto em linguagem de
montagem
MONTADOR
Texto em ling máquina
relocável
LOAD/LINK-EDITOR
Texto em ling máquina
“absoluta”
07
modelo análise-síntese
Texto Fonte
Compilador
Texto Objeto
funcionamento
compilador
07
modelo análise-síntese

O que é o modelo


Enxerga todo o trabalho do compilador dividido em dois
grandes blocos: a análise e a síntese.
Bloco de análise





funcionamento
compilador
Quebra o programa fonte em suas partes constituintes,
Cria uma representação intermediária equivalente ao
programa fonte,
As operações realizadas pelo programa fonte, e os
elementos utilizados são identificados,
Grava estas informações numa estrutura hierárquica
(árvore sintática estendida)
Bloco de síntese


Constrói o programa objeto a partir da representação
intermediária
Requer técnicas mais especializadas
07
partes do compilador
texto fonte
texto objeto
funcionamento
compilador
07
analisador léxico
funcionamento
compilador
Objetivo principal:
identificar átomos








Faz análise linear do texto fonte
Varre todo o fonte da esquerda para a direita
Agrupa caracteres em átomos (tokens)
Checa com padrões determinados
Classifica átomos identificados
Identifica palavras reservadas da linguagem
Utiliza construções não recursivas
Monta registros iniciais na tabela de símbolos
07
analisador sintático
funcionamento
compilador
Objetivo principal:
verificar seqüência de átomos






Faz análise hierárquica do texto fonte
Agrupa os átomos em frases gramáticas
Trabalha sobre regras (Gramáticas)
Pode conter regras recursivas
Representa frases gramaticais em uma árvore
Ex: balanceamento de parêntesis, ...
07
analisador semântico
funcionamento
compilador
Objetivo principal:
verificar coerência de significados




Pode alterar conteúdo da árvore sintática montada
Tarefa importante é a checagem de tipo
Efetua ou não conversões de tipo (depende da
definição da linguagem)
Pode eliminar ineficiências na estrutura
07
gerador de código intermediário
funcionamento
compilador
Objetivo principal:
fazer primeira tradução independente





Gera representação numa terceira linguagem
Gera programa para execução em maquina
abstrata, fictícia
Deve gerar código que seja fácil de produzir e ao
mesmo tempo fácil de traduzir
Existem vários tipos de representação usados
O código deve ser independente de máquina
07
otimizador de código
funcionamento
compilador
Objetivo principal:
otimizar código






Elimina redundâncias
Reduz ineficiências
Torna o código mais simples e mais rápido
Diminui o numero de instruções
Existe grande variedade de tipos de otimização
Há classe de compiladores com ênfase nesta fase
07
gerador de código final
funcionamento
compilador
Objetivo principal:
gerar código final da compilação



Compõe-se de código de máquina relocável ou
assembly
As instruções em código intermediário são
traduzidas em de instruções de máquina
Aspecto critico: uso de registradores
07
gerenciador tab símbolos
funcionamento
compilador
Objetivo principal:
gerenciar a tabela de símbolos






Estrutura de dados global
Módulo de código e a própria estrutura de dados
Grava identificadores e símbolos que foram
encontrados no programa fonte
Armazena informações sobre vários atributos
destes símbolos
Exemplos de atributos: localização de memória,
tipo da variável, escopo da variável, numero e tipo
dos parâmetros das rotinas, ...
É utilizada por todas as outras partes
07
rotinas de erro
funcionamento
compilador
Objetivo principal:
controlar a ocorrência de erros





Tenta descrever a falha encontrada em uma das
partes do compilador
Tenta recuperar o erro encontrado (tenta continuar
a analise do programa)
Em cada parte do trabalho do compilador serão
descritos os vários erros
Exemplo de erros léxicos, sintáticos, semânticos
Pode ser uma rotina independente ou diluída
07
compilação
funcionamento
compilador
exemplo da
compilação completa
de uma sentença
07
partes do compilador
texto fonte
texto objeto
funcionamento
compilador
07
modelo front-end/back-end
funcionamento
compilador
O que é o modelo

trabalho dividido em dois blocos: front-end e back-end
Bloco de Front-end



Partes/subpartes do compilador dependentes da linguagem
fonte
É totalmente independente da maquina objeto
analise léxica, análise sintática, análise semântica, geração
de código intermediário, parte da rotina de tratamento de
erro e parte da tabela de símbolos.
Bloco de Back-end



Partes/subpartes do compilador dependentes da maquina
objeto
Não dependem da linguagem fonte
otimização de código, geração de código final, parte da
rotina de tratamento de erro e parte da tabela de símbolos.
07
modelo front-end/back-end
funcionamento
compilador
Utilidade do modelo



Reaproveitamento do investimento em
desenvolvimento pelas empresas que produzem
ambientes de desenvolvimento ou linguagens de
programação
Front-end é refeito quando muda a linguagem
fonte
Back-end é refeito quando muda a plataforma de
máquina usada
Também conhecido com o nome de

modelo Vanguarda-Retaguarda
07
modelos x partes
funcionamento
compilador
07
modelos x partes
funcionamento
compilador
Download

comp20112.ConceitosBasicos1