Não pretendo escrever um compilador no futuro próximo; Ainda assim, estou bastante interessado nas tecnologias de compilador e em como essas coisas podem ser melhoradas.
Começando com linguagens compiladas, a maioria dos compiladores possui dois níveis de erro: avisos e erros, o primeiro sendo coisas não fatais que você deve corrigir e erros indicando na maioria das vezes que é impossível produzir máquina (ou byte) código da entrada.
Porém, esta é uma definição bastante fraca. Em algumas linguagens como Java, alguns avisos são simplesmente impossíveis de serem eliminados sem o uso da @SuppressWarning
diretiva. Além disso, o Java trata certos problemas não fatais como erros (por exemplo, código inacessível em Java aciona um erro por um motivo que eu gostaria de saber).
O C # não tem os mesmos problemas, mas possui alguns. Parece que a compilação ocorre em várias passagens, e uma falha na passagem impedirá a execução de outras passagens. Por esse motivo, a contagem de erros que você obtém quando sua compilação falha geralmente é subestimada. Em uma corrida, pode-se dizer que você tem dois erros, mas depois de corrigi-los, você poderá obter 26 novos.
Escavar em C e C ++ simplesmente mostra uma combinação ruim das deficiências de diagnóstico da compilação de Java e C # (embora possa ser mais preciso dizer que Java e C # apenas seguiram seu caminho com metade dos problemas cada). Alguns avisos realmente deveriam ser erros (por exemplo, quando nem todos os caminhos de código retornam um valor) e ainda são avisos porque, suponho, no momento em que eles escreveram o padrão, a tecnologia do compilador não era boa o suficiente para fazer esse tipo de coisa. verificações obrigatórias. Na mesma linha, os compiladores geralmente buscam mais do que o padrão diz, mas ainda usam o nível de erro de aviso "padrão" para obter descobertas adicionais. E, frequentemente, os compiladores não relatam todos os erros que podem encontrar imediatamente; pode levar algumas compilações para se livrar de todas elas. Sem mencionar os erros enigmáticos que os compiladores C ++ gostam de cuspir,
Agora, adicionando que muitos sistemas de compilação são configuráveis para relatar falhas quando os compiladores emitem avisos, obtemos uma mistura estranha: nem todos os erros são fatais, mas alguns avisos devem; nem todos os avisos são merecidos, mas alguns são explicitamente suprimidos sem menção adicional de sua existência; e algumas vezes todos os avisos se tornam erros.
Os idiomas não compilados ainda têm sua parcela de relatórios de erros ruins. Erros de digitação no Python não serão relatados até que o código seja realmente executado, e você nunca poderá realmente chutar mais de um erro de cada vez, porque o script interromperá a execução depois de encontrar um.
O PHP, por seu lado, possui vários níveis de erro mais ou menos significativos e exceções. Os erros de análise são relatados um de cada vez, os avisos geralmente são tão ruins que devem abortar seu script (mas não por padrão), os avisos geralmente mostram problemas sérios de lógica, alguns erros não são ruins o suficiente para interromper o script, mas ainda assim e, como de costume no PHP, existem algumas coisas realmente estranhas lá embaixo (por que diabos precisamos de um nível de erro para erros fatais que não são realmente fatais?, E_RECOVERABLE_E_ERROR
estou falando com você).
Parece-me que todas as implementações de relatórios de erro do compilador que consigo pensar estão quebradas. O que é uma pena, pois todos os bons programadores insistem em como é importante lidar corretamente com os erros e, no entanto, não conseguem ter suas próprias ferramentas para fazê-lo.
Qual você acha que deve ser o caminho certo para relatar erros do compilador?