Trabalho de Fundamentos - Compiladores

5
1 Resumo - Este artigo apresenta uma visão do que é um compilador e as variáveis utilizadas no processo de compilação de forma a entender como são utilizados as gramáticas e linguagens durante este processo. Fizemos uso de uma metodologia baseada em analogias entre os conceitos de compiladores e o seu uso visando tornar a ferramenta mais atuante o processo de aprendizagem. Palavras Chave Compiladores - Linguagem Básico Linguagem Programação - Engenharia da Computação - Ciência da Computação - Tec.Informação. I. SIGLAS Token - em computação é um conjunto de caracteres (de um alfabeto, por exemplo) com um significado coletivo. Parcing em computação e linguística: análise de sintática ou é o processo de analisar uma sequência de expressão matemática. String sequência de caracteres. II. INTRODUÇÃO A computação está constantemente presente em nosso dia-a- dia, e com os avanços e melhorias surgiram inúmeras linguagens de programação, cada linguagem exige o seu tradutor/compilador. A partir da criação dos compiladores o ato de programar se tornou uma tarefa mais simples. Este processo de tradução é chamado compilação, que traduz a notação textual que é fácil de ser entendida por pessoas para instruções em linguagens de máquinas. III. OBJETIVOS O objetivo deste artigo é descrever o funcionamento de um compilador demostrando seus princípios básicos e fases de compilação em um âmbito teórico e generalizado. Demonstrando inclusive modelos conceituais de compiladores focando nas análises e sínteses. IV. BIBLIOGRAFIA A bibliografia complementar utilizada inclui os livros de Introdução aos fundamentos da Computação (Newton José Vieira [ISBN: 85-221-0508-1]), compiladores ALFRED V. AHO, Ravi Sethi, Jeffrey D. Ullman, Compiladores, Princípios, Técnicas e Ferramentas. (Editora LTC, p IX) e LOUDEN, Kenneth C. Compiladores Princípios e Práticas. São Paulo, Cengage Learning, 2004 Apesar da diversidade e da qualidade das obras acima referidas, a bibliografia básica (texto) usamos neste artigo referencias de artigos científicos para o enriquecimento do mesmo. V. COMPILADORES A. Compiladores Um compilador é um programa de computador (ou um grupo de programas) que, a partir de um código fonte escrito em uma linguagem compilada, cria um programa semanticamente equivalente, porém escrito em outra linguagem, código objeto. Ele é chamado compilador por razões históricas; nos primeiros anos da programação automática, existiam programas que percorriam bibliotecas de sub-rotinas e as reunia juntas, ou compilava, as subrotinas necessárias para executar uma determinada tarefa. [2] Um compilador também pode ser chamado de tradutor que recebe um dado de entrada em uma linguagem de programação denominada linguagem fonte e produz após seu processamento um programa escrito em uma linguagem de baixo nível como o Assembley ou até mesmo linguagem de máquina que é denominada linguagem alvo. Uma importante parte deste processo é a análise e detecção de erros no programa fonte como sintaxe e outros gerando relatórios ao usuário. Com isso o funcionamento básico de um compilador pode ser sintetizado no esquema abaixo. Fig. 1. Um Compilador. [1] COMPILADORES. Nomes dos integrantes do grupo: Anderson W. C. Pacheco, Camila D.C. Marçal, Daniel R. D. C e Viviane N. Alves. UNIPAC Lafaiete Fundação Presidente Antônio Carlos, Prof. Orientador Emerson R. A. Tavares

description

Compiladores

Transcript of Trabalho de Fundamentos - Compiladores

Page 1: Trabalho de Fundamentos - Compiladores

1

Resumo - Este artigo apresenta uma visão do que é um

compilador e as variáveis utilizadas no processo de

compilação de forma a entender como são utilizados as

gramáticas e linguagens durante este processo. Fizemos uso de

uma metodologia baseada em analogias entre os conceitos de

compiladores e o seu uso visando tornar a ferramenta mais

atuante o processo de aprendizagem.

Palavras Chave – Compiladores - Linguagem Básico –

Linguagem Programação - Engenharia da Computação -

Ciência da Computação - Tec.Informação.

