A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

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 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. Mas com o quê ???

12 Com Compiladores ou Interpretadores
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 Ilustração do funcionamento de um compilador:
O que é um compilador Ilustração do funcionamento de um compilador:

18 Modelo Análise- síntese da compilação
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 Modelo Análise- síntese da compilação
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 Modelo Análise- síntese da compilação
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 Primos de um compilador
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 Primos de um compilador
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 Primos de um compilador
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 Os Exemplos de interpretadores
III . Interpretadores Os Exemplos de interpretadores Internet; Excel, Word Basic, Access, ... ; SmallTalk; AutoLisp; Lisp.

29 IV . Comparação Vantagens Desvantagens Compiladores Interpretadores
Execução mais rápida Várias etapas de tradução Permite estruturas de programação mais completas Programação final é maior, necessitando mais memória para a sua execução Permite a optimização do código fonte Processo de correcção de erros e depuração é mais demorado Interpretadores Depuração do programa é mais simples Execução do programa é mais lenta Consome menos memória Estruturas de dados demasiado simples Resultado imediato do programa ou rotina desenvolvida Necessário fornecer o programa fonte ao utilizador

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 Análise do programa fonte
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 Análise do programa fonte
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 Análise do programa fonte
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 Gerenciador da tabela de símbolos:
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 Tabela de códigos:
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 Detecção de erros e aviso do erro:
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 Geração de código intermediária:
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 Optimização do código: Geração do código:
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 Factores condicionantes da organização física dos compiladores
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 Os compiladores e os autómatos
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 Scanner agrupa 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 ) 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)

49

50

51 EX:. O analisador léxico do PASCAL
letra ° ( letra Ú digito Ú sublinhado )*, os operadores °, Ú, e * representam respectivamente concatenação, união e repetição, (zero ou mais vezes) e letra, digito e sublinhado representam conjuntos (ou classes) de caracteres: letra = { 'A', ...., 'Z', 'a', ... 'z' } digito = { '0', ..., '9' } sublinhado = { '_' }.

52 Problema: a expressão DO 10 I = 5
FORTRAN (é mais complicado) não tem palavras reservadas, tem apenas palavras-chave, que também podem ser usadas como identificadores; além disso, FORTRAN permite também o uso de espaços dentro de identificadores e palavras-chave. Problema: a expressão DO 10 I = 5 que pode ser a parte inicial de um comando de atribuição DO 10 I = 5. em que a variável real DO10I recebe o valor real 5.,

53 ou pode ser o começo do comando de repetição,
DO 10 I = 5, 20 ... 10 CONTINUE que especifica que os comandos entre o comando DO e o comando rotulado por 10 devem ser executados uma vez para cada valor de I = 5, 6, ..., 20. Note que até que o ponto ou a vírgula sejam encontrados, não é possível decidir qual é a interpretação correta para DO10I.

54 Fases de um Compilador A Análise Sintática (parser) agrupa os itens léxicos (tokens) em diversas unidades sintáticas, construindo uma árvore sintática: Obs.: A árvore sintática mostra a estrutura gramatical de um programa. Cada um de seus nós representa uma unidade sintática.

55 Fases de um Compilador Caberia à análise sintática reconhecer a estrutura do trecho if x>0 then modx := x else modx := (-x) identificando que se trata de um <comando>, no caso um <comando-if>, Composto pela palavra reservada if, seguida de uma <expressão>, seguida da palavra reservada then, etc. Os itens <expressão> e <atribuição> ainda podem ser decompostos em fragmentos menores.

56 Fases de um Compilador

57 PARA PESQUISAR Quase universalmente, a sintaxe das linguagens de programação é descrita por gramáticas livres de contexto, em uma notação chamada BNF (Forma de Backus-Naur ou ainda Forma ormal de Backus), ou em alguma variante ou extensão dessa notação. Essa notação foi introduzida por volta de 1960, para a descrição da linguagem Algol3.

58 Fases de um Compilador Tipos de Erros da Fase de Análise:
- Erros léxicos: O "scanner" deve detectar erros léxicos que podem ser, por exemplo, o uso de caracteres não usados pela linguagem, ou nos inteiros com grandeza maior do que a máxima representada no computador; - Erros Sintáticos: O "parser" tem como tarefa o reconhecimento de erros sintáticos: construções do programa fonte em desacordo com as regras de formação de unidades sintáticas, como especificado pela gramática. Ex.: Na sequência A + * B, deve ser detectado um operador aritmético a mais. Obs: Após reconhecer um erro de sintaxe, o analisador deve emitir mensagem de erro adequada, e tratar ("recover") esse erro, isto é, continuar a análise do resto do programa, de forma que o erro comprometa o mínimo possível o processo de análise.

59 Fases de um Compilador - Gerador de código intermediário usa a estrutura produzida pelo "parser" para criar uma cadeia de instruções simples. Muitos estilos de código intermediário são possíveis. Um estilo comum usa instruções com um operador e um nº pequeno de operandos; - Otimização de Código (fase opcional): melhorar o código intermediário tal que o programa objeto seja mais rápido e/ou ocupe menos espaço. Sua saída é outro programa em código intermediário que faz a mesma tarefa do original; - Gerador de código: gera o programa objeto. O código é gerado sempre para determinadas unidades sintáticas, sendo utilizadas informações fornecidas pelo analista de contexto.

60 Fases de um Compilador - O gerenciamento de tabelas ou "bookkeeping" é a porção do compilador que manipula os nomes usados pelo programa e registra informações essenciais sobre cada um deles, tal como seu tipo (inteiro, real, etc). A estrutura de dados usada para registrar essa informação é chamada Tabelas(s) de Símbolos. - O manipulador de erros é ativado quando uma falha é detectada no programa fonte. Ele avisa o programador, fornecendo um diagnóstico claro e preciso, e torna possível a continuação do processo de análise. É desejável que sejam detectados todos os erros numa única compilação.


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google