Um compilador é um programa que lê um programa escrito numa dada linguagem, a linguagem objecto (fonte), e a traduz num programa equivalente



Documentos relacionados
COMPILADORES E INTERPRETADORES

Conceitos básicos de programação

Capítulo 1. Linguagens e processadores

Compiladores INTRODUÇÃO.

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

Metodos de Programação

AMBIENTE DE PROGRAMAÇÃO PYTHON

Construção de Compiladores. Construção de Compiladores. Motivação. Motivação. Contexto Histórico. Classificações: Gerações 09/03/2010

Informática II Cap. 3

UMA BREVE INTRODUÇÃO AO ESTUDO E IMPLEMENTAÇÃO DE COMPILADORES

Instituto Superior Politécnico de VISEU. Escola Superior de Tecnologia

O que é um programa? Programa é uma lista de instruções que descrevem uma tarefa a ser realizada pelo computador.

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

CURSO DE PROGRAMAÇÃO EM JAVA

UNIVERSIDADE DO OESTE DE SANTA CATARINA CAMPUS DE SÃO MIGUEL DO OESTE

Introdução às Linguagens de Programação

INE5317 Linguagens Formais e Compiladores. AULA 2: Es trutura geral dos Compiladores

Tecnologia da Informação. Visão Geral sobre Informática

Capítulo 1. Introdução. 1.1 Linguagens. OBJETIVOS DO CAPÍTULO Ao final deste capítulo você deverá ser capaz de:

O que é o JavaScript?

PROJETO LÓGICO DE COMPUTADORES Prof. Ricardo Rodrigues Barcelar

Algoritmos e Programação Estruturada

Introdução. Introdução. Introdução. Organização Estruturada de Computadores. Introdução. Máquinas Multiníveis

ALP Algoritmos e Programação. . Linguagens para Computadores

ENIAC. Introdução aos Computadores e à Programação (Noções Básicas)

1.1. Organização de um Sistema Computacional

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

Algoritmos com VisuAlg

TIC Unidade 2 Base de Dados. Informação é todo o conjunto de dados devidamente ordenados e organizados de forma a terem significado.

ARQUITETURA DE COMPUTADORES. Rogério Spindula Rosa

Fundamentos de Microinformática. Ricardo José Cabeça de Souza 2010 Fundamentos 3

INTRODUÇÃO À PROGRAMAÇÃO BCC 201 TURMAS 31, 32 E AULA TEÓRICA 2 PROF. MARCELO LUIZ SILVA (R E D)

Curso de Eng. Informática Linguagens de Programação. C Sharp University Data Processing. (C Sharp Universidade de Processamento de Dados) Docente:

Geração de código intermediário. Novembro 2006

Projecto de Programação MEEC /2011-1ºSemestre. Mestrado Integrado em Engenharia Electrotécnica e de Computadores

3. O NIVEL DA LINGUAGEM DE MONTAGEM

Programação 2ºSemestre MEEC /2011. Programação 2º Semestre 2010/2011 Enunciado do projecto

SISTEMAS OPERATIVOS I

O Processo de Programação

ARQUITECTURA DE COMPUTADORES CAPÍTULO II AULA X

Algoritmos não se aprendem: Copiando algoritmos Estudando algoritmos Algoritmos só se aprendem: Construindo algoritmos Testando algoritmos

BREVE HISTÓRIA DA LINGUAGEM FORTRAN

Geração e Otimização de Código

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 1

Segue-se o estudo da forma como os computadores armazenam e acedem às informações contidas na sua memória.

Aula teórica 3. Tema 3.Computadores e linguagens Linguagens de Programação Compilação e linkagem LP Java. Preparado por eng.

Hugo Pedro Proença, 2007

Modelo Cascata ou Clássico

Introdução aos Algoritmos e Estruturas de Dados 2011/2012

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis

A Linguagem Pascal e o Ambiente de Programação Dev-Pascal. Introdução à Ciência da Computação I

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

FundamentosemInformática

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

LINGUAGENS E PARADIGMAS DE PROGRAMAÇÃO. Ciência da Computação IFSC Lages. Prof. Wilson Castello Branco Neto

Introdução à Linguagem

MC-102 Aula 01. Instituto de Computação Unicamp

Um sistema SMS 1 simplificado

Resolução de problemas e desenvolvimento de algoritmos

Diagrama de transição de Estados (DTE)

Java. Marcio de Carvalho Victorino

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: Prof. Dr. Raimundo Moura

PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012

Programação de Computadores III

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Prova de Aferição de Matemática

Engenharia de Software

