tópicostópicos itens 01. compiladores 02. tradutores 03. linguagens de programação 04....
TRANSCRIPT
tópicostópicositensitens
01. Compiladores 02. Tradutores 03. Linguagens de
Programação04. Histórico das
Linguagens05. Classificação de
Linguagens06. Processo de tradução
de um código07. 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
compiladorcompiladorconceito de compiladorconceito de compilador
qual o conceito que você tem? o que fazem os compiladores? que características têm? para que servem? brainstorm
compiladorcompilador
01
tradutortradutorde um modo geralde um modo geral
o que é pode ser pessoa, máquina, programa, etc... efetua conversão entre duas linguagens
conceitos texto : elemento trabalhado linguagem : universo conhecido fonte : entrada do tradutor objeto : saída do tradutor
02
tradutortradutorde um modo geralde um modo geralelementos envolvidos
02
TRADUTORLF LO
TO
TF
conceitos texto linguagemfonte TF LFobjeto TO LOLF: Linguagem Fonte. É o conjunto de todas as possíveis entradas para o tradutor. É a linguagem que o tradutor conhece esobre a qual ele vai trabalhar.
tradutortradutorde um modo geralde um modo geralelementos envolvidos
02
TRADUTORLF LO
TO
TF
conceitos texto linguagemfonte TF LFobjeto TO LOTF: Texto Fonte. Pertence a linguagem fonte. Entrada para o tradutor.É o texto que deve ser convertido.
tradutortradutorde um modo geralde um modo geralelementos envolvidos
02
TRADUTORLF LO
TO
TF
conceitos texto linguagemfonte TF LFobjeto TO LOLO: 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.
tradutortradutorde um modo geralde um modo geralelementos envolvidos
02
TRADUTORLF LO
TO
TF
conceitos texto linguagemfonte TF LFobjeto TO LOTO: Texto Objeto. Pertence a Linguagem Objeto.Saída do tradutor. É o texto gerado pelo tradutor como conversão do texto fonte fornecido.
tradutortradutorde um modo geralde um modo geral
características deve gerar um texto correspondente mantendo equivalência de significados
e mantendo apenas as informações relevantes
02
tradutortradutorpara o estudo de compiladorespara 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
Tradutores de um modo geral
subconjunto para o estudo de compiladores
tradutortradutorpara o estudo de compiladorespara 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
02
Tradutores de um modo geral
subconjuntopara o estudo de compiladores
tradutortradutorpara o estudo de compiladorespara o estudo de compiladores MontadoresMontadores
Linguagem de entrada é LP de baixo nível Linguagem de saída é LP de máquina
02
MONTADORLinguage
m de baixo nível
Linguagem de
máquina
tradutortradutorpara o estudo de compiladorespara o estudo de compiladores CompiladoresCompiladores
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
COMPILADORLinguagem de alto
nível
(?) Propicia
execução futura
tradutortradutorpara o estudo de compiladorespara o estudo de compiladores CompiladoresCompiladores
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
COMPILADORLinguagem de alto
nível
(?) Propicia
execução futura
tradutortradutorpara o estudo de compiladorespara o estudo de compiladores InterpretadoresInterpretadores
No compilador
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.
02
(?) Propicia execução
futuraCódigo ExecutávelGerado
Dados de entrada
Dados de saída
Linguagem alto nível
Texto fonte Interpretador
Dados de entrada
Dados de saída
tradutortradutorpara o estudo de compiladorespara o estudo de compiladores DecompiladoresDecompiladores
Linguagem de entrada é LP de baixo nível Linguagem de saída é LP de alto nível
02
DECOMPILADORLinguage
m de baixo nível
Linguagem de alto
nível
linguagem linguagem de programaçãode programaçãoO que sã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
linguagem linguagem de programaçãode programaçãoA primeira traduçã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
03
histórico de histórico de compiladorescompiladores
estágio pré-lingual (1940)
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.
1944: Konrad Zuze, engenheiro alemão, projetou na Suíça o Plankalkül (LP com declaração de variáveis, valores estrutu-rados, 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 re-presentar 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 2000 2010 1950 1960 1970 1980 1990 2000 2010
histórico de histórico de compiladorescompiladores
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.
O primeiro compilador real AUTOCODE (máquina existen-te, 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 implemen-taram 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
19401940 1950 1960 1970 1980 1990 2000 2010 1960 1970 1980 1990 2000 2010
histórico de histórico de compiladorescompiladores
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
19401940 1950 1950 1960 1970 1980 1990 2000 2010 1970 1980 1990 2000 2010
histórico de histórico de compiladorescompiladores
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
19401940 1950 1960 1950 1960 1970 1980 1990 2000 2010 1980 1990 2000 2010
histórico de histórico de compiladorescompiladores
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
19401940 1950 1960 1970 1950 1960 1970 1980 1990 2000 2010 1990 2000 2010
histórico de histórico de compiladorescompiladores
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
19401940 1950 1960 1970 1980 1950 1960 1970 1980 1990 2000 2010 2000 2010
histórico de histórico de compiladorescompiladores
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
19401940 1950 1960 1970 1980 1990 1950 1960 1970 1980 1990 2000 2010 2010
histórico de histórico de compiladorescompiladores
Xxx (2010)
xxx
04
19401940 1950 1960 1970 1980 1990 20001950 1960 1970 1980 1990 2000 2010
histórico de histórico de compiladorescompiladores
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.
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 histórico de compiladorescompiladores
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.
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
O que se verificou • número reduzido de componentes básicos a
serem utilizados• funções padronizadas.
O que provocou as mudanças:• Acúmulo de experiências.• Observação dos resultados.• Desenvolvimento de teorias e técnicas
relacionadas a compiladores.• Desejo/necessidade/vontade dos usuários.
1940
1950
1960
1970
1980
1990
2000
2010
classificaçõesclassificaçõesclassificação das linguagensclassificação das linguagens
Por paradigma Por paradigma geral Por geração Por dependência de máquina
05
classificaçõesclassificaçõespor paradigmapor paradigma
Conceito de paradigmaConjunto de métodos coerentes que foram usados no tratamento de um domínio específico de problemas.
Pelos quatro maiores paradigmas Linguagem imperativa Linguagem orientada a objeto Linguagem de programação funcional Linguagem de programação em lógica
05
classificaçõesclassificaçõespor paradigma geralpor paradigma geral
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
classificaçõesclassificaçõespor geraçãopor geração
Primeira Geração linguagens de máquina Segunda Geração linguagens Assembly Terceira Geração linguagens procedurais Quarta Geração linguagens de
Aplicação Quinta Geração técnicas de IA,
linguagens de inferência
Sexta Geração redes Neurais
05
classificaçõesclassificaçõesp/dependência de máquinap/dependência de máquina
Linguagem de baixo nível (LLL) Linguagem de Máquina (ML) Linguagem de Montagem (AL),
Exemplo: Assembly, Autocode, Bytecode
Linguagem de Alto Nível (HLL) ou linguagem orientada a Usuario (UOL) Exemplo: FORTRAN, Algols, Pascal, C, Ada
Linguagem de Altíssimo Nivel (VHLL) Exemplo: SETL, Prolog, Miranda
Ling. orientada a problemas específicos (POL)
05
classificaçõesclassificaçõesp/dependência de máquinap/dependência de máquina05
Linguagem orientada a Problemas EspecíficosLinguagem de Altíssimo Nível
Linguagem de Alto Nível
Linguagem de Máquina
processo de traduçãoprocesso de traduçãovisão geralvisão geral06
Texto em ling máquina “absoluta” LOAD/LINK-EDITOR
Texto em ling máquina relocávelMONTADOR
Texto em linguagem de montagem COMPILADOR
Texto fonte preparado 2PREPROCESSADOR 2
Texto fonte preparado 1PREPROCESSADOR 1
Texto fonte bruto
exemplo:
processo de traduçãoprocesso de traduçãopreprocessadorespreprocessadores
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
06
Texto em ling máquina “absoluta”
LOAD/LINK-EDITOR
Texto em ling máquina relocável
MONTADOR
Texto em linguagem de montagem
COMPILADOR
Texto fonte preparado 2
PREPROCESSADOR 2
Texto fonte preparado 1
PREPROCESSADOR 1
Texto fonte bruto
processo de traduçãoprocesso de traduçãocompiladorescompiladores
o último compiladordo processo de tradução
os proprocessadorestambém são compiladores
produzem textos emlinguagem de montagem
06
Texto em ling máquina “absoluta”
LOAD/LINK-EDITOR
Texto em ling máquina relocável
MONTADOR
Texto em linguagem de montagem
COMPILADOR
Texto fonte preparado 2
PREPROCESSADOR 2
Texto fonte preparado 1
PREPROCESSADOR 1
Texto fonte bruto
processo de traduçãoprocesso de traduçãomontadores (assemblers)montadores (assemblers) 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.
06
Texto em ling máquina “absoluta”
LOAD/LINK-EDITOR
Texto em ling máquina relocável
MONTADOR
Texto em linguagem de montagem
COMPILADOR
Texto fonte preparado 2
PREPROCESSADOR 2
Texto fonte preparado 1
PREPROCESSADOR 1
Texto fonte bruto
processo de traduçãoprocesso de traduçãoloader/linkeditoresloader/linkeditores
Resolve referências de dados einstruçõ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)
06
Texto em ling máquina “absoluta”
LOAD/LINK-EDITOR
Texto em ling máquina relocável
MONTADOR
Texto em linguagem de montagem
COMPILADOR
Texto fonte preparado 2
PREPROCESSADOR 2
Texto fonte preparado 1
PREPROCESSADOR 1
Texto fonte bruto
processo de traduçãoprocesso de traduçãoexemplo de tradução exemplo de tradução (1/3) 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
06
Texto em ling máquina “absoluta”
LOAD/LINK-EDITOR
Texto em ling máquina relocável
MONTADOR
Texto em linguagem de montagem
COMPILADOR
Texto fonte preparado 2
PREPROCESSADOR 2
Texto fonte preparado 1
PREPROCESSADOR 1
Texto fonte bruto
processo de traduçãoprocesso de traduçãoexemplo de tradução exemplo de tradução (2/3) formato da instrução
código da operação, registrador, operador (endereco ou absoluto), forma de endereçamento
códigos de operação código das operações: load 0001,
store 0100, mul 0010, add 0011 formas de endereçamento
00: na instrução 01: endereçamento direto 10: endereçamento indireto
endereço ocupa quatro bytes
06
Texto em ling máquina “absoluta”
LOAD/LINK-EDITOR
Texto em ling máquina relocável
MONTADOR
Texto em linguagem de montagem
COMPILADOR
Texto fonte preparado 2
PREPROCESSADOR 2
Texto fonte preparado 1
PREPROCESSADOR 1
Texto fonte bruto
processo de traduçãoprocesso de traduçãoexemplo de tradução exemplo de tradução (3/3) Transformação em código
de máquina relocável 0001 01 00000000 01 * 0010 01 00000010 00 0011 01 00000111 00 0100 01 00000100 01 *
transformação em código de máquina absoluto
endereço de carga 00001001 refazer endereços relocaveis
06
Texto em ling máquina “absoluta”
LOAD/LINK-EDITOR
Texto em ling máquina relocável
MONTADOR
Texto em linguagem de montagem
COMPILADOR
Texto fonte preparado 2
PREPROCESSADOR 2
Texto fonte preparado 1
PREPROCESSADOR 1
Texto fonte bruto
funcionamento funcionamento compiladorcompiladormodelo análise-síntesemodelo análise-síntese
07
Compilador
Texto Fonte
Texto Objeto
funcionamento funcionamento compiladorcompiladormodelo análise-síntesemodelo 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
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
funcionamento funcionamento compiladorcompiladorpartes do compiladorpartes do compilador
07
texto fonte
texto objeto
funcionamento funcionamento compiladorcompiladoranalisador léxicoanalisador léxico
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
funcionamento funcionamento compiladorcompiladoranalisador sintáticoanalisador sintático
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
funcionamento funcionamento compiladorcompiladoranalisador semânticoanalisador semântico
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
funcionamento funcionamento compiladorcompiladorgerador de código intermediáriogerador de código intermediário
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
funcionamento funcionamento compiladorcompiladorotimizador de códigootimizador de código
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
funcionamento funcionamento compiladorcompiladorgerador de código finalgerador de código final
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
funcionamento funcionamento compiladorcompiladorgerenciador tab símbolosgerenciador tab símbolos
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
funcionamento funcionamento compiladorcompiladorrotinas de errorotinas de erro
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
funcionamento funcionamento compiladorcompiladorcompilaçãocompilação
exemplo da compilação completa de uma sentença
07
funcionamento funcionamento compiladorcompiladorpartes do compiladorpartes do compilador
07
texto fonte
texto objeto
funcionamento funcionamento compiladorcompiladormodelo front-end/back-endmodelo front-end/back-end
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
funcionamento funcionamento compiladorcompiladormodelo front-end/back-endmodelo front-end/back-end
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
funcionamento funcionamento compiladorcompiladormodelos x partesmodelos x partes
07
funcionamento funcionamento compiladorcompiladormodelos x partesmodelos x partes
07