# Introdução à Teoria dos Compiladores/Definições

Sabe-se que um computador só compreende comandos baseados em linguagem binária, porém, mesmo os programas mais simples exigiriam um nível de abstração muito grande do programador, além de desprender muito tempo. A Teoria dos Compiladores tem como objetivo estudar e definir os parâmetros que permitem a construção de linguagens de programação e sua execução.

## Compilador
### O que é um compilador

Um compilador é um programa (ou um conjunto de programas) que traduz um código fonte para uma linguagem de mais baixo nível (a linguagem alvo, que tem uma forma binária conhecida como código objeto). 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 compilador é um dos dois tipos mais gerais de tradutores, juntamente com o interpretador.

### Componentes de um compilador

A construção de um compilador é dividida em partes, cada uma com uma função especifica:
* Analisador Léxico (AL): separa no programa fonte cada símbolo que tenha algum significado para a linguagem ou avisa quando um símbolo que não faz parte da linguagem é encontrado.
* Análise Sintática (AS): é o responsável por verificar se a seqüência de símbolos existentes no programa fonte formam um programa válido ou não. É construído sobre uma gramática composta de uma série de regras que descrevem quais são as construções válidas da linguagem.
* Análise Semântica (ASE): irá verificar se os aspectos semânticos estão corretos, ou seja, se não existem incoerências quanto ao significado das construções utilizadas pelo programador. A ASE depende de uma tabela de símbolos onde são armazenadas as informações de variáveis declaradas, funções ou métodos, entre outros.
* Geração e Otimização de Código (GC): após a verificação que não existem erros sintáticos ou semânticos, o compilador realiza a sua tarefa de criar o programa objeto que reflete, mediante instruções de baixo nível, os comandos do programa fonte. Também pode fazer a otimização do código, onde são aplicadas diversas técnicas para otimizar algumas características do programa objeto, como o seu tamanho ou sua velocidade.

### Pré-processador

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. bla

### Linker

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.

## Interpretador
### Bytecode

Como vimos, 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 um sistema operacional.
Em linguagens de programação híbridas, o compilador tem o papel de converter o código fonte em um código chamado de Bytecode (código em bytes), que é um estágio intermediário entre o código-fonte (escrito numa linguagem de programação específica) e a aplicação final.
Para executar o bytecode utilizamos uma máquina virtual, que serve para interpretar e executar o bytecode.
As principais vantagens do bytecode são:
* Portabilidade (Independecia de Sistema Operacional) — pois o bytecode roda na máquina virtual, e não no Sistema Operacional do equipamento.
* Não-necessidade do pré-processamento, típico dos compiladores.
O bytecode é encarado como um produto final, cuja validação da sintaxe e tipos de dados (entre outras funções dos compiladores) não será necessária.
Como exemplo de linguagens que utilizam bytecode temos: Java, C# e Lua.

## Just-In-Time Compiler (JIT)

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.
* Esta página é somente um esboço. Ampliando-a você ajudará a melhorar a Wikiversidade.