620 likes | 708 Views
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
E N D
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
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
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
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.
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.
I. Execução de Programas Linguagem Assembler
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.
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
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
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ê ???
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
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.
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.
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.
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.
II . Compiladores O que é um compilador Ilustração do funcionamento de um compilador:
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.
II . Compiladores Modelo Análise- síntese da compilação Análise Análise Léxica Análise Semântica Análise Sintáctica
II . Compiladores Modelo Análise- síntese da compilação Síntese Geração do Código Optimização do Código
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
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;
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;
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.
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.
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
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.
III . Interpretadores Os Exemplos de interpretadores • Internet; • Excel, Word Basic, Access, ... ; • SmallTalk; • AutoLisp; • Lisp.
V . Exemplos de Linguagens Compiladas e Interpretadas • Java; • Basic .
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.
II . Compiladores • características da representação intermediáriaas estruturas de dados empregadas devem garantir acesso eficiente a todas as informações, podendo, para isso, ser conveniente algum grau de redundância.
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.
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.
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
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.
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.
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.
II . Compiladores Fases de um compilador
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.
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.
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.
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
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.
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.
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).
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
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)