Como funciona um compilador? [fechadas]

17

Nota: Estou surpreso que isso não tenha sido solicitado antes e, se tiver, não consegui encontrá-lo em uma pesquisa.

Estive em vários sites, li muitos artigos e ouvi muitas explicações. A maioria deles era boa, mas todos eram muito amplos ou muito complicados ou simplesmente ruins. Então, minha pergunta é: como um compilador funciona?

Se esta é uma pergunta ampla e difícil, por favor me diga. Se não, responda à pergunta.

Dinâmico
fonte
4
Muito amplo, pelo menos a parte "Como isso funciona". Existem livros inteiros escritos sobre esse tópico.
Oded
1
en.wikipedia.org/wiki/Compiler seria o link da Wikipedia que é trivial de encontrar, o que especificamente você está se perguntando? A pergunta é ampla o suficiente para que eu ficasse tentado a dar a resposta inteligente de "Compiladores traduzem código de um idioma para outro", pois essa é a idéia geral que tem muitas nuances, uma vez que se começa a olhar para o que isso realmente envolve.
JB King
1
Sim, e acho que foi respondido muito bem.
Jeremy
1
Qualquer explicação de como um compilador funciona será muito ampla ou muito complicada. É um assunto complicado, e as aulas de compilação foram os cursos mais difíceis relacionados a computadores que já participei.
precisa
1
@ David Claro que os compiladores são complicados e você não pode explicar todos os detalhes de como eles funcionam aqui. No entanto, tenho certeza de que você tinha um entendimento básico de alto nível sobre o que é um compilador ou como ele funciona antes de iniciar seu curso.
Dima

Respostas:

24

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

O código fonte normalmente está 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 da 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 resumo, 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 descrever brevemente as principais etapas do processo, mas essa será uma visão geral muito superficial.

  1. Lexing - divida 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 - converta 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ções, loops, condicionais, expressões etc.
  3. Otimização - avalie expressões constantes, otimize variáveis ​​não utilizadas ou códigos inacessíveis, desenrole loops, se possível, etc.
  4. Traduza a árvore de análise em instruções da máquina (ou código de byte da JVM).

Mais uma vez, enfatizo que esta é uma descrição muito breve. Os compiladores modernos são muito inteligentes e, consequentemente, muito complicados.

Dima
fonte
2
Na verdade, ele transforma uma linguagem em outra. O compilador C ++ inicial compilou em C. O mesmo vale para o compilador Vala. O compilador Java é compilado no código de bytes que não é executável sem o compilador JIT da JVM.
Deadalnix
1
@deadalnix IMHO, o ponto é que você passa do código não executável para o código executável. Eu argumentaria que o C-front não era um compilador, mas um front-end para o compilador C. Ou um estágio no processo de compilação, se você preferir. Máquinas virtuais obscurecem a fronteira entre "executável" e "não executável", é claro. Aqui, eu simplesmente consideraria o código executável como o que entra na máquina virtual, como o código de bytes, e abstrai o que acontece dentro da VM, como o JIT.
Dima
1
@ Dima, 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 da JVM diretamente nas máquinas Windows.
1
@ Thorbjørn Ravn Andersen: mas o código de bytes é executável pela JVM. Não é o objetivo de uma "máquina virtual" parecer uma máquina real para o programador?
Dima
2
Eu argumentaria que tradicionalmente um compilador converteu um programa de um formato legível por humanos em um formato legível por máquina, como disse Dima. 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 até depois de explicar o conceito básico e tradicional a alguém que não esteja familiarizado com ele.
precisa saber é o seguinte
5

Um compilador é um programa de computador (ou conjunto de instruções) que transforma o código-fonte escrito em uma linguagem de programação (o idioma-fonte) em outra linguagem de computador (o idioma-alvo, geralmente tendo 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 dos programas de origem em linguagens de alto nível com o hardware subjacente. Um compilador requer:

  1. Determinando a correção da sintaxe dos programas
  2. Gerando código de objeto correto e eficiente
  3. Organização em tempo de execução
  4. Formatação de saída de acordo com as convenções do assembler e / ou vinculador.
Mario Stylianou
fonte