2. tópicostópicos itens 01. compiladores 02. tradutores 03. linguagens de programação 04....
TRANSCRIPT
2
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
construçãoconstruçãoPara construir compiladoresPara construir compiladores
1. Definir metas de uso do compilador2. Definir a quantidade de passos de compilação
que o compilador vai ter3. Definir a quantidade de blocos de código que o
compilador vai ter4. Definir qual o esquema de implementação que
vai ser usado5. Definir as linguagens fonte e objeto que serão
tratadas pelo compilador6. Definir a plataforma e a linguagem de
programação que será usada para desenvolver o compilador
08
construçãoconstruçãoDefinir metas de usoDefinir metas de uso 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…)
08
1
2construçãoconstruçãoQuantos passos de compilaçãoQuantos passos de compilaçã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.
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
2construçãoconstruçãoQuantos passos de compilaçãoQuantos passos de compilação
Compiladores podem ser classificados como: Compiladores de um passo
Compiladores de vários passos
08
Passo único(Compilador)
Passo 1
Passo 2
Passo n
construçãoconstruçãoQuantos passos de compilaçãoQuantos passos de compilaçã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: 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
2
construçãoconstruçãoQuantos passos de compilaçãoQuantos passos de compilação
Técnica de BackPatching
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
2
construçãoconstruçãoQuantos blocos de códigoQuantos blocos de código
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áquinae 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
08
3
COMP.EXE COMP1.DLL COMP2.DLL
construçãoconstruçãoQuantos blocos de códigoQuantos blocos de código
Parte, Passo, Bloco: conceitos 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
3
construçãoconstruçãoQuantos blocos de códigoQuantos blocos de código
Parte, Passo, Bloco: exemplos 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
3
construçãoconstruçãoQual o esquema de implementaçãoQual o esquema de implementação
O que é 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
4
construçãoconstruçãoQual o esquema de implementaçãoQual o esquema de implementação
Programa Principal: analisador sintático
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
4ANALISADORSINTÁTICO
ANALISADOR LÉXICO
ROTINAS DE ANÁLISE SEMÂNTICA E GERAÇÃO DE CÓDIGO
construçãoconstruçãoQual o esquema de implementaçãoQual o esquema de implementação
Programa Principal: analisador léxico
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
08
4ANALISADORSINTÁTICO
ANALISADORSEMÂNTICO E GERAÇÃO DE
CÓDIGO
ANALISADORLÉXICO
construçãoconstruçãoQual o esquema de implementaçãoQual o esquema de implementação
Principal: semântico e geração de código
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
4ANALISADORSINTÁTICO
ANALISADORSEMÂNTICO E GERAÇÃO DE
CÓDIGO
ANALISADORLÉXICO
construçãoconstruçãoQual o esquema de implementaçãoQual o esquema de implementação
Implementação através de co-rotinas
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
4ANALISADORSINTÁTICO
ANALISADORSEMÂNTICO E GERAÇÃO DE
CÓDIGO
ANALISADORLÉXICO
construçãoconstruçãoLinguagens fonte e objetoLinguagens fonte e objeto Como formalizar as linguagens fonte e
objeto do compilador Maneiras de formalizar linguagens:
Enumeração Por gramáticas formais
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
5
construçãoconstruçãoLinguagens fonte e objetoLinguagens fonte e objeto08
5
construçãoconstruçãoPlataforma de desenvolvimentoPlataforma de desenvolvimentoe linguagem de programaçãoe linguagem de programação
Questões a solucionar 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?
De acordo com as respostas às questões acima os compiladores podem ser classificados em alguns grupos.
08
6
construçãoconstruçãoPlataforma de desenvolvimentoPlataforma de desenvolvimentoe linguagem de programaçãoe linguagem de programação
Classificação dos compiladores em relação à plataforma de máquina utilizada no seu desenvolvimento: 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
6
construçãoconstruçãoPlataforma de desenvolvimentoPlataforma de desenvolvimentoe linguagem de programaçãoe linguagem de programação Classificação dos compiladores em relação à
linguagem de programação utilizada no seu desenvolvimento: 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
6
construçãoconstruçãoPlataforma de desenvolvimentoPlataforma de desenvolvimentoe linguagem de programaçãoe linguagem de programaçã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: 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
6
construçãoconstruçãoPlataforma de desenvolvimentoPlataforma de desenvolvimentoe linguagem de programaçãoe linguagem de programação
BootStrapping: recursos e requisitos Elementos utilizados e suas siglas:
LD : Linguagem a ser usada no desenvolvimento MD : Máquina a ser usada no desenvolvimento LC : Linguagem que se quer compilar MC : 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
6
Linguagem 1: Linguagem fonte do compiladorLinguagem 2: Linguagem objeto do compiladorLinguagem 3: Linguagem de desenvolvimento
construçãoconstruçãoPlataforma de desenvolvimentoPlataforma de desenvolvimentoe linguagem de programaçãoe linguagem de programação
BootStrapping: notação de diagramas T Representa um compilador Indica as três linguagens envolvidas no processo
08
6
construçãoconstruçãoPlataforma de desenvolvimentoPlataforma de desenvolvimentoe linguagem de programaçãoe linguagem de programação
BootStrapping: exemplo de um processo 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
6
construçãoconstruçãoPlataforma de desenvolvimentoPlataforma de desenvolvimentoe linguagem de programaçãoe linguagem de programação
BootStrapping: Justificativas
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)
08
6
ferramentasferramentasferramentasferramentas
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
ferramentasferramentasferramentasferramentas
Para construir partes do compilador.Exemplo1:
Gerador de analisadores léxicos Também conhecidos como Scanner
Generators Entrada : expressões regulares Saída : analisador léxico Exemplo : LEX (unix)
09
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)
ferramentasferramentasferramentasferramentas
Para construir partes do compilador.Exemplo2:
Gerador de analisadores sintáticos Conhecidos como Parser Generators Entrada : gramática livre de contexto Saída : analisador sintático Exemplo : YACC (unix)
09
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
ferramentasferramentasferramentasferramentas
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
09
semelhantesemelhanteoutras ferramentas outras ferramentas queque fazem análise fazem análise
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
semelhantesemelhanteoutras ferramentas outras ferramentas queque fazem análise fazem análise
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
10
exemplo
semelhantesemelhanteoutras ferramentas outras ferramentas queque fazem análise 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
10
semelhantesemelhanteoutras ferramentas outras ferramentas queque fazem análise fazem análise
Outros Tradutores de Linguagens de Programação Interpretadores (desenv interativo, debugs) Montadores (por definição) Decompiladores Demontadores (disassemblers)
10
semelhantesemelhanteoutros usos das técnicasoutros usos das técnicas
Formatadores de texto Entrada: Seqüências de caracteres e de
códigos de controle (embutidos ou explícitos).
Saída...: Texto formatado.
Silicom Compilers Entrada: Sinais lógicos ou grupos
de sinais num circuito. Saída...: Circuito final numa lingua-
gem própria ou em formato a ser gravado na placa.
10
semelhantesemelhanteoutros usos das técnicasoutros usos das técnicas
Query Interpreters Entrada: Predicados contendo operadores booleanos,
relacionais, matemáticos, ... Saída...: Registros que satisfazem as condições dos
predicados solicitados.
Editor de Figuras Entrada: Seqüências de localizações e ações. Saída...: Figuras desenhadas.
Produtor de Programas Estruturados Entrada: Sequência de comandos em formato não
estruturado. Saída...: Programas estruturados.
10
custo/benefíciocusto/benefíciocusto/benefíciocusto/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íciocusto/benefíciocusto/benefíciocusto/benefício Custos
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)
11
2