I. SIGLAS

Token - em computação é um conjunto de caracteres (de

um alfabeto, por exemplo) com um significado

coletivo.

Parcing – em computação e linguística: análise de

sintática ou é o processo de analisar

uma sequência de expressão matemática.

String – sequência de caracteres.

II. INTRODUÇÃO

A computação está constantemente presente em nosso dia-a-

dia, e com os avanços e melhorias surgiram inúmeras

linguagens de programação, cada linguagem exige o seu

tradutor/compilador. A partir da criação dos compiladores o

ato de programar se tornou uma tarefa mais simples.

Este processo de tradução é chamado compilação, que traduz a

notação textual que é fácil de ser entendida por pessoas para

instruções em linguagens de máquinas.

III. OBJETIVOS

O objetivo deste artigo é descrever o funcionamento de um

compilador demostrando seus princípios básicos e fases de

compilação em um âmbito teórico e generalizado.

Demonstrando inclusive modelos conceituais de compiladores

focando nas análises e sínteses.

IV. BIBLIOGRAFIA

A bibliografia complementar utilizada inclui os livros de

Introdução aos fundamentos da Computação (Newton José

Vieira [ISBN: 85-221-0508-1]), compiladores ALFRED V.

AHO, Ravi Sethi, Jeffrey D. Ullman, Compiladores,

Princípios, Técnicas e Ferramentas. (Editora LTC, p IX) e

LOUDEN, Kenneth C. Compiladores Princípios e Práticas.

São Paulo, Cengage Learning, 2004

Apesar da diversidade e da qualidade das obras acima

referidas, a bibliografia básica (texto) usamos neste artigo

referencias de artigos científicos para o enriquecimento do

mesmo.

V. COMPILADORES

A. Compiladores

Um compilador é um programa de computador (ou um grupo

de programas) que, a partir de um código fonte escrito em

uma linguagem compilada, cria um programa semanticamente

equivalente, porém escrito em outra linguagem, código objeto.

Ele é chamado compilador por razões históricas; nos primeiros

anos da programação automática, existiam programas que

percorriam bibliotecas de sub-rotinas e as reunia juntas, ou

compilava, as subrotinas necessárias para executar uma

determinada tarefa. [2]

Um compilador também pode ser chamado de tradutor que

recebe um dado de entrada em uma linguagem de programação

denominada linguagem fonte e produz após seu processamento

um programa escrito em uma linguagem de baixo nível como o

Assembley ou até mesmo linguagem de máquina que é

denominada linguagem alvo.

Uma importante parte deste processo é a análise e detecção de

erros no programa fonte como sintaxe e outros gerando

relatórios ao usuário. Com isso o funcionamento básico de um

compilador pode ser sintetizado no esquema abaixo.

Fig. 1. Um Compilador. [1]

COMPILADORES. Nomes dos integrantes do grupo: Anderson W. C. Pacheco, Camila D.C. Marçal,

Daniel R. D. C e Viviane N. Alves.

UNIPAC Lafaiete – Fundação Presidente Antônio Carlos, Prof. Orientador Emerson R. A. Tavares

Page 2: Trabalho de Fundamentos - Compiladores

2

Para realizar as análises, o compilador deve ter ciência de

quais são os tokens apropriados da linguagem, assim como

suas palavras chaves e regras para o desenvolvimento de

identificadores. As técnicas de aperfeiçoar o código que são

usadas em compiladores devem, além de manter a definição do

programa original, ser capaz de capturar a maior parte das

possibilidades de avanço do código dentro de limites

plausíveis de esforços gastos para tal fim.

B. Gramáticas e Linguagens

O conceito de gramática será usado inicialmente como

ferramenta para descrever uma linguagem e

posteriormente como base para a construção dos

analisadores léxico sintático. Uma gramatica consiste

em um conjunto de regras que definem como derivar

determinada String de uma linguagem. As regras de

produção envolvem símbolos da linguagem e

variáveis que representam um conjunto de Strings.

S ABC

A aA | a

B bB | bb

C cC | ἔ

Um alfabeto é um conjunto de elementos finitos e não

vazios sendo assim um alfabeto é um conjunto de