Conceitos básicos da linguagem C

PROGRAMAÇÃO JAVA. Parte 1

Fundamentos em Informática (Sistemas de Numeração e Representação de Dados)

Resumo da Matéria de Linguagem de Programação. Linguagem C

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

3 Revisão de Software

Programação Elementar de Computadores Jurandy Soares

Curso Técnico em Redes

Programação I. Departamento de Engenharia Rural Centro de Ciências Agrárias

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP

Linguagem de Programação I. Aula 05 Linguagem C

Introdução aos Computadores

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Veja abaixo um exemplo de um endereço IP de 32 bits:

Desenvolvimento de programas em UNIX

ARQUITECTURAS DE SOFTWARE

Universidade Federal de Santa Maria Curso de Arquivologia. Disciplina de Banco de Dados Aplicados à Arquivística. Versao 1.

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Organização e Arquitetura de Computadores I. de Computadores

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

USO GERAL DOS PROTOCOLOS SMTP, FTP, TCP, UDP E IP

2 echo "PHP e outros.";

Gerenciamento de configuração. Gerenciamento de Configuração. Gerenciamento de configuração. Gerenciamento de configuração. Famílias de sistemas

Linguagens de. Aula 02. Profa Cristiane Koehler

Curso de Programação Computadores

Linguagem de Programação III

Figura 1 - O computador

Transcrição:

Capítulo 1 Introdução Um compilador é um que lê um escrito numa dada linguagem, a linguagem objecto (fonte), e a traduz num equivalente numa outra linguagem, a linguagem destino Como parte importante neste processo o compilador deve dar informação acerca dos eventuais erros no objecto (fonte) fonte compilador destino mensagens de erro Dada a multiplicidade de linguagens fonte diferentes e a multiplicidade de linguagens destino a construção de compiladores para todos esses tipos de linguagens seria uma tarefa dantesca O primeiro compilador de FORTRAN (anos 50) exigiu um esforço de 18 pessoas-ano para ser implementado Actualmente a utilização de ferramentas computacionais apropriadas assim como de técnicas especializadas a construção de compiladores tornou-se uma tarefa mais fácil de executar Existem muitos s que sem tomarem o nome de compilador usam as técnicas próprias dos compiladores, ou são mesmo compiladores, não no sentido usual das linguagens de ção, mas para outros tipos de linguagens fonte e linguagens objecto Vejamos sumariamente alguns desses s 1 (Versão 16) 5

6 CAPÍTULO 1 INTRODUÇÃO Formatadores ( Pretty Printers ) Os pretty printers são s que recebem um texto (linguagem objecto) de um escrito numa dada linguagem de ção, e produzem um outro texto (linguagem destino) formatado de forma a que a estrutura própria dos vários construtores da linguagem de ção é realçada Verificadores de Programas ( Static Checkers ) Os static checkers analisam o texto e produzem mensagens de erro/aviso sem chegarem a produzir um texto final, isto é implementam somente a fase de análise e tratamento de erros dos compiladores Um exemplo de um deste tipo é o verificadores de texto em L A TEX designado por Lacheck, este analisa textos L A TEX produzindo mensagens de erro e de aviso apropriadas Um outro exemplo é nos dado pelo lint, o verificador de s para o sistema GNU C Interpretadores os interpretadores são s que recebem como entrada um texto (expressão ou ) escrito numa dada linguagem de ção e produzindo o efeito desejado sem que para isso produzam um em linguagem destino Formatadores de Texto os formatadores de texto são que recebem textos (documentos) contendo comandos de formatação produzindo como resultado um texto (documento) formatado pronto para ser impresso/visualizado Exemplos de s deste tipo são os formatadores de texto LATEX, nroff, e troff 11 O Contexto de um Compilador Aquilo que é usualmente designado por um compilador é de facto um conjunto de s que no seu conjunto formam o compilador, isto é designase pelo mesmo nome o conjunto e um dos seus elementos É de notar que nem sempre os s que a seguir se vão descrever estão presentes num sistema de compilação (compilador), e que, por outro lado, na maior parte dos casos a separação do sistema de compilação nas suas várias componentes não é tornada explícita ao utilizador pré-processador processa directivas; retira os comentários; agrupa ficheiros se tal for necessário, entre outras tarefas No sistema GNU C temos o cpp, the GNU C-Compatible Compiler Preprocessor compilador faz a análise do texto escrito na linguagem fonte e faz a sua transcrição para a linguagem destino, por razões de economia (possibilidade de escrever um compilador que seja adaptável a diferentes

11 O CONTEXTO DE UM COMPILADOR 7 sistemas computacionais destino) a linguagem destino é tão somente uma linguagem (genérica) intermediária No sistema GNU C temos o gcc, the GNU project C Compiler assembler faz a transcrição da linguagem intermédia para a linguagem final (máquina), e um que está fortemente ligado a um (e um só) sistema computacional loader/linker no caso de que se querer um executável os loader/linker fazem a junção do código máquina produzido pelas anteriores fases a um conjunto de serviços ( run-time routines ) que permitem a criação de um independente No sistema GNU C temos o ld, the GNU linker Graficamente: fonte (anotado) pré-processador fonte compilador objecto (intermédio) assembler objecto (final) loader/linker executável

