Beaujolais effekt

Beaujolais-effekten är namnet på en klass av potentiella semantiska fel i Jean Ichbiahs utkast till specifikationer för programmeringsspråket Ada . Namnet uppstod från Ichbiahs löfte att ge en flaska Beaujolais nouveau rödvin till alla som kunde hitta en sådan situation i utkastet till språkstandard. Minst en flaska belönades faktiskt för en sådan upptäckt.

Definition

Beaujolais-effekten är en situation där att lägga till eller ta bort en engångssats i ett Ada-program ändrar beteendet hos det kompilerade programmet, en mycket oönskad effekt i ett språk som är designat för semantisk precision. Ichbiah vidtog åtgärder för att förhindra effekten när han uppdaterade sitt utkast till standard för att producera den slutliga Ada 83-språkstandarden. De återstående möjliga situationerna för att producera effekten identifierades senare genom matematisk analys och åtgärdades av Ada 95-språkstandarden, vilket gjorde varje situation som fortfarande resulterade i en Beaujolais-effekt i Ada 83 till en olaglig konstruktion i den nyare Ada 95-språkstandarden.

I princip kan Beaujolais-effekten uppstå på andra språk som använder namnutrymmen eller paket , om språkspecifikationen inte säkerställer att den blir olaglig.

Bakgrund

Programmeringsspråket Ada tillåter att källkoden delas upp i bibliotekspaket som innehåller definitioner av data och algoritmer som kan användas av program eller andra bibliotekspaket. Definitionerna i ett paket görs synliga av en with-sats . Till exempel, om linjen –

 med  Ada.Text_IO; 

visas högst upp i källkoden för ett program eller paket, då kan data, procedurer och funktioner som deklareras i bibliotekspaketet Ada.Text_IO anropas inom den källkoden. Detta är implementeringen av namnutrymmeskonceptet för Ada.

Alltså ett program som har med Ada.Text_IO; direktiv kan "se" definitionerna där, och för att anropa New_Line -proceduren i Ada.Text_IO kan den hänvisas till med namn,

Ada.Text_IO.New_Line;

och på liknande sätt med procedurer eller funktioner som kräver argument, eller med läser/skriver till alla variabler som deklareras i Ada.Text_IO -paketet.

Sådana fullständigt specificerade namn kan dock bli ganska utförliga, så språkstandarden stöder också en användningssats som säger åt kompilatorn att söka igenom innehållet i paketet när han försöker identifiera namn som förekommer i källkoden. Så om båda linjerna –

 med  Ada.Text_IO;  använd  Ada.Text_IO; 

visas högst upp i ett program, är New_Line- proceduren i paketet Ada.Text_IO inte bara synlig för programmet, utan kan anropas med den förkortade formen –

Ny linje;

eftersom use-satsen talar om för kompilatorn vilket paket som innehåller definitionen.

Otydlighet uppstår dock om mer än ett paket definierar en New_Line -procedur med samma eller liknande parameterprofiler. Om programmet inte löser oklarheten bör kompilatorn avvisa programmet med ett felmeddelande. Här är ett exempel:


 paket  A är  proceduren  New_Line (Antal_Of_Lines:  i  positiv := 1);  ände  A;  med  A;  använd  A;  med  Ada.Text_IO;  använd  Ada.Text_IO;  procedur  Tvetydigt  är  att börja  New_Line;  -- error  end  Tvetydig; 

I exemplet ovan är anropet tvetydigt eftersom det kan motsvara antingen Ada.Text_IO.New_Line eller A.New_Line med standardparametervärdet. Det finns två sätt att lösa tvetydigheten. Den ena är att specificera paketnamnet, och den andra är att specificera parameternamnet explicit, om underprogrammet som ska anropas har parametrar. De tre exemplen nedan löser alla oklarheten.

Ada.Text_IO.New_Line; A.New_Line; New_Line (Antal_Of_Lines => 1);