Pergunta

Suponha que você precise de um compilador C.Seria preferível escrever esse compilador em uma linguagem semelhante a C, dada a complexidade de um compilador desse grau.Na melhor das hipóteses, o compilador C seria escrito em C, mas isso exigiria um compilador C para começar.Se um erro é feita na criação de uma das primeiras iterações de compiladores, ela poderia se propagar.Como os compiladores garantem que isso não aconteça?Obviamente, nenhum código é impecável, nem mesmo o processador é, mas se você não tiver de alguma forma medido a estabilidade, você nem sequer sabe se o seu compilador é estável.Quais suposições são feitas e como isso é justificado?Eu imagino que seria dependente da arquitetura.

Editar: por estabilidade, quero dizer que o código é executado como pretendido.

Foi útil?

Solução

A palavra que os escritores do compilador usam para isso é "conformidade".Um compilador que implementa corretamente a especificação do idioma está em conformidade.Existem empresas que, como parte de seus negócios, vendem testes de conformidade para vários padrões, incluindo linguagens de programação.

É raro por erros para se propagar através de gerações de compilador por acidente (embora isso aconteceu de propósito ).

Outras dicas

Acontece que os compiladores contêm erros sutis.Sem erros flagrantes, porque os erros flagrantes seriam detectados e corrigidos.

Um compilador que é compilado por um compilador com erros sutis tenderá a ter erros flagrantes.Eles serão fáceis de detectar porque são tão flagrantes.Eles serão difíceis de consertar, porque esses erros flagrantes serão produzidos pelo código-fonte perfeitamente fino, então quem quiser corrigir, terá dificuldade em encontrar o problema real.

A solução será para fazer um compilador de qualidade suficiente que os bugs são muito raros e extremamente raros dentro do compilador.Também esperamos que os erros do compilador afetem mais o código muito complicado, portanto, o escritor do compilador deve gravar código que é simples e segue padrões de codificação comuns.

Uma resposta é testar, testar, testar.Por exemplo.O GCC vem com um conjunto crescente de testes que são verificados a cada vez que o compilador é construído.Muitos compiladores são obrigados a passar o chamado teste triplo: Compile Código para o seu compilador C usando o compilador A, dando C_1;Compilar c com c_1 dando c_2, compilar c com c_2 dando c_3.Agora c_2 e c_3 foram compilados com C, e devem ser iguais.Se não, algo suspeito está acontecendo.

dê uma olhada no reger "incorporado na academia" Blog, ele é uma das pessoas que trabalham em torno doLLVM compilador ferramentas, e toca regularmente nas ferramentas e técnicas usadas para tornar o compilador melhor (ou automatizar partes do edifício).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a cs.stackexchange
scroll top