Trabalho de Fundamentos - Compiladores
-
Upload
viviane-alves -
Category
Documents
-
view
216 -
download
0
description
Transcript of 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
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.
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
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.
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.