símbolos e um símbolo é um elemento qualquer de

uma linguagem.

S = {1,2,3, ... , X}

S = {A, B, C}

Um algoritmo nada mais é do que uma receita que

mostra o passo a passo os procedimentos necessários

para uma determinada tarefa. De forma mais objetiva

um algoritmo é uma sequencia logica para se realizar

uma tarefa não se aplica apenas à computação, mas

sim qualquer planejamento que seja feito para se

chegar a um determinado objetivo.

Trocar uma lâmpada:

1º Comprar uma nova lâmpada.

2º Pegar uma escada.

3º Posicionar a escada.

4º Substituir a lâmpada pela nova.

5º Descer da escada.

Pode-se definir uma linguagem como sendo um

conjunto de elementos (símbolos) e um conjunto de

métodos (regras) para combinar estes elementos,

sendo usados e entendidos por uma determinada

comunidade. Sendo assim uma linguagem formal é

aquela que pode ser representada de forma finita e

precisa de acordo com sistemas de sustentação

matemática.

Autômatos são constituídos por um alfabeto, conjunto

de estados finitos, função de transição, estado inicial

e estados finais. Dessa forma um autômato pode ser

encarado como um reconhecedor de linguagens

regulares.

Figura 2: Modelo autômato. [1]

C. O processo de compilação

Os compiladores geralmente são divididos em analise e

síntese. Onde a analise consiste em uma serie partes que

formam uma representação intermediaria já a síntese constrói

o programa alvo a partir da análise.

Após a compilação é necessário uma seriem de programas para

tornar-se um programa alvo executável.

Figura 3: Compilação padrão. [1]

A “compilação” de um programa tipicamente envolve o

seguinte:

•Análise léxica: chamado "símbolos léxicos" (lexical

tokens), ou somente "símbolos" (tokens) é responsável por:

1. Ler o texto fonte, caracter a caracter;

2. Identificar os “elementos léxicos” da linguagem:

identificadores, palavras reservadas, constantes e

operadores;

3. Ignorar comentários, brancos e tabs;

4. Processar includes (se for o caso) e Análise Sintática.

Page 3: Trabalho de Fundamentos - Compiladores

3

Tabela 1: Análise Léxica

MONTANTE := DEPOSITO_INICIAL + TAXA_DE_JURUS * 60

PROCESSO Identificador Processo Símbolo Número

1 montante 2 : =

3 deposito_inicial 4 +

5 taxa_de_jurus 6 *

7 60

•Análise Sintática: responsável por identificar na sequência de

elementos léxicos as construções da linguagem.

Exemplo: para a sequência em Pascal, “ if a > b then a:=a-b

else b:=b-a”. A análise sintática deve idenficá-la como um

comando condicional, para a qual a condição é “a > b” e ao

qual estão associados os comandos “a := a-b” e “b := b-a”.

Figura 4: Modelo analise sintática [3]

•Análise Semântica: tem por objetivo verificar se as

construções identificadas pela análise sintática estão em

acordo com as “regras semânticas” da linguagem sendo

compilada e tem duas tarefas:

1. A Análise de contexto e a Geração de código;

2. Verificação de erros em frases que estão sintaticamente

corretos.

Exemplos: uma variável não declarada, uma multiplicação

entre tipos de dados diferentes e atribuição de um literal para

outro tipo, como um inteiro e uma string ou vice-versa.

•Tradução: após a leitura completa do código, identificando

variáveis e outros elementos e já conhecendo as literais do

código, é realizada a "tradução" do código em linguagem de

máquina.

D. Tradutores e Compiladores

A compilação difere da tradução porque ela faz alterações no

código, de forma a torná-lo otimizado. Enquanto uma linha é

sempre uma instrução na tradução, x linhas no código terão y

linhas de comandos de máquina, de acordo com o compilador.

Tradutores recebem um texto expresso em uma linguagem

fonte e geram um texto semanticamente equivalente em uma

linguagem destino.

– Java para x86

– x86 assembler

E. Assembler x Compilador

Um Assembler traduz de uma linguagem de montagem para o

código de máquina correspondente.

