Você está na página 1de 2

Departamento de Eletrônica da Universidade Tecnológica Federal do Paraná

Prof. Bertoldo Schneider Jr.


Resumo sobre o conceito de Compilação

Quando se fala em programas, geralmente se está falando dos códigos-


fonte escritos em linguagens de programação de alto nível, i.e., com um nível
de abstração muito grande, mais próximo do modo de pensar de nosso cérebro
do que das máquinas. Em oposição, um código objeto ou código executável é
um código feito numa linguagem de baixo nível de abstração, muito mais próxima
do modo de funcionamento das máquinas do que do raciocínio humano.
Quando se fala em programação, existem duas maneiras de se
transformar um programa escrito em uma linguagem de programação qualquer
em um código capaz de ser executado por um dispositivo computacional. Uma
delas é através de um compilador, que gera um código executável que pode ser
executado a qualquer momento por determinada arquitetura. A outra é através do
interpretador, onde o código-fonte geralmente é interpretado e executado (linha a
linha, conforme vai executando) somente no instante em que se precisa do
mesmo. Existem compiladores que “compilam” somente quando o código fonte é
“chamado”, processo facilmente confundível com o interpretador. O C e o C++ são
linguagem “compiladas” enquanto o Javascript e o C# são “interpretadas.

Um compilador é um programa que transforma um “código fonte” (código


escrito em uma linguagem de programação) em um outro código, chamado
“código objeto”, para uma determinada arquitetura (hardware específico ou
genérico). Para fazer isso, o compilador atravessa algumas etapas definidas,
como:

1.- Identificação de Tokens: Tokens (estruturas de retorno: Um token é uma


seqüência de um ou mais caracteres (caracter, segmento de texto ou símbolo) que
possuem um significado (absoluto ou relativo ao contexto: por exemplo, o * tem
um significado quando é operador unário e outro quando binário) conhecido (por
um parser) dentro da gramática da linguagem utilizada.

2- Análise: O objetivo da análise é entender o código fonte e representá-lo em


uma forma intermediária, fornecendo todos os subsídios necessários para a
síntese e pode ser subdividida ainda em análise léxica, análise sintática e análise
semântica.
2.1.- Análise léxica: A análise léxica transforma o código fonte em uma seqüência
de símbolos léxicos (lexical tokens) para que o compilador possa manipulá-los
mais facilmente. Ela também verifica se todos os tokens são reconhecíveis, i.e., se
pertencem à linguagem ou foram construídos conforme as regras gramaticais da
mesma (é nesta fase que são detectados strings que foram mal escritos como por
exemplo, quando se troca “printf” por “print” em linguagem C.

O analisador léxico funciona em dois estágios: No primeiro estágio, os caracteres


são lidos um a um e reconhecidos (ou não) para formarem o conjunto léxico do
programa. No segundo estágio, cada léxico é valorado e tipificado, i.e., cada
elemento recebe valor e tipo (ou demais atributos), quando passam a constituir um
símbolo (nesta etapa, parênteses não têm valor algum e não retornam nada nesta
Departamento de Eletrônica da Universidade Tecnológica Federal do Paraná
Prof. Bertoldo Schneider Jr.
análise). Neste ponto, os tokens são renomeados apropriadamente, aumentando a
eficiência da programação, e o analisador passa a fase da análise sintática. Este
processo é um dos mais demorados da compilação.

2.2.- Análise sintática: O analisador sintático é que dá significado às seqüências


de tokens, analisando a relação entre os mesmos dentro de cada declaração
(frase). Logo após, o compilador procede a análise semântica.

2.3.- Análise semântica: A análise semântica, terceira fase da compilação, é


onde se analisa o significado de cada elemento em relação à declaração e onde
se detecta os erros semânticos, tais como o uso incorreto de variáveis de tipos
diferentes numa multiplicação. Terminada esta fase, tem-se a representação
intermediária do processo e o compilador dá início à geração do código objeto
intermediário, primeira fase da síntese.

3.- Síntese: A síntese constrói o código objeto a partir desta representação


intermediária, nas seguintes etapas, não necessariamente obrigatórias.
3.1.- Geração do código objeto intermediário:
3.2.- Otimização do Código intermediário, para uma determinada arquitetura X.
Por isso mesmo, o compilador é conhecido como compilador para arquitetura X
(Um hardware específico e um sistema operacional específico).
3.3.- Geração do programa executável, escrito no código da máquina na qual se
quer rodar o programa.

Resumo:
Código Fonte (em txt) -> Análise Sintática, Léxica e Semântica -> Geração de
código intermediário ->> Otimização de código ->> Código objeto otimizado para
arquitetura x ->> programa executável (código de máquina), ou pré-executável,
quando há necessidade de se usar o linker.

Ligador ou Linker: Separadamente do compilador, há um outro programa cuja


função é “ligar” vários objetos, programas, sub-programas, rotinas, funções já
independente e previamente compilados para unificá-los coerentemente num
único programa executável.

Declaração (declaration or statement): é uma oração completa conforme as


regras gramaticais de uma determinada linguagem. Por exemplo, “x=a+sqrt(y);” é
uma declaração completa, terminada em “;”.

Você também pode gostar