Compilador

Origem: Wikipédia, a enciclopédia livre.

Nota: "Compilação" redirige para este artigo. Se procura "compilação musical" veja Coletânea musical

O processo da compilação.

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.

O nome "compilador" é usado principalmente para os programas que traduzem o código de fonte de uma linguagem de programação de alto nível para uma linguagem de programação de baixo nível (por exemplo, linguagem de montagem assembly ou código de máquina). Um programa que traduz uma linguagem de programação de baixo nível para uma linguagem de programação de alto nível é um descompilador. Um programa que faz uma tradução entre linguagens de alto nível é normalmente chamado um tradutor, filtro[1] ou conversor de linguagem. Um programa que faz uma tradução entre uma linguagem de montagem e o código de máquina é denominado montador[1]. Um programa que faz uma tradução entre o código de máquina e uma linguagem de montagem é denominado desmontador.

Em português, Compilar significa por exemplo: Reunir obras literárias, documentos, escritos de vários autores, entre outros, compondo uma obra com esse material.

Um compilador é um dos dois tipos mais gerais de tradutores, sendo que o segundo tipo que a ele deve ser comparado é um interpretador.

Índice

[editar] Características Gerais

Normalmente, o código fonte é escrito em uma linguagem de programação de alto nível, com grande capacidade de abstração, e o código objeto é escrito em uma linguagem de baixo nível, como uma sequência de instruções a ser executada pelo processador.

O processo de compilação é composto de análise e síntese. A análise tem como objetivo entender o código fonte e representá-lo em uma estrutura intermediária. A síntese constrói o código objecto a partir desta representação intermediária.

A análise pode ser subdividida ainda em análise léxica, análise sintática e análise semântica. A síntese é mais variada, podendo ser composta pelas etapas de geração de código intermediário, optimização de código e geração de código final (ou código de máquina), e somente esta última etapa é obrigatória.

Classicamente, um compilador traduz um programa de uma linguagem textual facilmente entendida por um ser humano para uma linguagem de máquina, específica para um processador e sistema operacional. Atualmente, porém, são comuns compiladores que geram código para uma máquina virtual que é, depois, interpretada por um interpretador.

Em linguagens híbridas, o compilador tem o papel de converter o código fonte em um código chamado de byte code, que é uma linguagem de baixo nível. Um exemplo deste comportamento é o do compilador da linguagem Java que, em vez de gerar código da máquina hospedeira (onde se está executando o compilador), gera código chamado Java Bytecode.

Um compilador é chamado de Just-in-time compiler (JIT) quando seu processo de compilação acontece apenas quando o código é chamado. Normalmente, o usuário tem a percepção que um compilador JIT é um interpretador.

Muitos compiladores incluem um pré-processador. Um pré-processador normalmente é responsável por mudanças no código fonte destinadas de acordo com decisões tomadas em tempo de compilação. Por exemplo, um programa em C permite instruções condicionais para o pré-processador que podem incluir ou não parte do código caso uma assertiva lógica seja verdadeira ou falsa, ou simplesmente um termo esteja definido ou não. Tecnicamente, pré-processadores são muito mais simples que compiladores e são vistos, pelos desenvolvedores, como programas à parte, apesar dessa visão não ser necessariamente compartilhada pelo usuário.

Outra parte separada do compilador que muitos usuários vêem como integrada é o linker, cuja função é unir vários programas já compilados de uma forma independente e unificá-los em um programa executável. Isso inclui colocar o programa final em um formato compatível com as necessidades do sistema operacional para carregá-lo em memória e colocá-lo em execução.

[editar] Fases da Compilação

[editar] Análise Léxica

Artigo principal: Análise Léxica

A análise léxica é a primeira fase do compilador. A função do analisador léxico, também denominado scanner, é ler o código fonte, caracter a caracter, buscando a separação e identificação dos elementos componentes do programa fonte, denominados símbolos léxicos ou tokens[2]. É também de responsabilidade desta fase a eliminação de elementos "decorativos" do programa, tais como espaços em branco, marcas de formatação de texto e comentários[3].

[editar] Análise Sintática

A análise sintática, ou análise gramatical é o processo de se determinar se uma cadeia de símbolos léxicos pode ser gerada por uma gramática[4]. No caso de analisadores sintáticos top-down, temos a opção de escrevê-los à mão ou gerá-los de forma automática, mas os analisadores bottom-up só podem ser gerados automaticamente [5]. A maioria dos métodos de análise sintática, cai em uma dessas duas classes denominadas top-down e botton-up. Entre os métodos top-down os mais importantes são a análise sintática descendente recursiva e a análise sintática preditiva não-recursiva. Entre os métodos de análise sintática bottom-up os mais importantes são a análise sintática de precedência de operadores, análise sintática LR canônico, análise sintática LALR e análise sintática SLR[4].