Uma instrução de máquina para cada instrução em Assembly

language.

Um compilador traduz de uma linguagem de alto nível para

uma linguagem de baixo nível.

Várias instruções de máquina para cada linha de comando da

linguagem de alto-nível.

F. Outros tipos de tradutores

• Tradutores entre linguagens de alto nível.

• Disassembler

• De(s)compilador

A análise léxica e a análise sintática tem papéis parecidos, já

que as duas tratam de sequências de “símbolos”. A separação

das duas em dois níveis de descrição e tratamento simplifica

não só a descrição da linguagem como também a

implementação do compilador.

G. Análise e síntese

O processo de síntese foi dividido em duas partes geração de

código intermediário, otimização de código e geração de

código.

A geração de código intermediário é o primeiro

processo da fase de síntese de compilação, mas em

alguns compiladores esse processo não é utilizado.

Este processo consiste em gerar um código

intermediário e explicito, nesta fase é importante que o

código seja fácil de produzir e fácil de traduzir no

programa alvo.

A principal diferença entre o código intermediário e o

código objeto final é que não são especificados

detalhes da máquina alvo, tal como quais

registradores serão usados, quais endereços de

memória serão referenciados e etc.

Na fase de otimização do código o compilador tenta

tornar o código intermediário mais eficiente possível.

Nos diferentes tipos de compiladores o número de

otimizações pode variar neste tipo de compilador uma

boa parte do tempo de compilação fica neste

processo. Entretanto, existe otimizações simples que

podem melhorar significativamente o tempo de

execução do programa alvo, sem prolongar tanto o

tempo de compilação.

Na geração do código, o processo de compilação todas

as análises e otimizações foram realizadas e

obtiveram sucesso. Este processo se inicia com a

entrada do código intermediário, e realiza a tradução

deste código geralmente em Assembley ou até mesmo

em código de máquina.

H. Fases de um compilador

Page 4: Trabalho de Fundamentos - Compiladores

4

Figura 5: Fases de um compilador. [1]

I. Gerenciamento da Tabela de Símbolos

Uma tabela de símbolos é uma estrutura utilizada em

compiladores para armazenar informações de identificadores,

tais como variáveis e funções. É utilizada em quase todas as

etapas do processo de compilação. Em cada fase pode ser

usada como base de comparação e até mesmo atualizada de

acordo com a saída de cada fase do processo.

Cada entrada na tabela de símbolos pode ser entendida como

um registro contendo campos com nome, tipo, classe,

tamanho, escopo, etc. que a qualificam.

J. Gerenciamento de erros e geração de relatórios

O tratamento de erros está voltado a falhas devido a muitas

causas: erros no compilador, erros na elaboração do programa

a ser compilado, erros no ambiente (hardware, sistema

operacional), dados incorretos, etc. As tarefas relacionadas ao

tratamento de erros consistem em detectar cada erro, reportá-lo

ao usuário e possivelmente fazer algum reparo para que o

processamento possa continuar.

A análise léxica e sintática tratam uma grande variedade de

erros. Quando são encontrados careceres remanescentes que

não formam qualquer token pertencentes à linguagem

geralmente estes são erros que devem ser tratados pelo

analisador léxico. Na análise sintática quando são encontrados

fluxos de tokens que violem as regras estruturais da linguagem

são tratados pelo analisador sintático.

K. Exemplos de Compiladores

Compiladores de Java:

Tabela 2: Compiladores Java

Nome Descrição

Eclipse Eclipse é uma IDE de código aberto

desenvolvido inicialmente pela IBM e

posteriormente doada para a comunidade

do software livre. Utilizada largamente,

tem grandes diferenciais como a

possibilidade de instalação de vários

plug-ins. Uma versão em português é

mantida no site oficial que é conhecida

como Eclipse Europa.

Jubile JBuilder é uma IDE para

desenvolvimento de aplicações mais

gráficas, a partir de JFames. O JBuilder

foi desenvolvido pela Borland (a mesma

que produz o C++ Builder) utilizando

tecnologias da comunidade do Eclipse

Europa. O site CodeGear que faz a

distribuição dos softwares da Borland

mantém duas versões: uma Enterprise

