Si el trabajo de un compilador es esencialmente traducir el código fuente al código de nivel de máquina, ¿puede haber algún problema en un compilador, es decir, una "traducción" defectuosa?
Lo mismo ocurre con un intérprete: ¿puede fallar a veces el contenido requerido?
No he oído hablar de ningún error en los compiladores / intérpretes, pero ¿existen?
compiler
bug
interpreters
Rey Brujo
fuente
fuente
Respuestas:
Sí
Tiende a encontrarlos más en idiomas que se están desarrollando activamente que en aquellos que son relativamente maduros (y, por lo tanto, no ven muchos cambios con frecuencia). Esta es probablemente la razón por la cual la mayoría de los idiomas se lanzan en varias 'etapas' de estabilidad. Una compilación nocturna es mucho menos probable que sea estable que un candidato de lanzamiento , que en sí mismo es menos probable que sea estable que una versión completamente lanzada y utilizada activamente.
Afortunadamente, la mayoría de estos idiomas (especialmente los de código abierto) tendrán un sistema público de seguimiento de errores al que puede enviar informes.
En mi propia experiencia, me encontré con un error bastante oscuro pero grave en Scala en Windows . Envié mis hallazgos al rastreador de errores y el problema se solucionó con bastante rapidez. En ese caso, los desarrolladores del lenguaje fueron lo suficientemente inteligentes como para incluir una nota útil en la salida del registro de errores, sugiriendo que lo que me había encontrado era un error del compilador y me dijeron dónde enviar el informe.
fuente
En palabras simples:
Todos los programas pueden tener errores.
Los compiladores son programas.
Ergo, los compiladores pueden tener errores.
fuente
Puede haber errores incluso en el hardware; Un ejemplo famoso es el error Pentium FDIV . Sin duda existe la posibilidad de que los compiladores contengan errores.
fuente
Los compiladores e intérpretes también son software y, por lo tanto, no están libres de ninguno de los problemas de otro software.
Este es un ejemplo de un compilador tan reciente como MSVC 11 (2012) , y aquí hay un artículo sobre cómo prueban el backend .
fuente
Por supuesto, porque los compiladores son software.
En 2005, tuve una falla en una pieza de código en una pieza de software muy crítica que había escrito para una gran empresa. Como le costó a la compañía literalmente millones de dólares rectificar, por supuesto lanzaron una investigación de gran envergadura.
Afortunadamente (desde mi perspectiva), el problema resultó ser un problema de compilación en Delphi. En el bloque try finalmente, el valor de retorno de una función se destruyó y resultó en resultados absolutamente aleatorios para la persona que llama. Esto fue documentado y reconocido por Borland.
.NET era conocido por tener literalmente cientos de fugas de memoria diferentes, particularmente en sus primeras implementaciones.
Yo diría que no existe el software sin errores. Los compiladores no son la excepción. Sin embargo, se prueban más a fondo que la mayoría del software empresarial y son consumidos por personas inteligentes, críticas y contenciosas, por lo que su historial ha sido bastante bueno en general.
fuente
No solo errores, sino también malware deliberado.
El troyano "login" implementado por Brian Kernighan en el compilador original de Unix C es el más conocido de estos; El artículo http://cm.bell-labs.com/who/ken/trust.html tiene algunos antecedentes sobre esto.
fuente
Sí, por supuesto, como cualquier compilador de software tiene errores, por ejemplo, la lista de errores de gcc está aquí
fuente
Sí.
Además, no solo con compiladores, sino también con intérpretes / depuradores y cualquier herramienta de software de terceros.
Actualmente estamos utilizando algún software de terceros y hemos tenido algunos problemas. A veces nos agradecen por encontrar y reportar un error. :)
Algunos de ellos también tienen algunas pérdidas de memoria, lo que lleva a un bloqueo. La pregunta importante aquí podría ser, ¿cómo determinar si la herramienta de terceros o el compilador tiene errores para que su aplicación funcione correctamente?
fuente
El compilador es un programa que lee un programa escrito en un idioma (el idioma de origen) y lo traduce a otro programa equivalente en otro idioma (el idioma de destino), principalmente lenguaje de máquina.
Hay diferentes fases del compilador a través de las cuales se escanea el código del idioma fuente línea por línea. Hay una tabla de símbolos que mantiene el seguimiento de todas las palabras clave que se escanean en el código de idioma fuente.
Fase 1: Analizador léxico: lee todos los caracteres en el programa fuente y forma la separación lógica de tokens (int, char, float, if-else, for, while, etc.)
Fase 2: Analizador de sintaxis: analiza la estructura del flujo de tokens. Análisis jerárquico de expresiones que incluye postfix / prefix, etc. (a = b + c * d)
Fase 3: Analizador semántico: verificación de tipos de tokens (entero a real, flotante, etc.) y muchas cosas como la precedencia del operador, etc.
Fase 4: Generador de código intermedio - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)
Fase 5: Optimización del código: varios análisis (flujo de control, flujo de datos, transformaciones)
que elimina: código de redundancia, propagación de constantes, código muerto parcial, subexpresión común, código invariante de bucle
Fase 6: Generación de código: generación de código de destino (principalmente lenguaje ensamblador) poniendo valores en registros
Todas estas fases no son más que programas bien escritos y podría haber un número N de fallas en eso ...
fuente
Por supuesto, los compiladores son solo programas y sus autores también son idiotas :). Incluso la especificación del idioma puede tener un error. Ejemplo: c # + foreach + lambda .
O en Python, error en el intérprete: la compilación del mal ast bloquea al intérprete .
Bueno, si quieres buscar errores en el compilador / interpeter -> mira php. Hay un error famoso con desbordamiento de enteros. El primer arreglo comenzó desde
if (size > INT_MAX) return NULL;
. Continuación de la historia .fuente