Eu queria saber por que C ++ é uma boa opção para escrever um compilador. É claro que C também é bom para esse propósito, porque muitos compiladores são escritos em C ou C ++, mas desta vez estou mais interessado em C ++. Alguma boa razão? Eu estava procurando isso na Internet, mas não consigo encontrar boas razões.
15
Respostas:
C ++ tem dois lados. Ele tem um lado de desenvolvimento de baixo nível, o que faz com que pareça uma linguagem natural para fazer coisas de baixo nível, como geração de código. Ele também possui um lado de alto nível (que C não possui) que permite estruturar um aplicativo complexo (como um compilador) de uma maneira lógica e orientada a objetos, mantendo o desempenho. Por possuir aspectos de baixo e alto nível, é uma boa opção para aplicativos grandes que exigem recursos ou desempenho de baixo nível.
fonte
Minha experiência não concorda com sua premissa aqui. De fato, para linguagens de propósito geral de alto nível, é uma prática muito comum escrever o compilador no mesmo idioma que o idioma de origem (o idioma que está sendo compilado). Por exemplo:
Uma exceção são os front-ends do compilador gravados para estruturas de compiladores existentes, como GCC, LLVM ou Polyglot, que são escritas na linguagem da estrutura ou compiladores que dependem de geradores de analisadores existentes, como o Yacc. Como GCC, LLVM e Yacc são ferramentas comuns e estabelecidas, escritas em C e C ++, isso incentiva os escritores de compiladores a usá-las, o que pode levar o C e C ++ a obter um grande compartilhamento na distribuição da linguagem de implementação do compilador.
fonte
javac
linha de comando), que compila Java para Java Bytecode. Está escrito em Java - eu o modifiquei muitas vezes e você pode navegar on-line por suas fontes Java . O outro é o compilador just-in-time incorporado na JVM do Hotspot, que compila o Java Bytecode no código da máquina nativa. Como a maioria da JVM, ela é escrita em C ++, mas não é um compilador Java - na verdade, ela não sabe nada sobre a linguagem Java.Para compilar o que para quê? Um compilador transforma um código-fonte de um idioma ( idioma de origem) para outro (idioma de destino), o que não indica nada sobre o baixo nível do idioma de destino.
O idioma que você escolhe para escrever um compilador depende do contexto. Por exemplo, trabalhando em um projeto que compila uma linguagem derivada do PHP para um código PHP nativo, usei uma mistura de PHP e C # para escrever o compilador, porque fazia mais sentido para mim, dadas minhas habilidades. Outra pessoa escolheria Python, Java e PHP, ou C ++ com um pouco de JavaScript, ou qualquer outra coisa.
C ou C ++ é uma escolha popular devido ao suporte de ferramentas relacionadas ao compilador (veja a resposta de Telastyn) e porque esses dois idiomas permitem que você seja realmente nativo. Mas não há nada errado em escolher outro idioma.
Observe que, para ser mais nerd , você pode escolher o idioma de origem para escrever o próprio compilador. Foi o que aconteceu com o compilador CoffeeScript e muitos outros compiladores. Também é popular entre os IDEs: um dos primeiros Visual Studio foi criado usando o mesmo Visual Studio.
fonte
Costumo questionar a premissa básica aqui. Enquanto C e C ++ funcionam perfeitamente bem para escrever compiladores, muitas outras linguagens parecem funcionar perfeitamente também para a tarefa.
Um pouco depende do idioma que você está compilando. Para linguagens pequenas e simples, C e Pascal funcionam muito bem. Se você for compilar algo grande e complexo, seu compilador também ficará grande e complexo - nesse caso, os recursos extras do C ++ para organizar e trabalhar com programas maiores obviamente serão úteis. Isso não é realmente muito específico para compilar, apenas recursos úteis para programas maiores em geral.
Eu acho que também vale a pena mencionar um outro ponto. Os iniciantes (parecem) pensam nos compiladores principalmente na manipulação de texto, então pensam que algo como Perl será uma grande ajuda para escrever compiladores. Na realidade, a maioria das partes interessantes da compilação não começa realmente depois que você cria seu AST. Embora eu tenha certeza que o Perl pode fazer o trabalho perfeitamente bem, sua capacidade de manipulação de texto também não oferece uma grande vantagem (a manipulação de texto está principalmente no lexer e os geradores de lexer para coisas como C suportam REs de qualquer maneira).
fonte
Compiladores podem ser implementados em qualquer linguagem moderna. No entanto, um dos requisitos mais importantes de um compilador é ser rápido.
C ++ tem uma clara vantagem aqui. A otimização em C ++ não é barata. No entanto, devido à natureza de baixo nível desse idioma, é possível otimizar manualmente o código C ++ mais do que em qualquer outro idioma (exceto o Assembly que não é portátil).
fonte
Suspeito que o principal motivador para o uso deles seja que a saída Lex / Yacc / Bison esteja (principalmente) em C. Como esse é o padrão há tanto tempo, ele tem impulso.
Não que essas sejam razões particularmente boas ...
fonte