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ă.
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]
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 .
Tastarea în Algol este puternică și statică .
NumereAlgol 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 booleenePentru 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.
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 |
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'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:
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şitDeoarece 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.
Limbaje de programare | |
---|---|
|