Projeto do compilador - Visão geral
Os computadores são uma mistura equilibrada de software e hardware. Hardware é apenas uma peça de dispositivo mecânico e suas funções são controladas por um software compatível. O hardware entende instruções na forma de cobrança eletrônica, que é a contraparte da linguagem binária na programação de software. A linguagem binária tem apenas dois alfabetos, 0 e 1. Para instruir, os códigos de hardware devem ser escritos em formato binário, que é simplesmente uma série de 1s e 0s. Seria uma tarefa difícil e enfadonha para os programadores de computador escrever esses códigos, e é por isso que temos compiladores para escrever esses códigos.
Sistema de processamento de linguagem
Aprendemos que qualquer sistema de computador é feito de hardware e software. O hardware entende uma linguagem que os humanos não conseguem entender. Portanto, escrevemos programas em linguagem de alto nível, o que é mais fácil de entender e lembrar. Esses programas são então alimentados em uma série de ferramentas e componentes do sistema operacional para obter o código desejado que pode ser usado pela máquina. Isso é conhecido como Sistema de Processamento de Linguagem.
A linguagem de alto nível é convertida em linguagem binária em várias fases. UMAcompileré um programa que converte linguagem de alto nível em linguagem assembly. Da mesma forma, umassembler é um programa que converte a linguagem assembly em linguagem de nível de máquina.
Vamos primeiro entender como um programa, usando o compilador C, é executado em uma máquina host.
O usuário escreve um programa em linguagem C (linguagem de alto nível).
O compilador C compila o programa e o traduz para o programa assembly (linguagem de baixo nível).
Um montador então traduz o programa de montagem em código de máquina (objeto).
Uma ferramenta de vinculação é usada para vincular todas as partes do programa para execução (código de máquina executável).
Um carregador carrega todos eles na memória e então o programa é executado.
Antes de mergulhar direto nos conceitos de compiladores, devemos entender algumas outras ferramentas que funcionam em estreita colaboração com compiladores.
Pré-processador
Um pré-processador, geralmente considerado como parte do compilador, é uma ferramenta que produz entradas para compiladores. Ele lida com macroprocessamento, aumento, inclusão de arquivo, extensão de linguagem, etc.
Intérprete
Um intérprete, como um compilador, traduz a linguagem de alto nível em linguagem de máquina de baixo nível. A diferença está na maneira como lêem o código-fonte ou a entrada. Um compilador lê todo o código-fonte de uma vez, cria tokens, verifica a semântica, gera código intermediário, executa todo o programa e pode envolver muitas passagens. Em contraste, um intérprete lê uma instrução a partir da entrada, converte-a em um código intermediário, executa-a e, a seguir, obtém a próxima instrução na sequência. Se ocorrer um erro, um intérprete interrompe a execução e o relata. enquanto um compilador lê todo o programa, mesmo se encontrar vários erros.
Montador
Um montador traduz programas em linguagem assembly em código de máquina. A saída de um montador é chamada de arquivo-objeto, que contém uma combinação de instruções de máquina e também os dados necessários para colocar essas instruções na memória.
Linker
Linker é um programa de computador que vincula e mescla vários arquivos-objeto para formar um arquivo executável. Todos esses arquivos podem ter sido compilados por montadores separados. A principal tarefa de um vinculador é pesquisar e localizar módulos / rotinas referenciados em um programa e determinar a localização da memória onde esses códigos serão carregados, fazendo com que a instrução do programa tenha referências absolutas.
Carregador
Loader é uma parte do sistema operacional e é responsável por carregar arquivos executáveis na memória e executá-los. Ele calcula o tamanho de um programa (instruções e dados) e cria espaço de memória para ele. Ele inicializa vários registros para iniciar a execução.
Compilador cruzado
Um compilador que roda na plataforma (A) e é capaz de gerar código executável para a plataforma (B) é chamado de compilador cruzado.
Compilador de fonte para fonte
Um compilador que pega o código-fonte de uma linguagem de programação e o traduz no código-fonte de outra linguagem de programação é chamado de compilador fonte-a-fonte.