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.