[editar] Análise Semântica

Artigo principal: Análise semântica

As análises léxica e sintática, não estão preocupadas com o significado ou semântica dos programas que elas processam. O papel do analisador semântico é prover métodos pelos quais as estruturas construídas pelo analisador sintático possam ser avaliadas ou executadas[6]. As gramáticas livres de contexto não são suficientemente poderosas para descrever uma série de construções das linguagens de programação, como por exemplo regras de escopo, regras de visibilidade e consistência de tipos[7]. É papel do analisador semântico assegurar que todas as regras sensíveis ao contexto da linguagem estejam analisadas e verificadas quanto à sua validade. Um exemplo de tarefa própria do analisador semãntico é a checagem de tipos de variáveis em expressões[8]. Um dos mecanismos comumente utilizados por implementadores de compiladores é a Gramática de Atributos, que consiste em uma gramática livre de contexto acrescentada de um conjunto finito de atributos e um conjunto finito de predicados sobre estes atributos[9].

[editar] Geração de Código Intermediário

Artigo principal: Geração de código

Na fase de geração de código intermediário, ocorre a transformação da árvore sintática em uma representação intermediária do código fonte. Um tipo popular de linguagem intermediária é conhecido como código de três endereços. Neste tipo de código uma sentença típica tem a forma X := A op B, onde X,A e B são operandos e op uma operação qualquer. Uma forma prática de representar sentenças de três endereços é através do uso de quádruplas (operador, argumento-1, argumento-2 e resultado). Este esquema de representação de código intermediário é preferido por diversos compiladores, principalmente aqueles que executam extensivas otimizações de código, uma vez que o código intermediário pode ser rearranjado de uma maneira conveniente com facilidade[10].

[editar] Optimização de Código

Artigo principal: Optimização de Código

A Optimização de código é a estratégia de examinar o código intermediário, produzido durante a fase de geração de cógigo com objetivo de produzir, através de algumas técnicas, um código que execute com bastante eficiência[8]. O nome optimizador deve sempre ser encarado com cuidado, pois não se pode criar um programa que leia um programa P e gere um programa equivalente sendo melhor possível segundo o critério adotado[3]. Várias técnicas e várias tarefas se reúnem sob o nome de Optimização. Estas técnicas consistem em detectar padrões dentro do código produzido e substituí-los por códigos mais eficientes[10]. Entre as técnicas usadas estão a substituição de expressões que podem ser avaliadas durante o tempo de compilação pelos seus valores calculados, eliminação de sub-expressões redundantes, desmembramento de laços, substituição de operações (multiplicação por shifts), entre outras[8]. Uma das técnicas de optimização mais eficazes e independente de máquina é a otimização de laços, pois laços internos são bons candidatos para melhorias. Por exemplo, em caso de computações fixas dentro de laços, é possível mover estas computações para fora dos mesmos reduzindo processamento[11].

[editar] Geração de Código Final

Artigo principal: Geração de código

A fase de geração de código final é a última fase da compilação. A geração de um bom cógigo objeto é difícil devido aos detalhes particulares das máquinas para os quais o código é gerado. Contudo é uma fase importante, pois uma boa geração de código pode ser, por exemplo, duas vezes mais rápida que um algoritmo de geração de código ineficiente[10]. Nem todas as técnicas de optimização são independentes da arquitetura da máquina-alvo. Optimizações dependentes da máquina necessitam de informações tais como os limites e os recursos especiais da máquina-alvo a fim de produzir um código mais compacto e eficiente. O código produzido pelo compilador deve se aproveitar dos recursos especiais de cada máquina-alvo[8].

[editar] Bibliografia

  • Aho, Alfred V.; Ullman, Jeffrey D.. The Theory of Parsing, Translation, and Compiling, Vol. 1, Parsing. Englewood Cliffs, New Jersey, EUA: Prentice Hall, 1972. 542 p. 2 v. v. 1. ISBN 0-13-914556-7
  • Aho, Alfred V.; Ullman, Jeffrey D.. The Theory of Parsing, Translation, and Compiling, Vol. 2, Compiling. Englewood Cliffs, New Jersey, EUA: Prentice Hall, 1972. 460 p. 2 v. v. 2. ISBN 0-201-914564-8
  • Aho, Alfred V.; Ullman, Jeffrey D.. Principles of Compiler Design. Reading, Massachusetts, EUA: Addison-Wesley, 1977. 604 p. ISBN 0-201-00022-9
