ALGOL

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 1 octombrie 2021; verificările necesită 5 modificări .
ALGOL
Clasa de limba limbaj de programare , limbaj de programare procedural , limbaj de programare imperativ și limbaj de programare structurat [d]
Aparut in 1958
Autor Friedrich Bauer , Hermann Bottenbruch [d] , Heinz Rutishauser [d] , Klaus Samelson [d] , John Backus , Charles Katz [d] , Alan Jay Perlis , Joseph Wegsten [d] , Naur, Peter , Bernard Vauquois [d] . Adrian van Wiingaarden , Greene, Julien și John McCarthy
A fost influențat Fortran

Algol ( în engleză  Algol din limbaj algoritmic  - „limbaj algoritmic”) este numele unui număr de limbaje de programare utilizate în compilarea programelor pentru rezolvarea problemelor științifice și tehnice pe un computer . Dezvoltat de comitetul de limbă la nivel înalt al IFIP în 1958 - 1960 (Algol 58 [1] [2] , Algol 60 [3] [4] ). Revizuită cardinal în 1964 - 1968 ( Algol 68 ). Una dintre primele limbi de nivel înalt . A fost popular în Europa, inclusiv în URSS, atât ca limbaj practic de programare, cât și ca limbaj academic (limbajul de publicare a algoritmilor în lucrări științifice), dar în SUA și Canada nu putea depăși Fortran , care era obișnuit acolo . El a avut o influență notabilă asupra tuturor limbajelor de programare imperative dezvoltate ulterior - în special asupra limbajului Pascal .

De obicei, numele Algol (fără a specifica versiunea) se numește Algol 60, în timp ce Algol 68 este considerat ca o limbă independentă.

Istorie

Algol a fost dezvoltat în 1958 la o conferință de o săptămână la ETH (Zurich, Elveția) ca un limbaj de programare de uz general pentru o gamă largă de aplicații și a fost perfecționat în continuare de un comitet înființat de Federația Internațională pentru Procesarea Informației (IFIP) . Comitetul a inclus un număr de oameni de știință și ingineri lingvistici europeni și americani. Printre ei s-au numărat: John Backus  - unul dintre creatorii Fortranului , Joseph Wagsten  - a condus ulterior comitetul pentru dezvoltarea limbajului Kobol , John McCarthy  - autorul limbii Lisp , dezvoltat simultan cu Algol, Peter Naur  - a finalizat ulterior „Backus normal form”, completând dezvoltarea BNF . Edsger Dijkstra  este un om de știință olandez care mai târziu a devenit cunoscut ca unul dintre fondatorii programării structurate și un susținător al abordării matematice a programării, viitor câștigător al Premiului Turing .

La început, lucrarea s-a confruntat cu mari dificultăți de natură neprincipială. De exemplu, unul dintre membrii comitetului și-a amintit „furtuna zecimală” - o discuție extrem de aprinsă între participanții americani și europeni despre ce caracter să folosească ca separator între numărul întreg și partea fracțională a numărului . Americanii au susținut perioada, europenii au cerut folosirea virgulei, tradițională în Europa, iar din cauza unui asemenea fleac, lucrarea era în pericol real de eșec. Pentru a evita conflictele legate de probleme minore, sa decis ca descrierea lui Algol să fie pe trei niveluri, inclusiv nivelul descrierilor, publicațiilor și implementării. Întrebările minore, precum alegerea dintre punct și virgulă sau alfabetul folosit, au fost mutate la al doilea sau al treilea nivel, ceea ce a făcut posibilă rezolvarea problemelor fundamentale relativ rapid. La nivel de publicare, convenit ulterior, a fost permisă utilizarea cuvintelor cheie și a standardelor naționale de prezentare a datelor (inclusiv virgulă zecimală), nivelul de implementare a determinat limba destul de strict - conform acesteia, trebuiau construite traducători.

După adoptarea în 1958 a primei versiuni a descrierii limbajului Algol 58 (inițial trebuia să se numească limba IAL - International Algebraic Language, dar aceasta a fost abandonată [5] ), s-au realizat rapid probleme, pentru rezolvare. din care comitetul a format o nouă versiune a standardului - Algol 60; a devenit „clasicul” Algol. În 1959, John Backus a dezvoltat Backus Normal Form (BNF), o modalitate formală de a descrie limbaje algoritmice. Prima limbă a cărei specificație a fost înregistrată în BNF a fost Algol 58. Ulterior, după îmbunătățirile propuse de Peter Naur, a apărut forma Backus-Naur (aceeași abreviere - BNF sau BNF), care a fost folosită pentru specificarea limbajului ALGOL 60. deja în stadiul dezvoltării sale.

