Efectul Beaujolais

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Sticlă și pahar de Beaujolais nouveau

Efectul Beaujolais este un comportament nedorit prezent în proiectul lui Jean Ichbiah pentru standardul de limbaj de programare Ada , care poate permite o schimbare tacită a semnificației unei piese de cod atunci când se adaugă sau se elimină o clauză de use , făcând posibilă semantica erorilor accidentale. Numele derivă din faptul că Ichbiah a promis o sticlă de Beaujolais oricui a arătat apariția unor erori similare în proiectul standardului. [1] Standardul Ada 83 a suferit de efectul Beaujolais și cel puțin o sticlă a fost acordată ca premiu, dar ulterior analiza efectuată în elaborarea standardului Ada 95 ulterior a făcut posibilă eliminarea acestui comportament din limbă. [2]

Efectul Beaujolais este considerat dăunător limbii, deoarece se presupune că în timpul întreținerii codului pot fi adăugate sau eliminate clauze din unitățile de bibliotecă. În aceste situații este posibil ca unele afirmații care folosesc unitățile relative la aceste clauze să scape de analiza programatorului. Dacă limba ar permite efectul Beaujolais, codul ar putea rămâne sintactic, dar nu semantic valid, continuând să compileze, dar introducând erori greu de găsit. [2]

Descriere

Ada vă permite să împărțiți programul în unități compilate separat, inclusiv pachete (care pot conține subrutine, variabile și alte pachete). Implementarea conceptului de spațiu de nume prevede că o unitate A poate fi vizibilă într-o altă unitate B prin clauza with , permițând accesul unui membru M al A prin notația prefix AM, în timp ce clauza de use permite accesul membrilor fără a avea pentru a specifica prefixul unității de care aparțin. Deoarece Ada acceptă suprascrierea și supraîncărcarea subrutinelor, se poate întâmpla ca mai multe funcții sau proceduri cu același identificator să coexiste (în cazul supraîncărcării, acestea au o semnătură neechivocă care le permite să fie distinse static în timpul compilării).

 pachetul A este
  functia Foo ( I : Integer ) return Integer ;
capătul A ;

cu A ;
pachetul B este
   functia Foo ( I : Integer ) return Integer ;
   N: întreg: = A. Foo ( 1 ); - Funcția Foo definită în A (notație punctată)
   M : Număr întreg : = Foo ( 1 ); - Funcția Foo definită în B
capătul B ;

cu A ; folosiți A ;
pachetul C este
   functia Foo ( F : Float ) return Integer ; - funcție supraîncărcată
   N : întreg : = Foo ( 1 ); - Funcția Foo definită în A
   M : Număr întreg : = Foo ( 1,0 ); - Funcția Foo definită în C
capătul B ;

Efectul Beaujolais apare atunci când adăugarea sau eliminarea unei clauze de use într-un program Ada este capabil să schimbe semantica programului fără a încălca sintaxa, ceea ce este un efect nedorit într-un limbaj conceput pentru a oferi o precizie semantică maximă. Ichbiah a lucrat pentru a preveni un astfel de comportament în proiectul standardului Ada 83, dar s-a observat ulterior că problema a apărut încă în anumite situații particulare (legate de conversii de la tipuri universale la tipuri neuniversale și datorită regulii RM83-4.6 (15) din manual de referință) care au fost ulterior determinate cu o analiză matematică a limbii, iar efectul Beujolais a fost eliminat, se crede într-un mod complet, cu standardul Ada 95. Datorită unor modificări ale regulilor sintactice, codul Ada 83 care a generat o astfel de situație este considerată ambiguă și nu completează Ada 95. [2]

Exemplu

Un exemplu de cod care în Ada 83 suferă efectul Beaujolais este următorul: [3] [4]

 pachetul P este
proceduri Q ( B : Boolean );
capătul P ;

cu P ;
procedura principală este
functia "<" ( X , Y : Integer ) return Integer ;
procedura Q ( I : întreg ) este ...
începe
Q ( 1 < 2 );
sfârșitul Main ;

În programul de exemplu, operatorul < cu tip de returnare Integer este suprasolicitat în procedura principală de pe linia 7. Există două declarații ale procedurii Q (în pachetul P, în linia 2 și în procedura principală, în linia 8), totuși apelul la linia 10 se referă în mod unic la procedura declarată chiar în Main, în linia 8, care este Sunt unic pentru a fi vizibil direct. Dacă adăugați use P; în linia 5, există o ambiguitate datorită faptului că devine vizibilă și procedura Q declarată în P. De fapt, în ciuda faptului că tipul de returnare al operatorului < definit în Main în linia 7 este Întreg, operatorul < există și este, de asemenea, vizibil definit în pachetul Standard cu parametrii Integer'Base și tipul de returnare Boolean (prin urmare, compatibil cu procedura Q definită în P). În versiunile Ada 95 sau versiuni superioare, această situație este detectată de compilator ca fiind ambiguă, iar programul nu se compilează, în timp ce versiunea Ada 83 (conform regulii de prioritate definită în manualul de referință în RM83-4.6 (15)) între două apeluri pe care l-a ales pe cel care nu necesită conversii implicite: a fost folosit operatorul implicit < cu tip de returnare booleană (care nu necesită conversia implicită a literelor de la Universal_Integer la Integer ) și, în consecință, apelul la procedura Q definit în P pe linia 2. [3]

Notă

  1. ^ Barnes , p. 284 .
  2. ^ a b c Tucker Taft, Ce este „Efectul Beaujolais” , pe AdaPower.com ( arhivat 18 iulie 2015) .
  3. ^ a b Bill Taylor, Ghidul de compatibilitate Ada ( RTF ), p. 35 ( arhivat la 18 iulie 2015) .
  4. ^ Robert A. Duff, LSN on the Preferences Rules in Ada 9X ( TXT ), on Ada 9X Study Notes mailing list ( arhivat 18 iulie 2015) .

Bibliografie

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT