No planeo escribir un compilador en el futuro cercano; Aún así, estoy bastante interesado en las tecnologías de compilación y en cómo esto podría mejorarse.
Comenzando con los lenguajes compilados, la mayoría de los compiladores tienen dos niveles de error: advertencias y errores, el primero es la mayoría de las veces cosas no fatales que debe corregir, y los errores que indican la mayoría de las veces que es imposible producir máquina (o byte) código de la entrada.
Sin embargo, esta es una definición bastante débil. En algunos lenguajes como Java, ciertas advertencias son simplemente imposibles de eliminar sin usar la @SuppressWarning
directiva. Además, Java trata ciertos problemas no fatales como errores (por ejemplo, el código inalcanzable en Java desencadena un error por una razón que me gustaría saber).
C # no tiene los mismos problemas, pero tiene algunos. Parece que la compilación se produce en varios pases, y un error de pase evitará que se ejecuten los pases posteriores. Debido a eso, el recuento de errores que obtienes cuando falla tu construcción a menudo se subestima enormemente. En una ejecución, podría decir que tiene dos errores, pero una vez que los arregle, tal vez obtendrá 26 nuevos.
Excavar en C y C ++ simplemente muestra una mala combinación en las debilidades de diagnóstico de compilación de Java y C # (aunque podría ser más exacto decir que Java y C # simplemente siguieron su camino con la mitad de los problemas cada uno). Algunas advertencias realmente deberían ser errores (por ejemplo, cuando no todas las rutas de código devuelven un valor) y aún son advertencias porque, supongo, en el momento en que escribieron el estándar, la tecnología del compilador no era lo suficientemente buena como para hacer este tipo de controles obligatorios En la misma línea, los compiladores a menudo verifican más de lo que dice el estándar, pero aún usan el nivel de error de advertencia "estándar" para los hallazgos adicionales. Y a menudo, los compiladores no informarán todos los errores que puedan encontrar de inmediato; Puede tomar algunas compilaciones deshacerse de todos ellos. Sin mencionar los errores crípticos que a los compiladores de C ++ les gusta escupir,
Ahora, agregando que muchos sistemas de compilación son configurables para informar fallas cuando los compiladores emiten advertencias, solo obtenemos una mezcla extraña: no todos los errores son fatales, pero algunas advertencias deberían; no todas las advertencias son merecidas, pero algunas se suprimen explícitamente sin mencionar más su existencia; y a veces todas las advertencias se convierten en errores.
Los idiomas no compilados aún tienen su parte de informes de errores deficientes. Los errores tipográficos en Python no se informarán hasta que el código se ejecute realmente, y nunca se puede eliminar más de un error a la vez porque el script dejará de ejecutarse después de que se encuentre con uno.
PHP, por su parte, tiene un montón de niveles de error más o menos significativos y excepciones. Los errores de análisis se informan uno a la vez, las advertencias son a menudo tan malas que deberían abortar su secuencia de comandos (pero no lo hacen de manera predeterminada), las notificaciones a menudo muestran problemas lógicos graves, algunos errores realmente no son lo suficientemente graves como para detener su secuencia de comandos, pero aún así hacer, y como de costumbre con PHP, hay algunas cosas realmente extrañas allí (¿por qué demonios necesitamos un nivel de error para errores fatales que no son realmente fatales?, E_RECOVERABLE_E_ERROR
estoy hablando contigo).
Me parece que todas las implementaciones de informes de errores del compilador que se me ocurren están rotas. Lo cual es una verdadera lástima, ya que todos los buenos programadores insisten en lo importante que es tratar los errores correctamente y, sin embargo, no pueden obtener sus propias herramientas para hacerlo.
¿Cuál crees que debería ser la forma correcta de informar los errores del compilador?