El efecto Beaujolais es el nombre que se le dio a una clase de posibles errores semánticos en el borrador de especificaciones de Jean Ichbiah para el lenguaje de programación Ada . El nombre surgió de la promesa de Ichbiah de regalar una botella de vino tinto Beaujolais nouveau a cualquiera que pudiera encontrar una situación similar en el borrador del estándar del lenguaje. Al menos una botella fue realmente premiada por tal descubrimiento. [1]
El efecto Beaujolais es una situación en la que la adición o eliminación de una cláusula de uso único en un programa Ada cambia el comportamiento del programa compilado, un efecto muy indeseable en un lenguaje diseñado para la precisión semántica. Ichbiah tomó medidas para evitar el efecto cuando actualizó su borrador de estándar para producir el estándar de lenguaje final Ada 83. Las posibles situaciones restantes para producir el efecto se identificaron más tarde mediante análisis matemático y se abordaron en el estándar de lenguaje Ada 95, lo que hace que cualquier situación que aún resultara en un efecto Beaujolais en Ada 83 sea una construcción ilegal en el estándar de lenguaje Ada 95 más reciente.
En principio, el efecto Beaujolais puede ocurrir en otros lenguajes que utilicen espacios de nombres o paquetes , si la especificación del lenguaje no garantiza que sea ilegal.
El lenguaje de programación Ada permite dividir el código fuente en paquetes de biblioteca que contienen definiciones de datos y algoritmos que pueden ser utilizados por programas u otros paquetes de biblioteca. Las definiciones en un paquete se hacen visibles mediante una cláusula with . Por ejemplo, si la línea –
con Ada.Text_IO;
aparece en la parte superior del código fuente de un programa o paquete, entonces los datos, procedimientos y funciones declarados en el paquete de biblioteca Ada.Text_IO pueden invocarse dentro de ese código fuente. Esta es la implementación del concepto de espacio de nombres para Ada.
De esta forma, un programa que tiene la with Ada.Text_IO;directiva puede "ver" las definiciones allí, y para invocar el New_Lineprocedimiento en Ada.Text_IO se puede hacer referencia a él por su nombre.
Ada.Texto_IO.Nueva_Línea;
y lo mismo con procedimientos o funciones que requieren argumentos, o con lecturas/escrituras en cualquier variable declarada en el paquete Ada.Text_IO .
Sin embargo, estos nombres completamente especificados pueden volverse bastante verbosos, por lo que el estándar del lenguaje también admite una cláusula de uso que le indica al compilador que busque el contenido del paquete cuando intente identificar nombres que aparecen en el código fuente. Por lo tanto, si ambas líneas –
con Ada.Text_IO; utiliza Ada.Text_IO;
aparece en la parte superior de un programa, el New_Lineprocedimiento en el paquete Ada.Text_IO no solo es visible para el programa, sino que puede invocarse mediante la forma abreviada:
Nueva_línea;
porque la cláusula de uso le dice al compilador qué paquete contiene la definición.
Sin embargo, surge una ambigüedad si más de un paquete define un New_Lineprocedimiento con perfiles de parámetros iguales o similares. Si el programa no resuelve la ambigüedad, el compilador debe rechazar el programa con un mensaje de error. A continuación se muestra un ejemplo:
el paquete A es el procedimiento Nueva_Línea (Número_De_Líneas : en Positivo := 1); fin A;con A; usar A; con Ada.Text_IO; usar Ada.Text_IO; procedimiento Ambiguo es begin New_Line; -- error end Ambiguo;
En el ejemplo anterior, la llamada es ambigua porque podría corresponder a cualquiera de los dos Ada.Text_IO.New_Lineo A.New_Lineal valor del parámetro predeterminado. Hay dos formas de resolver la ambigüedad. Una es especificar el nombre del paquete y la otra es especificar el nombre del parámetro explícitamente, si el subprograma al que se llama tiene parámetros. Los tres ejemplos siguientes resuelven la ambigüedad.
Ada.Texto_IO.Nueva_Línea;A.Nueva_Línea;Nueva_Línea (Número_De_Líneas => 1);