1 / 60

Bibliografia

Bibliografia. 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara Koogan, Rio de Janeiro, 1995 2. Kowaltowisk T., Implementação de Linguagens de Programação - Ed. Guanabara Dois, 1993

lucas
Download Presentation

Bibliografia

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara Koogan, Rio de Janeiro, 1995 2. Kowaltowisk T., Implementação de Linguagens de Programação - Ed. Guanabara Dois, 1993 3. Setzer W., Mello I. H. - A Construção de um Compilador - Ed. Campus, Rio de Janeiro, 1985

  2. Programa • Introdução ao Curso • Linguagens de Programação e Programas • Definição da Linguagem do Curso • Análise Léxica • Análise Sintática • Descendente • Ascendente • Geração de Código

  3. Introdução • Linguagens: • Homem: natural + notações (como a matemática) • Máquina: nível muito atômico (dígitos, binários, registradores, memória etc) • Solução proposta: ling. Alto Nível Programa Fonte Programa Objeto Tradutor Tradutor: Compilador ou Interpretador

  4. Como funcionam os Compiladores e os Interpretadores

  5. I. Execução de Programas Programa em Linguagem de Máquina • Uma linguagem de programação é um conjunto de ferramentas, regras de sintaxe e símbolos ou códigos que nos permitem escrever programas de computador. • A primeira e mais primitiva linguagem de computador é a própria linguagem máquina (0’s e 1’s). • Um programa era difícil, longo e principalmente caro de o construir. • Era também difícil de ser entendido por outros programadores. • Essa complexidade levou à necessidade de desenvolver novas técnicas e ferramentas.

  6. I. Execução de Programas Linguagem de Montagem • A resolução do problema passou pela criação de uma linguagem em que os códigos numéricos foram substituídos por mnemónicos. • O nome dessa linguagem é ASSEMBLY LANGUAGE. • Então será necessário um outro programa que leia o programa escrito nessa linguagem alternativa e o traduza para a linguagem nativa do computador!!! • O processo de tradução da linguagem de montagem para a linguagem de máquina é realizada por um programa chamado ASSEMBLER.

  7. I. Execução de Programas Linguagem Assembler

  8. I. Execução de Programas Linguagem de Programação • Foram desenvolvidas diversas linguagens de programação: • FORTRAN (1957) • ALGOL (1958) • COBOL (1959) • PASCAL (1963) • BASIC (1965) • ADA (1968) • DoD (1969) • C (1982) e mais tarde o C++ (1986) • Etc…. • Estas novas linguagens foram afastando cada vez mais o programador do nível de máquina.

  9. I. Execução de Programas Tradução • Os programas em linguagem de alto nível também precisam de ser traduzidos para linguagem de máquina. Tradução Código Fonte Código Objecto

  10. I. Execução de Programas Montagem • O processo de montagem traduz um programa escrito numa LP num programa equivalente em linguagem maquina. Processo de Montagem Código Fonte Tradução Linguagem de Máquina

  11. Todo o programa escrito numa linguagem de programação de alto nível precisa de ser traduzido para a linguagem de máquina, para que o computador possa executá-lo. Mas com o quê ???

  12. Todo o programa escrito numa linguagem de programação de alto nível precisa de ser traduzido para a linguagem de máquina, para que o computador possa executá-lo. Com Compiladores ou Interpretadores

  13. O nome compilador, criado nos anos 50, faz referência ao processo de composição de um programa pela reunião de várias rotinas de biblioteca; o processo de tradução (de uma linguagem fonte para uma linguagem objeto), considerado hoje a função central de um compilador, era então conhecido como programação automática.

  14. II . Compiladores O que é um compilador • Um compilador tem a finalidade de converter uma linguagem – Linguagem Fonte – de fácil escrita e leitura para os programadores, numa linguagem – Linguagem alvo ou objecto – que possa ser executada pelas máquinas. • O código executável gerado pelo compilador é dependente do sistema operacional e da linguagem de máquina para o qual o código fonte foi traduzido. • A enorme variedade de compiladores existentes é bem vinda, visto que existem milhares de linguagens fonte, e as linguagens alvo são também muito variadas.

  15. II . Compiladores O que é um compilador • Os compiladores são por vezes classificados como uni-passo, multi-passo, optimizador, ou corrector de erros, dependendo da forma como foram construídos ou da funcionalidade para que são pretendidos. • Começaram a aparecer no início da década de 50. • Muito do trabalho inicial dos compiladores resumia-se a tradução de fórmulas aritméticas para código máquina.

  16. II . Compiladores O que é um compilador • O primeiro compilador de FORTRAN, por exemplo, demorou 18 trabalhosos meses para implementar. • Boas linguagens de implementação, ambientes de programação, e ferramentas de software têm também vindo a ser desenvolvidas. • Com estes avanços, um bom compilador pode ser implementado até por alunos!!! num projecto de um semestre de um curso de desenho de compiladores.

  17. II . Compiladores O que é um compilador Ilustração do funcionamento de um compilador:

  18. II . Compiladores Modelo Análise- síntese da compilação • Podemos dividir o processo de compilação em duas fases: • Análise : parte o programa fonte em peças constituintes e cria uma representação intermédia do programa fonte. • Síntese : Constrói o desejado programa alvo (código de máquina) a partir da representação intermédia. • A parte da síntese é a que requer técnicas mais especializadas.

  19. II . Compiladores Modelo Análise- síntese da compilação Análise Análise Léxica Análise Semântica Análise Sintáctica

  20. II . Compiladores Modelo Análise- síntese da compilação Síntese Geração do Código Optimização do Código

  21. II . Compiladores Contexto de um compilador Muitos outros programas podem ser necessários para criar um programa alvo executável. Biblioteca, Ficheiros dos Objectos Relocalizados

  22. II . Compiladores Primos de um compilador • Pré-processadores: produzem o input para os compiladores; • Montadores: Alguns compiladores produzem código Assembler que é passado para um montador para posterior processamento. • Alguns compiladores produzem o trabalho dos montadores;

  23. II . Compiladores Primos de um compilador • Montagens bi-passo: • I Passo - todos os identificadores que denotam localizações de armazenamento, são encontrados e armazenados numa tabela de símbolos • II Passo - traduz cada código de operação para sequências de bits representando essa operação na linguagem máquina • Carregadores e editores de união (Linker): • Carregar consiste em tomar o restabelecimento do código máquina, alterando os endereços restabelecidos e colocando as instruções alteradas e dados na memória nas localizações convenientes. • O editor de união permite-nos fazer um único programa dos vários ficheiros de código de máquina relocalizável;

  24. II . Compiladores Primos de um compilador • Bibliotecas: • O desenvolvimento de um programa certamente utilizará diversas operações que são comuns a muitos outros programas. • Um programa de alto nível possivelmente conterá diversas chamadas de biblioteca. • Essas funções não devem ser confundidas com as instruções da linguagem – na realidade, são pequenos programas externos que são chamados através de instruções especiais chamado biblioteca.

  25. III . Interpretadores Como funcionam os interpretadores • O funcionamento dos interpretadores é muito parecido ao dos compiladores. • O interpretador traduz o código linha a linha. • O código fonte não é totalmente traduzido antes de ser executado. • Não existem fases distintas nem se produz código intermediário. • Passa o tempo todo a ler e a traduzir código.

  26. III . Interpretadores Interpretador: o tradutor transforma uma L.P. numa linguagem simplificada, chamada Código intermediário, que pode ser diretamente executado usando um programa chamado interpretador. OBS: Podemos pensar na linguagem intermediária como sendo a linguagem de máquina de um computador abstrato designado a executar o código fonte. Programa Fonte Código Intermediário Interpretador

  27. III . Interpretadores • Em alguns casos, a própria linguagem fonte pode ser a linguagem intermediária. Por ex, a maioria das linguagens de comandos, na qual nos comunicamos diretamente com o sistema Operacional, são interpretadas sem nenhuma tradução prévia (Ex. DOS). • Os Interpretadores são em geral, menores que os Compiladores e facilitam as implementações mais completas de L.P. • A principal desvantagem é que o tempo de execução de um programa interpretado é em geral, maior que o de um correspondente programa objeto compilado.

  28. III . Interpretadores Os Exemplos de interpretadores • Internet; • Excel, Word Basic, Access, ... ; • SmallTalk; • AutoLisp; • Lisp.

  29. IV . Comparação

  30. V . Exemplos de Linguagens Compiladas e Interpretadas • Java; • Basic .

  31. II . Compiladores • Naturalmente, a tarefa de análise deve ter como resultado uma representação do programa fonte que contenha informação suficiente para a geração do programa objeto correspondente. Normalmente, essa representação (conhecida como representação intermediária) é complementada por tabelas que contêm informação adicional sobre o programa fonte.

  32. II . Compiladores • características da representação intermediáriaas estruturas de dados empregadas devem garantir acesso eficiente a todas as informações, podendo, para isso, ser conveniente algum grau de redundância.

  33. II . Compiladores • Um dos modelos possíveis para a construção de compiladores faz a separação total entre o front-end, encarregado da fase de análise, e o back-end, encarregado da geração de código. • front-end e back-end se comunicam apenas através da representação intermediária; • o front-end depende exclusivamente da linguagem fonte (e, portanto, independe da linguagem ou da máquina objeto); • o back-end depende exclusivamente da linguagem objeto (e, portanto, independe da linguagem fonte). • Esse modelo simplifica a implementação de N linguagens de programação para N máquinas ( basta escrever um front-end para cada linguagem, e um back-end para cada máquina.

  34. Aspectos Básicos • Considerações: • Aspecto Sintático: há uma formalização conveniente através de Gramáticas Livres de Contexto, que permitem a descrição da linguagem • Aspecto Semântico: pouca generalização - inexistência de modelos adequados • Aspecto Pragmático: mais variável, apresentando soluções diferenciadas para cada Sistema Operacional adotado.

  35. sintaxe dá idéia de forma, semântica dá a idéia de conteúdo. • sintaxe de uma linguagem de programação deve descrever todos os aspectos relativos à forma de construção de programas corretos na linguagem, • semântica deve descrever o que acontece quando o programa é executado. • análise está relacionada com sintaxe; • semântica deveria corresponder apenas à geração de código

  36. II . Compiladores Análise do programa fonte • Na compilação a análise consiste em 3 partes: • Análise Léxica ou Linear: • Em que a cadeia de caracteres que forma a estrutura do programa fonte é lido da esquerda para a direita e agrupado em tokens que são sequências de caracteres tendo o sentido colectivo. • A sua função básica é o reconhecimento e a classificação das estruturas elementares ou classes sintácticas das linguagens.

  37. II . Compiladores Análise do programa fonte • Análise sintáctica ou hierárquica: • Na qual caracteres ou tokens são agrupados hierarquicamente em colecções aninhadas com sentido colectivo. • Verifica se a estrutura geral do texto ou programa fonte está correcta.

  38. II . Compiladores Análise do programa fonte • Análise semântica: • Na qual são executadas certas paragens para assegurar que os componentes de um programa são juntamente ajustados em sentido absoluto. • Verifica se o programa fonte tem erros semânticos e reúne a informação dos tipos para a fase de gerador de código subsequente. • Uma componente importante da análise semântica é a verificação do tipo.

  39. II . Compiladores Fases de um compilador

  40. II . Compiladores Fases de um compilador • Gerenciador da tabela de símbolos: • Uma função essencial de um compilador é registar os identificadores usados no programa fonte e coleccionar informação sobre vários atributos de cada identificador. • Uma tabela de símbolos é uma estrutura de dados contendo o registo de cada identificador, com campos para os atributos do identificador.

  41. II . Compiladores Fases de um compilador • Tabela de códigos: • É uma estrutura criada pela análise semântica de um compilador, que mantém registadas as linhas código intermediário geradas por algum tempo. • Em geral as linhas de código geradas permanecem nesta tabela enquanto não estão totalmente preenchidas.

  42. II . Compiladores Fases de um compilador • Detecção de erros e aviso do erro: • Cada fase pode encontrar erros. Porém, depois de descobrir um erro, a fase tem de ocupa-se de alguma maneira com aquele erro, para que a compilação possa prosseguir. • As fases de análise sintáctica e semântica normalmente tratam de uma grande fracção dos erros detectáveis pelo compilador.

  43. II . Compiladores Fases de um compilador • Geração de código intermediária: • Depois da análise sintáctica e semântica, alguns compiladores geram uma explícita representação intermediária do programa fonte. • Podemos pensar nesta representação intermédia como um programa para uma máquina abstracta

  44. II . Compiladores Fases de um compilador • Optimização do código: • Esta fase tenta melhorar o código intermédio, de forma a que resulte num código de máquina mais rápido a executar. • Geração do código: • A fase final do compilador é a geração de código alvo, consistindo normalmente no restabelecimento no código máquina. • Neste ponto, após o programa fonte ter sido analisado e aprovado, segundo a sua sintaxe, e livre de erros semânticos, o compilador tem condições de escrever um programa equivalente na linguagem alvo.

  45. II . Compiladores Factores condicionantes da organização física dos compiladores • Dividir o processo de compilação em diversas fases "lógicas" permite um melhor entendimento do processo como um todo e leva a uma implementação mais estruturada. • A eficiência e os recursos disponíveis na máquina hospedeira do compilador influenciam de maneira decisiva um item importantíssimo na implementação de um compilador: o número de passos de compilação, para poder optimizar o tempo de compilação.

  46. II . Compiladores Os compiladores e os autómatos • Os compiladores têm como base os autómatos. • Dentro da área de Teoria das Linguagens Formais, encontram-se os conceitos de gramática e autómatos, que dão base para a maioria das técnicas utilizadas hoje para se implementar compiladores. Daqui vêm os principais conceitos utilizados pelos compiladores modernos. • Um léxico deve reconhecer tokens, não produzi-los. • A descrição de tokens de maneira a que estes possam ser reconhecidos é feita através de aceitadores finitos (autómato finito).

  47. Fases de um Compilador • A Análise Léxica ou Scanneragrupa caracteres da linguagem fonte em grupos chamados itens léxicos (tokens). Geralmente, as classes à que pertencem esses itens são: • PALAVRAS RESERVADAS : DO, IF, etc • IDENTIFICADORES : x, num, etc • SÍMBOLOS DE OPERADORES : <=, +, etc • SÍMBOLOS DE PONTUAÇÃO : ( , ), ; , etc • NÚMEROS : 1024, 105, etc • Por exemplo, em Pascal: begin A := 5 ; B := A * ( PESO + 102 ) end

  48. Por exemplo, considere o trecho de programa Pascal: if x>0 then { x e' positivo } modx := x else { x e' negativo ou nulo } modx := (-x)

More Related