- Primeiro livro conhecido como livro do dragão, devido à figura na sua capa antes do advento do livro Compilers: Principles, Techniques, and Tools dos mesmos autores.
- Conhecido como livro do dragão, devido à figura na sua capa.
- Há uma edição BEM mais nova, de 2006: ISBN 0-321-48681-1
  • Alblas, Henk; Nymeyer, Albert. Practice and Principles of Compiler Building with C. London: Prentice Hall, 1996. 427 p. ISBN 0-13-349267-2
- Este livro é editado para 3 tipos de linguagens (ML, Java e C) e em dois tipos de edicão (padrão e apenas as técnicas básicas).
  • Brown, P. J.. Writing Interactive Compilers and Interpreters. Chichester: John Wiley & Sons, 1979. 265 p. ISBN 0-471-27609-X
  • Crespo, Rui Gustavo. Processadores de Linguagens: da Concepção à Implementação. Lisboa, Portugal: IST Press, 1998. 435 p. ISBN 972-8469-01-2
- Excelente livro sobre compiladores editado pelo Instituto Superior Técnico.
  • Fischer, Charles N.; LeBlanc, Jr, Richard J.. Crafting a Compiler with C. Redwood City, California: Benjamin Cummings Publishing, 1991. 812 p. ISBN 0-8053-2166-7
- Lançado em português, pela Campus, com ISBN 85-352-0876-3.
  • Holmes, Jim. Object-Oriented Compiler Construction. Englewood Cliffs, New Jersey: Prentice Hall, 1995. 483 p. ISBN 0-13-630740-X
  • Holub, Allen I.. Compiler Design in C. Englewood Cliffs, New Jersey: Prentice Hall, 1990. 924 p. ISBN 0-13-155045-4
  • Hunter, Robin. Compiladores: Sua Concepção e Programação em Pascal. Lisboa: Presença, 1987. 323 p.
  • Kakde, O. G.. Algorithms for Compiler Design. Hingham: Charles River media, 2003. 334 p. ISBN 81-7008-100-6
  • Kaplan, Randy M.. Constructing Language Processors for Little Languages. New York: John Wiley & Sons, 1994. 452 p. ISBN 0-471-59754-6
  • Kowaltowski, Tomasz. Implementação de Linguagens de Programação. Guanabara Dois, 1983. ISBN 85-7030-009-3
  • Lee, John A. N.. The Anatomy of a Compiler. New York: Reinhold Publishing Company, 1967. 275 p. Library of Congress Catalog Card Number: 67-29207
- Livro antigo. Interessante por aspectos de compilação de comandos do Fortran como 'DO' e aspectos da máquina IBM 1401.
  • Lemone, Karen A.. Fundamentals of Compilers: An Introduction to Computer Language Translation. Boca Raton: CRC, 1992. 184 p. ISBN 0-8493-7341-7
  • Levine, John R.. Linkers & Loaders. San Francisco: Morgan Kaufmann Publishers, 2000. 256 p. ISBN 1-55860-496-0
  • Louden, Kenneth C.. Compiladores: Princípios e Práticas. São Paulo: Pioneira Thompson Learning, 2004. 569 p. ISBN 85-221-0422-0
  • Mak, Ronald. Writing Compilers and Interpreters: An Applied Approach Using C++. New York: John Wiley and Sons, 1996. 838 p. ISBN 0-471-11353-0
  • Metsker, Steven John. Building Parsers with Java. Boston: Addison-Wesley, 2001. 371 p. ISBN 0-201-71962-2
  • Muchnick, Steven S.. Advanced Compiler Design Implementation. San Francisco, California: Morgan Kaufmann Publishers, 1997. 856 p. ISBN 1-55860-320-4
  • Neto, João José. Introdução à Compilação. Rio de Janeiro: LTC, 1987. 222 p. ISBN 85-216-0483-1
  • Parsons, Thomas W.. Introduction to Compiler Construction. New York, EUA: Computer Science Press, 1992. 359 p. ISBN 0-7167-8261-8
  • Pittman, Thomas; Peters, James. The Art of Compiler Design: Theory and Practice. Englewood Cliffs, New Jersey, EUA: Prentice Hall, 1992. 419 p. ISBN 0-13-048190-4
  • Price, Ana M. A.; Toscano, Simão Sirineo. Implementação de Linguagens de Programação: Compiladores: Série de Livros Didáticos Número 9. Porto Alegre: Sagra Luzzatto, 2000. 195 p. ISBN 85-241-0639-5
  • Pyster, Arthur B.. Compiler Design and Construction: Tools and Techniques. New York, EUA: Van Nostrand Reinhold Company, 1988. 267 p. ISBN 0-442-27536-6