Noua limbă a găsit atât adepți, cât și critici. În Statele Unite, Algol a fost primit la rece, a fost popular doar în mediul academic și chiar și atunci nu peste tot. Cei care au încercat să implementeze Algol s-au confruntat cu o serie de dificultăți. Deci, de exemplu, s-a constatat că niciunul dintre computerele care existau atunci nu acceptau intrarea-ieșire a tuturor celor 116 litere care compuneau alfabetul Algol.

SHARE - Asociația Americană a Utilizatorilor de Calculatoare IBM - a cerut companiei să implementeze Algol pentru mașinile lor, dar compilatorul Algol pentru IBM OS / 360  care a apărut în cele din urmă a fost extrem de incomod de utilizat - este destul de firesc ca IBM , care a investit enorm. sume în Fortran , nu au avut niciun stimulent pentru a crea un produs nou care să concureze doar cu cel vechi. În același timp, deficiențele lui Fortran au forțat IBM să caute un înlocuitor și au dus la dezvoltarea PL / I  , un limbaj succesor al Fortran în care influența lui Algol a fost foarte vizibilă.

Dar în Europa, Algol a fost acceptat cu entuziasm. A câștigat rapid popularitate în mediul academic, compilatorii au fost dezvoltați peste tot, dintre care mulți, în ciuda dificultăților de implementare, s-au dovedit a fi de mare succes. Algol s-a răspândit din Marea Britanie până în Orientul Îndepărtat al URSS , devenind atât un limbaj universal pentru descrierea algoritmilor în publicațiile științifice, cât și un mijloc de programare reală.

În URSS, la Centrul de calcul al Academiei de Științe a URSS din Laboratorul de Programare, sub conducerea lui V. M. Kurochkin , a fost creat un traducător din limbajul ALGOL 60 pentru computerul BESM-6 . Timp de mulți ani, a servit ca un instrument important pentru rezolvarea problemelor aplicate în diverse domenii ale științelor naturale și a fost utilizat pe scară largă în multe organizații ale URSS.

Limbajul Algol a fost adoptat de Burroughs Corporation în modelele lor începând cu B5000  - acest limbaj a fost numit Elliott ALGOL. LGP-30 au folosit Dartmouth ALGOL 30

Chiar și atunci când limbajul Algol aproape că a încetat să mai fie folosit pentru programare, a rămas pentru o lungă perioadă de timp limba oficială pentru publicarea algoritmilor.

O epigrafă din Tractatus Logico-Philosophicus al lui Ludwig Wittgenstein a fost folosită înaintea textului descrierii limbii : „Ceea ce se poate spune poate fi spus clar; și despre ceea ce este imposibil să vorbești, despre asta ar trebui să taci. [6]

Proprietăți limbii

Caracteristicile limbii Algol au devenit tipice pentru majoritatea limbilor imperative create mai târziu decât acesta. În Algol, ideea unui program a apărut nu ca o secvență liberă de comenzi, ci ca o structură de bloc constând din părți clar descrise și separate. Blocul principal al programului în Algol este programul principal în sine. Acesta conține partea sa executabilă închisă într-un bloc delimitat de o pereche de cuvinte cheie beginși end, precum și descrieri ale subrutinelor. Fiecare subrutină este un program în miniatură care are propriile sale date descrise în interiorul său, o interfață definită în mod unic sub forma unui nume și a unei liste de parametri formali și un bloc de cod. În acest caz, subblocuri pot fi alocate în bloc.

Au fost identificate structuri structurale de control: ramuri, bucle, secțiuni secvențiale care execută condiționat sau multiplica seturi imbricate de instrucțiuni, de asemenea limitate de aceleași cuvinte cheie beginși end, care au făcut posibilă descrierea logicii programului fără a utiliza salturi necondiționate - infamul operator goto , care provoacă crearea unor programe confuze și slab structurate.

Pentru programatorii moderni, o astfel de structură de program pare evidentă, oarecum depășită și nu întotdeauna convenabilă (cele infinite begin sunt adesea criticate endîn programele Pascal, care au moștenit această caracteristică de la Algol), dar la momentul apariției Algol, toate acestea au fost un pas înainte vizibil. Programele au devenit obișnuite, ceea ce a făcut posibilă creșterea lor în volum, păstrându-le vizibile, de înțeles, accesibile analizei și corectării. Pe baza lui Algol și a limbilor sale descendente, s-a desfășurat o muncă de succes privind dovezile analitice ale corectitudinii programelor.

