Um compilador é um programa especial que processa declarações escritas em uma determinada linguagem de programação e as transforma em linguagem de máquina ou "código" que o processador de um computador usa. Tipicamente, um programador escreve declarações de linguagem em uma linguagem como Pascal ou C uma linha por vez usando um editor. O arquivo que é criado contém o que é chamado de source statements. O programador então executa o compilador da linguagem apropriada, especificando o nome do arquivo que contém as instruções fonte.
Ao executar (running), o compilador primeiro analisa (ou analisa) todas as instruções de linguagem sintaticamente uma após a outra e então, em um ou mais estágios sucessivos ou "passes", constrói o código de saída, certificando-se de que instruções que se referem a outras instruções sejam referenciadas corretamente no código final. Tradicionalmente, a saída da compilação tem sido chamada object code ou às vezes um módulo object module . (Note que o termo "object" aqui não está relacionado à programação orientada a objetos). O código objecto é código de máquina que o processador pode executar uma instrução de cada vez.
A linguagem de programação Java, uma linguagem utilizada na programação orientada a objectos, introduziu a possibilidade de compilar saída (chamada bytecode ) que pode correr em qualquer plataforma de sistema informático para a qual é fornecida uma máquina virtual Java ou um interpretador de bytecode para converter o bytecode em instruções que podem ser executadas pelo próprio processador de hardware. Usando esta máquina virtual, o bytecode pode opcionalmente ser recompilado na plataforma de execução por um compilador just-in-time. (Veja também: compilador Java)
Tradicionalmente em alguns sistemas operacionais, um passo adicional foi necessário após a compilação - o de resolver a localização relativa de instruções e dados quando mais de um módulo de objeto fosse executado ao mesmo tempo e eles se referissem às seqüências de instruções ou dados uns dos outros. Este processo foi algumas vezes chamado linkage editing e a saída conhecida como módulo load.
Um compilador funciona com o que algumas vezes são chamados de 3GL e linguagens de nível superior. Um assembler trabalha em programas escritos usando a linguagem assembler de um processador.