Comentários

  • Muito amplo, pelo menos " Como funciona " parte. Existem livros inteiros escritos sobre esse assunto.
  • en.wikipedia.org/wiki/Compiler seria o link da Wikipedia que é trivial para encontrar, o que especificamente você está se perguntando? A questão é ampla o suficiente para que eu ' ficasse tentado a dar a resposta alec inteligente de, " Compiladores traduzem código de um idioma para outro , " pois essa é a ideia geral que contém muitas nuances, uma vez que se começa a olhar para o que isso realmente envolve.
  • Sim e eu acho ele foi respondido muito bem.
  • Qualquer explicação de como um compilador funciona pode ser muito ampla ou muito complicada. É ' um assunto complicado, e as aulas de compiladores foram os cursos relacionados a computação mais difíceis que já fiz.
  • @David Claro que compiladores são complicados e você não pode explique todos os detalhes de como eles funcionam aqui. No entanto, tenho certeza de que você tinha um conhecimento básico de alto nível sobre o que é um compilador ou como ele funciona antes de fazer seu curso de compilador.

Resposta

Um compilador é um programa que traduz o código-fonte de outro programa de uma linguagem de programação em código executável.

O código-fonte está normalmente em uma linguagem de programação de alto nível (por exemplo, Pascal, C, C ++, Java, Perl, C #, etc.). O código executável pode ser uma sequência de instruções de máquina que podem ser executadas diretamente pela CPU ou pode ser uma representação intermediária que é interpretada por uma máquina virtual (por exemplo, código de bytes Java).

Em suma, um compilador converte um programa de um formato legível por humanos em um formato legível por máquina.

Quanto ao funcionamento de um compilador, isso é realmente complicado. Existem livros e cursos universitários sobre o assunto. Tentarei delinear brevemente os principais estágios do processo, mas esta será uma visão geral muito superficial.

  1. Lexing – divide o texto do programa em “tokens”. Os tokens são as “palavras” da linguagem de programação, como identificadores (palavras-chave, nomes de variáveis, nomes de funções, etc.) ou operadores (=, *, &, etc.) .
  2. Análise – converte a sequência de tokens em uma árvore de análise, que é uma estrutura de dados que representa várias construções de linguagem: declarações de tipo, declarações de variáveis, definições de função, loops, condicionais, expressões, etc.
  3. Otimização – avalie expressões constantes, otimize variáveis não utilizadas ou código inacessível, desenrole loops se possível, etc.
  4. Traduza a árvore de análise em instruções de máquina (ou código de bytes JVM).

Novamente, enfatizo que esta é uma descrição muito breve. Compiladores modernos são muito inteligentes e, conseqüentemente, muito complicados.

Comentários

  • Na verdade, eles transformam uma linguagem em outra. O compilador C ++ antigo compilava para C. O mesmo vale para o compilador Vala. O compilador Java compila em bytecode que não é ' t executável sem um JVM ' s compilador JIT.
  • @deadalnix IMHO , a questão é que você passa de um código não executável para um código executável. Eu diria que o C-front não foi um compilador, mas um front-end para o compilador C. Ou uma etapa do processo de compilação, se preferir. As máquinas virtuais confundem o limite entre " executável " e " não executável ", é claro. Aqui, eu simplesmente consideraria o código executável como tudo o que entra na máquina virtual, como o código de byte, e abstrairia tudo o que acontece dentro da VM, como JIT.
  • @Dima, não ' não precisa ser de código não executável para código executável. Por exemplo, você não pode executar o código de byte JVM diretamente em máquinas Windows.
  • @Thorbj ø rn Ravn Andersen: mas o código de byte é executável pela JVM. Não é ' t todo o objetivo de uma " máquina virtual " para parecer um real máquina para o programador?
  • Eu diria que tradicionalmente um compilador convertia um programa de um formato legível por humanos em um formato legível por máquina, assim como Dima disse. Variações como Cfront convertendo C ++ em C ou javac convertendo Java em bytecode são tópicos mais avançados que provavelmente devem ser deixados para depois de explicar o conceito básico e tradicional para alguém não familiarizado com ele.

Resposta

Um compilador é um programa de computador (ou conjunto de instruções) que transforma o código-fonte escrito em uma linguagem de programação (a linguagem fonte) em outra linguagem de computador (o idioma de destino, geralmente com uma forma binária conhecida como código-objeto). O motivo mais comum para querer transformar o código-fonte é criar um programa executável.

Os compiladores fazem a ponte entre os programas-fonte em linguagens de alto nível e o hardware subjacente. Um compilador requer:

  1. Determinar a correção da sintaxe dos programas
  2. Gerar código-objeto correto e eficiente
  3. Organização em tempo de execução
  4. Formatando a saída de acordo com as convenções de assembler e / ou vinculador.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *