Tutorial de Design de Compiladores: O que é, Tipos, Ferramentas, Exemplo

O que é um Compilador?

Um compilador é um programa de computador que ajuda a transformar o código fonte escrito numa linguagem de alto nível em linguagem de máquina de baixo nível. Ele traduz o código escrito em uma linguagem de programação para alguma outra linguagem sem alterar o significado do código. O compilador também torna o código final eficiente que é otimizado para o tempo de execução e espaço de memória.

O processo de compilação inclui mecanismos básicos de tradução e detecção de erros. O processo de compilação passa por análise léxica, sintaxe e semântica no front end, e geração e otimização do código no back-end.

Neste tutorial de Design de Compilador, você aprenderá

  • O que é um Compilador?
  • Features of Compilers
  • Types of Compiler
  • Tasks of Compiler
  • History of Compiler
  • Steps for Language processing systems
  • Compiler Construction Tools
  • Why use a Compiler?
  • Application of Compilers

Features of Compilers

  • Correctness
  • Speed of compilation
  • Preserve the correct the meaning of the code
  • The speed of the target code
  • Recognize legal and illegal program constructs
  • Good error reporting/handling
  • Code debugging help

Types of Compiler

Following are the different types of Compiler:

  • Single Pass Compilers
  • Two Pass Compilers
  • Multipass Compilers

Single Pass Compiler

Single Pass Compiler
Single Pass Compiler

In single pass Compiler source code directly transforms into machine code. For example, Pascal language.

Two Pass Compiler

Two Pass Compiler
Two Pass Compiler

Two pass Compiler is divided into two sections, viz.

  1. Front end: It maps legal code into Intermediate Representation (IR).
  2. Back end: It maps IR onto the target machine

The Two pass compiler method also simplifies the retargeting process. It also allows multiple front ends.

Multipass Compilers

Multipass Compilers
Multipass Compiladores

O compilador multipass processa o código fonte ou árvore de sintaxe de um programa várias vezes. Ele dividiu um programa grande em vários programas pequenos e os processa. Ele desenvolve múltiplos códigos intermediários. Todos estes multipassos tomam a saída da fase anterior como entrada. Portanto, requer menos memória. Também é conhecido como ‘Compilador Amplo’.

Tarefas do Compilador

Tarefas principais executadas pelo Compilador são:

    Dividir o programa fonte em pedaços e impor estrutura gramatical sobre eles

  • Permite construir o programa alvo desejado a partir da representação intermediária e também criar a tabela de símbolos
  • Compila o código fonte e detecta erros nele
  • Gerir o armazenamento de todas as variáveis e códigos.
  • Suporte para compilação separada
  • Ler, analisar o programa inteiro, e traduzir para equivalente semanticamente
  • Translação do código fonte em código objeto dependendo do tipo de máquina

Histórico do Compilador

P>Ponte importante do histórico do Compilador são os seguintes:

  • A palavra “compilador” foi usada pela primeira vez no início dos anos 50 por Grace Murray Hopper
  • O primeiro compilador foi compilado por John Backum e seu grupo entre 1954 e 1957 na IBM
  • COBOL foi a primeira linguagem de programação que foi compilada em múltiplas plataformas em 1960
  • O estudo das questões de digitalização e análise foi prosseguido nos anos 60 e 70 para fornecer uma solução completa

Passos para sistemas de processamento de linguagem

Antes de conhecer o conceito de compiladores, você primeiro precisa entender algumas outras ferramentas que funcionam com compiladores.