(pago) e a versão trial (mais básica,

porém gratuita). O problema maior do

JBuilder é para quem não tem internet de

banda larga, pois os arquivos de

downloads chegam a exagerados 1,8 Gb.

JEdit JEdit é um Ambiente de

Desenvolvimento Integrado criado pela

Xinox Software com o núcleo

desenvolvido por Slava Pestov.

Atualmente, distribuído sobre a licença

GPL 2.0 (software livre) tem uma

interface mais limpa e simples que outras

IDEs, bom para quem está começando.

JDeveloper IDE desenvolvido pela Oracle. Cobre

todo processo de produção do software

em java, desde o desenvolvimento do

código até a implantação do software.

Oferece uma ótima estrutura de UML

com diagramação do código.

NetBeans O compilador que faz parte da própria

gama de produtos da Sun Microsystems.

Com capacidade de programação em

vários ambientes como C++,

Desenvolvimento para sofwares de

celular (mobile), Ruby on Rails e vários

outros. Netbeans é uma ferramenta de

desenvolvimento Java poderosa, mas

todo este poder requer uma máquina não

muito modesta.

Page 5: Trabalho de Fundamentos - Compiladores

5

Compiladores de C e C++:

Tabela 3: Compiladores C e C++

Nome Descrição

Dev-

C++

Criado pela Bloodshed, o melhor para quem é

iniciante tanto na linguagem quanto na

programação. Tem suporte a projeto e boa interface

com o usuário. A desvantagem é a impossibilidade

de se criar projetos muito extensos. Apesar de

compilar a linguagem C, seu código é escrito em

um código totalmente diferente - o Delphi!

GCC Compilador utilizado pelo projeto GNU. É padrão

ANSI C e nativo do sistema Linux, facilitando

muito a vida de usuários Linux, pois não é preciso

instalar compiladores de terceiros. Seu único

problema é a falta de uma interface, que prejudica

quem é principiante na linguaguem.

C++

Builder

O C++ Builder é um dos melhores compiladores

que tem, com possibilidade de criação de projetos

extensos. A Borland mantém no site da Code Gear

duas versões: uma demo e outra paga. Ele segue o

padrão ISO ou ANSI C, mas também tem muitas

bibliotecas não padrão, fazendo muitas vezes com

que o programa perca a portabilidade e o código

escrito no C++ Builder não rode em outros

compiladores, mesmo que a linguagem C seja a

mesma.

Visual

C++

O visual C++ é um compilador profissional da

Microsoft que compõe o pacote Visual Studio,

com vários recursos, como incremento de código,

depurador de erros avançado e outras ferramentas

que aumentam a produtividade do programador. O

problema é que por ser da Microsoft tem o preço

elevado e só compensará se você for usar esta

linguagem para desenvolvimento profissional em

aplicações Windows. Tem uma versão trial no site

oficial.

VI. REFERÊNCIAS

[1] ALFRED V. AHO, Ravi Sethi, Jeffrey D. Ullman,

Compiladores, Princípios, Técnicas e Ferramentas. (Editora

LTC, p IX).

[5] LOUDEN, Kenneth C. Compiladores Princípios e Práticas.

São Paulo, Cengage Learning, 2004

[2] Wikipédia, a enciclopédia livre.

[3]https://commons.wikimedia.org/wiki/File:Parsing-

example.png#/media/File:Parsing-example.png

[4]https://pt.scribd.com/doc/268129330/TeoriaComputacaoNo

vo

[5] IEEE Copyright Form.

VII. CONCLUSÕES

O objetivo principal do presente artigo é a visão e

entendimanto de como são utilizados as gramáticas e

linguagens no processo de compilaçao.

Os resultados alcançados com a prática dessa metodologia,

não só confirmam as suposições iniciais, como também

apontam para a melhoria do entendimento de compiladores,

gramática e linguagens ao desempenho dos acadêmicos.

Dentre os benefícios obtidos podemos destacar os seguintes:

Aprendizado mais abrangente, mais profundo e mais efetivo

tanto do conteúdo relativo à disciplina de Linguagens Formais

e Compiladores quanto da disciplina de Construção de

Compiladores.