- Contém o exemplo de um mini-pré-processador para a linguagem C: Ginevra.
  • Ricarte, Ivan. Introdução à Compilação. Rio de Janeiro: Campus, Elsevier, 2008. 264 p. ISBN 978-85-352-3067-3
  • Terry, Patrick D.. Programming Language Translation: A Practical Approach. Wokingham: Addison-Wesley, 1986. 443 p. ISBN 0-201-18040-5
  • Tremblay, Jean-Paul; Sorenson, Paul G.. The Theory and Practice of Compiler Writing. New York: McGraw-Hill, 1989. 796 p. ISBN 0-07-065161-2
  • Waite, William M.; Goos, Gerhard. Compiler Construction. New York: Springer-Verlag, 1984. 446 p. ISBN 0-387-90821-8
  • Watson, Des. High-Level Languages and Their Compilers. Wokingham, England: Addison-Wesley, 1989. 337 p. ISBN 0-201-18489-3
  • Watt, David A.; Brown, Deryck F.. Programming Language Processors in Java. Harlow, England: Prentice Hall, 2000. 436 p. ISBN 0-130-25786-9
  • Wilhelm, Reinhard; Maurer, Dieter. Compiler Design. Harlow, England: Addison-Wesley, 1995. 606 p. ISBN 0-201-42290-5
- Veja o texto completo deste livro em formato PDF.
  • LAROUSSE CULTURAL. DICIONÁRIO DA LINGUA PORTUGUESA. NOVA CULTURAL LTDA, 1992. ISBN 85-85222-23-9

Referências

  1. 1,0 1,1 Neto, João José. Introdução à Compilação. Rio de Janeiro: LTC, 1987. 222 p. ISBN 85-216-0483-1
  2. Price, Ana M. A.; Toscano, Simão Sirineo. Implementação de Linguagens de Programação: Compiladores: Série de Livros Didáticos Número 9. Porto Alegre: Sagra Luzzatto, 2000. 195 p. ISBN 85-241-0639-5
  3. 3,0 3,1 Compiladores - Página de José Lucas Mourão Rangel Netto (em português). PUC-Rio. Página visitada em 21 de junho de 2009.
  4. 4,0 4,1 Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D.. Compilers: Principles, Techniques and Tools. Reading, Massachusetts, EUA: Addison-Wesley, 1986. 796 p. ISBN 0-201-10088-6
  5. Grune, Dick; Bal, Henri E.; Jacobs, Ceriel J. H.; Langendoen, Koen G. Projeto Moderno de Compiladores. Campus, 2001. ISBN 85-352-0876-3
  6. Watson, Des. High-Level Languages and Their Compilers. Wokingham, England: Addison-Wesley, 1989. 337 p. ISBN 0-201-18489-3
  7. Wilhelm, Reinhard; Maurer, Dieter. Compiler Design. Harlow, England: Addison-Wesley, 1995. 606 p. ISBN 0-201-42290-5
  8. 8,0 8,1 8,2 8,3 Tremblay, Jean-Paul; Sorenson, Paul G.. The Theory and Practice of Compiler Writing. New York: McGraw-Hill, 1989. 796 p. ISBN 0-07-065161-2
  9. Pittman, Thomas; Peters, James. The Art of Compiler Design: Theory and Practice. Englewood Cliffs, New Jersey, EUA: Prentice Hall, 1992. 419 p. ISBN 0-13-048190-4
  10. 10,0 10,1 10,2 Aho, Alfred V.; Ullman, Jeffrey D.. Principles of Compiler Design. Reading, Massachusetts, EUA: Addison-Wesley, 1977. 604 p. ISBN 0-201-00022-9
  11. Kakde, O. G.. Algorithms for Compiler Design. Hingham: Charles River media, 2003. 334 p. ISBN 81-7008-100-6

[editar] Ver também

[editar] Ligações externas


Este artigo é um esboço sobre Programação. Você pode ajudar a Wikipédia expandindo-o.
Ferramentas pessoais
Criar um livro