Un **compilador** é un Programa informático que transforma o código fonte (código escrito normalmente nunha linguaxe de alto nivel) nunha secuencia de instrucións (programa) que será executada por un sistema computacional. O código de alto nivel tamén se designa como código fonte ou *source code*. O código compilado designase como código obxecto ou *obxect code*.

Características
---------------

A arquitectura convencional dun compilador divídese en Análise e Síntese. A *análise* pode ser subdividida á súa vez en análise léxica, análise sintáctica e análise semántica. A *Síntese* é máis variada, podendo estar composta polas etapas de xeración de código intermedio, optimización de código e xeración de código final (ou código máquina). Só esta última etapa é obrigatoria.

Nas linguaxes de programación híbridas, o **compilador** ten o papel de converter o código fonte nun código chamado de "byte code", que é unha linguaxe de baixo nivel. Un exemplo deste comportamento é o do compilador da linguaxe Java que, en vez de xerar código da máquina hóspede (onde se está executando o compilador), xera un código universal, entendible por calquera "intérprete Java", chamado *Java Byte Code*.

Un compilador é un dos dous tipos máis xerais de tradutores, sendo que o segundo tipo que a el debe compararse é un intérprete.

Normalmente, o código fonte está escrito nunha linguaxe de programación de alto nivel, con gran capacidade de abstracción, e o código obxecto nunha linguaxe de baixo nivel, como unha secuencia de instrucións a executar pola CPU(s).

O proceso de compilación componse de análise e síntese. A análise ten como obxectivo entender o código fonte e representalo nunha estrutura intermedia. A síntese constrúe o código obxecto a partir desta representación intermedia.

A *análise* pode ser subdividida aínda en análise léxica, análise sintáctica e análise semántica. A *síntese* é máis variada, podendo estar composta polas etapas de xeración de código intermedio, optimización de código e xeración de código final (ou código máquina), e soamente esta última etapa é obrigatoria.

Clasicamente, un compilador traduce un programa dunha linguaxe textual facilmente entendida por un ser humano para unha linguaxe de máquina, específica dun procesador e sistema operativo. Porén, son comúns os compiladores que xeran código para unha máquina virtual que é, despois, procesada por un intérprete.

En linguaxes de programación híbridas, o compilador ten o papel de converter o código fonte nun código chamado *byte code*, que é unha linguaxe de baixo nivel. Un exemplo deste comportamento é o do compilador da linguaxe Java que, en vez de xerar código da máquina hospedeira (onde se está executando o compilador), xera código chamado  *Java Bytecode*.

Un compilador chámase de *compilador Just in Time* (JIT) cando o seu proceso de compilación ocorre xusto cando se chama ao código. Normalmente, o usuario ten a percepción de que un compilador JIT é un intérprete.

Moitos compiladores inclúen preprocesadores. Un preprocesador normalmente é responsábel das mudanzas no código fonte destinadas de acordo coas decisións tomadas en tempo de compilación. Por exemplo, un programa en C permite instrucións condicionais para o preprocesador que, ao preprocesarse, incluirá ou non parte do código segundo que unha asertiva lóxica sexa verdadeira ou falsa, ou simplemente un termo estea definido ou non. Tecnicamente, os preprocesadores son moito máis simples que os compiladores e vense polos desenvolvedores como programas á parte, a pesar de que esa visión non sexa necesariamente compartida polo usuario.

Outra parte separada do compilador que moitos usuarios ven como integrada é o linker, coa función de unir varios programas xa compilados dunha forma independente e unificalos nun programa executábel. Iso inclúe colocar o programa final nun formato compatíbel coas necesidades do sistema operativo para cargalo en memoria e colocalo en execución.

Véxase tamén
------------

### Outros artigos

* Compilar.
* Informática.
* Compilador Just in Time.
* Linguaxes de Programación.
* Intérpretes.
* Linker.

|  |  |
| --- | --- |
| Control de autoridades | 
* Wd: Q47506
* BNCF: 2330
* BNE: XX532454
* BNF: 120631538
* BRE: 2087056
* EBID: ID
* GEC: 0170217
* GND: 4148248-7
* JSTOR: compilers
* LCCN: sh86007588
* MAG: 9957790
* NDL: 01191219
* PSH: 12469
* Treccani: compilatore

 |