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