Compiler é um software que converte um programa escrito em linguagem de alto nível (Source Language) em linguagem de baixo nível (Object / Target / Machine Language). 

  • Compilador cruzado que roda em uma máquina 'A' e produz um código para outra máquina 'B'. Ele é capaz de criar código para uma plataforma diferente daquela na qual o compilador está sendo executado.
  • Source-to-source Compiler ou transcompiler ou transpiler é um compilador que traduz o código-fonte escrito em uma linguagem de programação em código-fonte de outra linguagem de programação.

Sistemas de processamento de linguagem (usando compilador) - 
sabemos que um computador é um conjunto lógico de software e hardware. O hardware conhece uma linguagem, que é difícil para nós entendermos, conseqüentemente tendemos a escrever programas em linguagem de alto nível, que é muito menos complicada para compreendermos e mantermos em pensamento. Agora, esses programas passam por uma série de transformações para que possam ser prontamente usados ​​pelas máquinas. É aqui que os sistemas de procedimento de linguagem se tornam úteis. 
 

  • Linguagem de alto nível - se um programa contém diretivas #define ou #include, como #include ou #define, ele é chamado de HLL. Eles estão mais próximos dos humanos, mas longe das máquinas. Essas (#) tags são chamadas de diretivas de pré-processador. Eles direcionam o pré-processador sobre o que fazer.
  • Pré-processador - O pré-processador remove todas as diretivas #include incluindo os arquivos chamados de inclusão de arquivo e todas as diretivas #define usando expansão de macro. Ele executa inclusão de arquivo, aumento, processamento de macro, etc.
  • Linguagem Assembly - Não é em forma binária nem de alto nível. É um estado intermediário que é uma combinação de instruções de máquina e alguns outros dados úteis necessários para a execução.
  • Assembler - Para cada plataforma (Hardware + SO) teremos um montador. Eles não são universais, pois para cada plataforma temos um. A saída do assembler é chamada de arquivo de objeto. Ele traduz a linguagem assembly em código de máquina.
  • Intérprete - um intérprete converte linguagem de alto nível em linguagem de máquina de baixo nível, assim como um compilador. Mas eles são diferentes na forma como lêem a entrada. O compilador de uma vez lê as entradas, faz o processamento e executa o código-fonte, enquanto o interpretador faz o mesmo linha por linha. O compilador varre o programa inteiro e o traduz como um todo em código de máquina, enquanto um interpretador traduz o programa uma instrução de cada vez. Os programas interpretados são geralmente mais lentos em relação aos compilados.
  • Código de máquina relocável - pode ser carregado em qualquer ponto e executado. O endereço dentro do programa será de forma a cooperar com o movimento do programa.
  • Loader / Linker - converte o código relocável em código absoluto e tenta executar o programa, resultando em um programa em execução ou em uma mensagem de erro (ou às vezes os dois podem acontecer). O Linker carrega uma variedade de arquivos de objeto em um único arquivo para torná-lo executável. Então o carregador carrega na memória e o executa.

Fases de um compilador - 
Existem duas fases principais de compilação, que por sua vez têm muitas partes. Cada um deles recebe informações da saída do nível anterior e funciona de forma coordenada. 
 

Fase de análise - uma representação intermediária é criada a partir do código-fonte fornecido: 
 

  1. Analisador Lexical
  2. Analisador de sintaxe
  3. Analisador Semântico
  4. Gerador de código intermediário

O analisador léxico divide o programa em “tokens”, o analisador de sintaxe reconhece “sentenças” no programa usando a sintaxe da linguagem e o analisador semântico verifica a semântica estática de cada construção. O Gerador de código intermediário gera código “abstrato”. 
Fase de síntese - o programa de destino equivalente é criado a partir da representação intermediária. Tem duas partes: 
 

  1. Otimizador de código
  2. Gerador de código

O Code Optimizer otimiza o código abstrato e o Code Generator final traduz o código intermediário abstrato em instruções de máquina específicas. 

Perguntas do GATE CS Corner 

Praticar as perguntas a seguir o ajudará a testar seus conhecimentos. Todas as perguntas foram feitas no GATE em anos anteriores ou nos testes de simulação GATE. É altamente recomendável que você os pratique. 
 

  1. GATE CS 2011, Pergunta 1
  2. GATE CS 2011, Questão 19
  3. GATE CS 2009, Pergunta 17
  4. GATE CS 1998, Questão 27
  5. GATE CS 2008, Questão 85
  6. GATE CS 1997, Questão 8
  7. GATE CS 2014 (Conjunto 3), Pergunta 65
  8. GATE CS 2015 (Conjunto 2), Pergunta 29

Referências -  
Introdução à compilação - viden.io  
slideshare 

Aprenda todos os conceitos do GATE CS com aulas gratuitas ao vivo em nosso canal do youtube.