8 CAPÍTULO 1 INTRODUÇÃO 12 Fases de um Compilador Um compilador pode-se dividir em duas fases: uma fase de análise na qual o texto do fonte é separado em todas as suas partes constituintes, e na qual se cria uma representação intermédia do fonte uma fase de síntese na qual se constroí o destino a partir da representação intermédia 121 Análise As fases de análise lexical, análise sintáctica, e análise semântica, formam a componente de análise de um compilador, também designado por front end Análise Lexical leitura da sequência de caracteres (ficheiro) que constituem o fonte, convertendo-a numa sequência de palavras Análise Sintáctica recebe a sequência de palavras da fase anterior e converte-a numa sequência de frases Análise Semântica recebe a sequência de frases da fase anterior e verifica a sua correcção semântica Vejamos um exemplo, seja a seguinte instrução de atribuição: posicao = inicial + incremento * 60 <eof> Na fase de análise léxica esta sequência de caracteres é separada numa lista de palavras: (posicao,=,inicial,+,incremento,*,60) os espaços foram ignorados De seguida temos a fase de análise sintáctica em que se tenta construir uma frase correcta com a lista de palavras produzidas pela fase anterior É usual construir-se uma estrutura em árvore para representar a frase obtida = posicao + inicial * incremento 60

12 FASES DE UM COMPILADOR 9 A forma como a árvore é construída é determinada por um conjunto de regras (diagramas de sintaxe do C, ) Finalmente tem-se a fase de análise semântica em que, no caso presente se vai tentar verificar a validade da frase no que diz respeito aos tipos das entidades utilizadas Por exemplo, se um dos identificadores presentes na expressão é do tipo real, então é necessário converter 60 para a sua representação real Obtinha-se a árvore seguinte: = posicao + inicial * incremento atof(60) 122 Tabela de Símbolos Uma das consequências do que se acabou de dizer é que a informação acerca das palavras que o contêm tem de fluir entre as várias fases do compilador A gestão da Tabela de Símbolos é pois de primordial importância, e vai cruzar todas as fases do compilador A tabela de símbolos vai conter uma entrada para cada uma das palavras que foram identificadas pelo analisador léxico contendo além da palavra propriamente dita todos os atributos que lhe são próprios 123 Gestão de Erros Outra tarefa que é comum a todas as fases do compilador é a da Gestão dos Erros Trata-se de detectar os erros enviando uma mensagem apropriada para o utilizador: local do erro; tipo do erro; causa provável Além disso, e para aumentar a produtividade, é importante tentar recuperar do erro automaticamente de forma a poder continuar a tarefa de compilação até ao máximo possível Por exemplo, ao detectar a falta de um ; entre duas instruções correctas o compilador deverá fazer a introdução automática da palavra em falta de forma a poder prosseguir com a compilação 124 Síntese As fases seguintes têm a ver com a geração do código, a fase de síntese é também designada por back end

10 CAPÍTULO 1 INTRODUÇÃO A fase de geração do código intermédio tem como objectivo a transformação da frase (árvore) construída na fase de análise numa frase numa linguagem (código) intermédio A finalidade da geração de um código intermédio em vez do código final tem a ver com a necessidade de tornar mais fácil a construção de compiladores para diferentes sistemas finais, até ao código intermédio o compilador é um que é independente de um dado sistema computacional, só na fase de geração do código final é que se vai passar a trabalhar ao nível de máquina alvo produzindo código para um só tipo de máquina As fases seguintes são a optimização do código na qual se pretende aplicar várias estratégias de optimização ao código anteriormente produzido, e a fase de geração do código máquina, na qual se faz a tradução do código intermédio para o código máquina do sistema alvo Graficamente temos: fonte análise lexical análise sintáctica gestão da tabela de símbolos análise semântica geração do código intermédio gestão dos erros optimização do código geração do código máquina destino