Passos para sistemas de processamento de linguagem
Passos para sistemas de processamento de linguagem

  • Pré-processador: O pré-processador é considerado como uma parte do Compilador. É uma ferramenta que produz input para o Compilador. Lida com processamento de macro, aumento, extensão de linguagem, etc.
    • Intérprete: Um intérprete é como o Compilador que traduz linguagem de alto nível para linguagem de máquina de baixo nível. A principal diferença entre ambos é que o intérprete lê e transforma o código linha a linha. O Compilador lê o código inteiro de uma só vez e cria o código da máquina.
    • Assembler: Traduz o código da linguagem assembly em linguagem compreensível para a máquina. O resultado de saída do assembler é conhecido como um arquivo objeto que é uma combinação de instruções de máquina assim como os dados necessários para armazenar estas instruções na memória.
    • Linker: O linker ajuda-o a ligar e fundir vários ficheiros objecto para criar um ficheiro executável. Todos estes arquivos podem ter sido compilados com assemblers separados. A tarefa principal de um linker é procurar por módulos chamados em um programa e descobrir a localização da memória onde todos os módulos são armazenados.
    • Loader: O carregador é uma parte do sistema operacional, que executa as tarefas de carregar arquivos executáveis na memória e executá-los. Ele também calcula o tamanho de um programa que cria espaço de memória adicional.
      • Cross-compiler: Um Cross-compiler no design do compilador é uma plataforma que o ajuda a gerar código executável.
      • Compilador de código fonte a fonte: Compilador fonte-a-fonte é um termo usado quando o código fonte de uma linguagem de programação é traduzido para o código fonte de outra linguagem.

      Ferramentas de Construção de Compiladores

      Ferramentas de construção de compiladores foram introduzidas como tecnologias relacionadas a computadores espalhadas pelo mundo. Elas também são conhecidas como compiladores, compiladores, geradores ou tradutores.

      Estas ferramentas usam linguagem ou algoritmo específico para especificar e implementar o componente do compilador. A seguir estão o exemplo de ferramentas de construção de compiladores.

      • Geradores de Scanner: Esta ferramenta toma expressões regulares como entrada. Por exemplo, LEX para Unix Operating System.
      • Motores de tradução direcionada por sintaxe: Estas ferramentas de software oferecem um código intermediário usando a árvore parse. Tem o objetivo de associar uma ou mais traduções com cada nó da árvore parse.
      • Geradores de parser: Um gerador de parser toma uma gramática como entrada e gera automaticamente o código fonte que pode analisar fluxos de caracteres com a ajuda de uma gramática.
      • Geradores automáticos de código: Pega código intermediário e os converte em linguagem de máquina
      • Motores de fluxo de dados: Esta ferramenta é útil para a otimização de código. Aqui, a informação é fornecida pelo usuário e o código intermediário é comparado para analisar qualquer relação. É também conhecida como análise de fluxo de dados. Ela ajuda a descobrir como os valores são transmitidos de uma parte do programa para outra parte.

      Por que usar um Compilador?

      • Compiler verifica o programa inteiro, para que não haja erros de sintaxe ou semântica
      • O arquivo executável é otimizado pelo compilador, por isso é executado mais rápido
      • Permite criar uma estrutura interna na memória
      • Não há necessidade de executar o programa na mesma máquina em que foi construído
      • Traduzir todo o programa em outra língua
      • Gerar arquivos no disco
      • Ligue os ficheiros para um formato executável
      • Verifica erros de sintaxe e tipos de dados
      • Ajuda-o a melhorar a sua compreensão da semântica da linguagem
      • Ajuda a lidar com problemas de desempenho da linguagem
      • Oportunidade para um nãotrivial programming project
      • The techniques used for constructing a compiler can be useful for other purposes as well

      Application of Compilers

      • Compiler design helps full implementation Of High-Level Programming Languages
      • Support optimization for Computer Architecture Parallelism
      • Design of New Memory Hierarchies of Machines
      • Widely used for Translating Programs
      • Used with other Software Productivity Tools

      Summary

      • A compiler is a computer program which helps you transform source code written in a high-level language into low-level machine language
      • Correctness, velocidade de compilação, preservar o significado correto do código são algumas características importantes do projeto do compilador
      • li>Compilers são divididos em três partes 1) Compiladores Single Pass 2)Compiladores Two Pass, e 3) Compiladores Multipass

      • O “compilador” foi palavra usada pela primeira vez no início dos anos 50 por Grace Murray Hopper
      • Steps for Language processing system are: Pré-processador, Intérprete, Assembler, Linker/Loader
      • Ferramentas de construção de compiladores importantes são: 1) geradores de scanner, 2)Syntax-3) motores de tradução dirigida, 4) geradores de parser, 5) geradores automáticos de código
      • A tarefa principal do compilador é verificar o programa inteiro, de modo que não haja erros de sintaxe ou semântica