O proprietate extrem de importantă a lui Algol a fost posibilitatea de a organiza proceduri recursive , care anterior fuseseră absente din limbajele industriale​​(liderii de piață - Fortran și Cobol - recursiunea este direct interzisă), dar utilizată pe scară largă în Lisp . Utilizarea calculelor recursive în unele cazuri poate simplifica semnificativ structura programului și îl face mai ușor de înțeles datorită apropierii de descrierea matematică a algoritmului de rezolvare a problemei.

Desigur, nu toate caracteristicile lui Algol pot fi acum numite de succes și pe deplin gândite. De exemplu, standardul de limbă a ignorat complet facilitățile I/O; Dezvoltatorii au decis că fiecare implementare a limbajului poate rezolva această problemă în mod independent, pe baza caracteristicilor mașinii țintă și a nevoilor utilizatorilor. Pe de altă parte, conceptul de programare modulară folosind biblioteci standard de subrutine pur și simplu nu exista la acel moment, iar operatorii I/O trebuiau incluși direct în limbaj. Acest lucru a dus la faptul că fiecare implementare a organizat I/O în felul său, iar în această parte a programelor Algol pentru diferiți compilatori s-au dovedit a fi aproape garantate a fi incompatibile.

În Algol, au fost propuse două metode pentru transmiterea parametrilor unei subrutine - după nume și după valoare . A doua metodă este utilizată pe scară largă în marea majoritate a limbilor până astăzi. Primul presupune că numele parametrului actual este transmis procedurii, iar procedura funcționează ca și cum codul său ar fi scris în punctul de referință, unde numele parametrului actual este scris în loc de parametrul formal. Funcțiile cu astfel de parametri sunt ușor de implementat folosind un preprocesor (ca în limbajul C), cu toate acestea, generarea de cod obiect pentru ele este destul de complicată: de fapt, pentru a trece expresii complexe după nume, compilatorul a trebuit să creeze o funcție specială fără nume care evaluează această expresie în propriul mediu, așa-numita scufundare . Cel mai apropiat analog de un thunk este o închidere , dar un thunk are loc numai în contextul specific al trecerii parametrilor. Această caracteristică a limbajului Algol 60, care de altfel este destul de rezonabil organizat, este remarcabilă pentru combinația sa surprinzătoare de inutilitate practică completă cu complexitate extremă și ineficiență a implementării. Prin urmare, în dezvoltarea ulterioară a limbajelor de programare, trecerea parametrilor după nume a fost abandonată. În limbajul PL/I, care în general a moștenit mult de la Algol-60, pe acest val, în același timp, au abandonat trecerea parametrilor după valoare, lăsând, ca la începutul Fortran, singurul mecanism - prin referință. [7] În C , dimpotrivă, a rămas doar parametrul care trece prin valoare (trecând prin referință se poate modela folosind parametri de tip „pointer”). Și pentru acele cazuri în care transmiterea parametrilor după nume are sens (este necesar, de exemplu, dacă doriți să creați o funcție pentru care valorile parametrilor nu ar fi calculate în momentul apelului), au fost create mecanisme sintactice speciale .

Tipuri de date

Tastarea în Algol este puternică și statică .

Numere

Algol are două tipuri de reprezentare a numerelor: întreg ( întreg în engleză  ) și virgulă mobilă ( în engleză real ), de exemplu: , , . Punctul este folosit ca separator zecimal în Algol.  200100.5+210-1

Literale numerice fără semn sunt de tip integer, în timp ce toate celelalte sunt de tip real.

Valori booleene

Pentru a reprezenta valorile adevărate și false , se folosesc literale true(adevărat) și false(fals) de tip Boolean, care sunt utilizate de operații logice.

Operațiuni

Operații aritmetice

Algol oferă cele mai comune operații aritmetice pentru numere întregi și numere în virgulă mobilă :

Desemnare Operațiune în curs Exemplu Exemplu de rezultat
+ Plus 1.45 + 2 3.45
- Scădere 7-3 4
× Multiplicare 1.2×0.4 0.48
/ Divizia 6 / 3 2
Exponentiatie 5↑3 125

Exemple de cod

Bună lume

Bună ziua, Program mondial în dialectul Dartmouth ALGOL 30 [8] :

ÎNCEPE FILE F(KIND=REMOTE); EBCDIC ARRAY E[0:11]; ÎNLOCUȚIȚI E CU „HELLO, WORLD!”; ÎN CÂT timp ce face adevărat ÎNCEPE SCRIE (F, *, E); SFÂRŞIT; SFÂRŞIT.

