2

Compilador é um software que decodifica um arquivo texto e gera um novo arquivo contendo instruções do processador

O arquivo original não é necessariamente texto, assim como o resultado pode não ser específico do processador. Só para dar um exemplo rápido, escrevi aqui sobre como funciona em Java:

Inicialmente temos o código fonte (o arquivo .java). Ao compilá-lo, é gerado um arquivo .class, contendo o bytecode, que não deixa de ser "binário". Lembrando que aqui o termo "binário" geralmente quer dizer que "não é texto" - porque se formos levar ao pé da letra, tudo no computador vira binário no fim das contas (até texto), mas para o caso em questão, vamos considerar que binário é "um monte de bytes que não correspondem a um texto".

Ou seja, o .class já é um tipo de "binário". Ele contém o bytecode, que são as instruções que serão interpretadas pela máquina virtual (a JVM - Java Virtual Machine). Só que a JVM possui outro compilador (mais precisamente, um JIT - Just In Time compiler), que pode pegar trechos do bytecode e compilar novamente, gerando código de máquina específico da plataforma/sistema operacional no qual ela está rodando. Na verdade é mais complexo que isso, veja mais detalhes aqui.

Ou seja, a partir do código fonte, é gerado o bytecode (um tipo de arquivo "binário"), que por sua vez pode ser transformado em código de máquina nativo (dependente da plataforma/arquitetura/processador/sistema operacional/etc), e portanto é "outro binário".

Ou seja, o compilador Java trabalha com texto (o código fonte) e transforma em bytecode (instruções da JVM - a máquina virtual Java - que não são específicas de nenhum processador). E dentro da JVM tem outro compilador que não trabalha com texto, e sim com bytecode: é ele que converte o bytecode (que não é texto) para código específico do processador.


Pra complicar um pouco mais, existe ainda o transpilador, que também é chamado de "source to source compiler", ou seja, traduz código de uma linguagem para outra (converte texto para outro texto). Não deixa de ser um tipo específico de compilador. O exemplo mais famoso hoje é o TypeScript, cujo código é transpilado para JavaScript.

E como já dito por outros, hoje em dia as coisas estão mais complicadas e misturadas, em muitos casos é difícil traçar uma linha onde começa um e termina o outro. Como muita coisa na nossa área, os termos não possuem definições "oficiais", cada um usa de um jeito, e muitas fontes acabam chamando as coisas por nomes diferentes ou fazendo distinções que nem sempre se aplicam.


Por fim, escrevi este post que explica esses conceitos em detalhes.

Carregando publicação patrocinada...