2. tópicostópicos itens 01. compiladores 02. tradutores 03. linguagens de programação 04....

39
2

Upload: iago-figueira-freire

Post on 07-Apr-2016

217 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

2

Page 2: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 3: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 4: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 5: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 6: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 7: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 8: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 9: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 10: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 11: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 12: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 13: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 14: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 15: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 16: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 17: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 18: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

construçãoconstruçãoLinguagens fonte e objetoLinguagens fonte e objeto08

5

Page 19: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 20: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 21: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 22: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 23: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 24: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 25: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 26: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 27: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 28: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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)

Page 29: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 30: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 31: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 32: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 33: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 34: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 35: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 36: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 37: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 38: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

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

Page 39: 2. tópicostópicos itens 01. Compiladores 02. Tradutores 03. Linguagens de Programação 04. Histórico das Linguagens 05. Classificação de Linguagens 06

2