Pentru Elliott Algol :

programul HiFolks; începe tipărirea „Hello world”; sfârşitul ;

Pentru IBM OS/360 ALGOL F :

'ÎNCEPE' OUTSTRING (1, '('HELLO, WORLD!')'); 'SFÂRŞIT'

Lucrul cu matricea

procedura Absmax(a) Dimensiune:(n, m) Rezultat:(y) Indice:(i, k); valoarea n, m; matrice a; întreg n, m, i, k; y real ; comentariu Cel mai mare element al matricei a, de dimensiune n cu m este transmis ca rezultat la y, iar indicii săi sunt trecuți la parametrii i și k; începe întregul p, q; y := 0; i := k := 1; pentru p:=1 pasul 1 până la n do pentru q:=1 pasul 1 până la m do dacă abs(a[p, q]) > y atunci începe y := abs(a[p, q]); i := p; k := q capăt capăt Absmax

Imprimarea tabelului

Exemplu pentru implementarea Elliott 803 ALGOL .

TEST ALGOL CU VUNCTĂ FLOTANTĂ” ÎNCEPE REAL A,B,C,D' READAUGĂ' PENTRU A:= 0.0 PASUL D PÂNĂ LA 6.3 DO ÎNCEPE PRINT PUNCH(3),££L??' B := SIN(A)' C := COS(A)' PRINT PUNCH(3),SAMELINE,ALIGNED(1,6),A,B,C' SFÂRŞIT' SFÂRŞIT'

Aici:

  • PUNCH(3) trimite text nu către un perforator, ci către o imprimantă de la distanță.
  • SAMELINE suprimă întoarcerea căruciorului.
  • ALIGNED(1,6) specifică formatul - 1 caracter înainte și 6 caractere după virgulă zecimală.

Trucul lui Jensen

Luați în considerare următorul program Algol:

începe procedura p(a, b); numele a, b; întreg a, b; începe pentru a:=1 pasul 1 până la 10 face b:= 0 sfârşitul p; întreg i; tablou întreg s[1:10]; p (i, s[i]) Sfârşit

Deoarece parametrii procedurii p sunt trecuți prin nume (vezi mai sus), apelarea procedurii p în acest caz va duce la zero toate elementele matricei s. Această utilizare a transmiterii unui parametru după nume a fost numită „trucul Jensen”, după programatorul care l-a propus primul.

Vezi și

Note

  1. AJ Perlis , K. Samelson. Raport preliminar: limbaj algebric internațional  // Comunicări ale ACM. - 1958-12-01. - T. 1 , nr. 12 . — S. 8–22 . — ISSN 0001-0782 . doi : 10.1145 / 377924.594925 . Arhivat din original pe 16 iulie 2011.
  2. AJ Perlis , K. Samelson. Raport privind limbajul algoritmic ALGOL comitetul ACM pentru limbaje de programare și comitetul GAMM pentru programare  //  Numerische Mathematik. - 1959-12-01. — Vol. 1 , iss. 1 . — P. 41–60 . — ISSN 0945-3245 . - doi : 10.1007/BF01386372 . Arhivat din original pe 24 noiembrie 2021.
  3. ^ D. W. Backus , F. L. Bauer , D. Green , S. Katz , D. McCarthy , P. Naur , E. D. Perlis , X. Rutishauser , C. Zamelzon , B. Vokua , D. Wagstein , A. Van-Vengaarden , M. Wooder . Raport despre limbajul algoritmic ALGOL -60  = Raport despre limbajul algoritmic ALGOL-60 // Calcul. matematica. și mat. nat. - Vol. 1 , nr. 2 . - S. 308-342 . — ISSN 0044-4669 .
  4. R. M. Demorgan , I. D. Hill , B. A. Wichman. Limbajul algoritmic Algol 60. Raport modificat = Raport modificat privind limbajul algoritmic Algol 60 / per. din engleza. A. F. Rar, ed. A. P. Ershova. - M . : Mir, 1972. - 72 p.
  5. AJ Perlis. Talk on Computing in the '50 // Conferinţa Naţională ACM. — 1981.
  6. Întrebări de Vladimir Belkin (Moscova). Întrebarea 34 | Ce? Unde? Când? . Data accesului: 6 iunie 2015. Arhivat din original pe 2 mai 2016.
  7. Pratt T. Limbaje de programare: dezvoltare și implementare. — M.: Mir, 1979. — 576 p.: ill.
  8. Bună lume! Exemplu de program Arhivat din original pe 4 februarie 2010.

Literatură

Link -uri