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