ALGOL

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 1. října 2021; kontroly vyžadují 5 úprav .
ALGOL
Jazyková třída programovací jazyk , procedurální programovací jazyk , imperativní programovací jazyk a strukturovaný programovací jazyk [d]
Objevil se v 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 a John McCarthy
Byl ovlivněn Fortran

Algol ( anglicky  Algol z algorithmic language  - „algorithmic language“) je název řady programovacích jazyků používaných při sestavování programů pro řešení vědeckých a technických problémů na počítači . Vyvinutý výborem IFIP pro jazyky na vysoké úrovni v letech 1958 - 1960 (Algol 58 [1] [2] , Algol 60 [3] [4] ). Kardinálně revidováno v letech 1964 - 1968 ( Algol 68 ). Jeden z prvních jazyků na vysoké úrovni . V Evropě včetně SSSR byl populární jako praktický programovací jazyk i jako akademický jazyk (jazyk pro publikování algoritmů ve vědeckých pracích), ale v USA a Kanadě nedokázal překonat Fortran , který tam byl běžný . Měl znatelný vliv na všechny později vyvinuté imperativní programovací jazyky - zejména na jazyk Pascal .

Obvykle se název Algol (bez uvedení verze) nazývá Algol 60, zatímco Algol 68 je považován za nezávislý jazyk.

Historie

Algol byl vyvinut v roce 1958 na týdenní konferenci na ETH (Curych, Švýcarsko) jako univerzální programovací jazyk pro širokou škálu aplikací a dále vylepšen komisí zřízenou Mezinárodní federací pro zpracování informací (IFIP). . Výbor zahrnoval řadu předních evropských a amerických vědců a jazykových inženýrů. Mezi nimi byli: John Backus  - jeden z tvůrců Fortranu , Joseph Wagsten  - následně vedl výbor pro vývoj jazyka Kobol , John McCarthy  - autor jazyka Lisp , vyvinutého současně s Algolem, Peter Naur  - následně dokončil "Backus normal form" , dokončení vývoje BNF Edsger Dijkstra  je holandský vědec, který se později stal široce známým jako jeden ze zakladatelů strukturovaného programování a zastánce matematického přístupu k programování, budoucí vítěz Turingovy ceny .

Práce se zpočátku potýkala s velkými obtížemi nezásadového charakteru. Jeden z členů výboru si například vzpomněl na „desetinnou bouři“ – extrémně vzrušenou diskusi mezi americkými a evropskými účastníky o tom, který znak použít jako oddělovač mezi celým číslem a zlomkovou částí čísla . Američané stáli za dobovým, Evropané požadovali používání virgule, v Evropě tradiční, a kvůli takové maličkosti hrozilo, že dílo skutečně nepadne. Aby se předešlo konfliktům ohledně menších problémů, bylo rozhodnuto, že popis Algolu bude mít tři úrovně, včetně úrovně popisů, publikací a implementace. Drobné otázky, jako je volba mezi tečkou a čárkou nebo použitou abecedou, byly přesunuty na druhou nebo třetí úroveň, což umožnilo poměrně rychle vyřešit zásadní otázky. Na publikační úrovni, dohodnuté později, bylo povoleno použití národních klíčových slov a standardů prezentace dat (včetně desetinné čárky), implementační úroveň určovala jazyk poměrně striktně - podle ní se musely stavět překladače.

Po přijetí v roce 1958 první verze popisu jazyka Algol 58 (původně se měl jmenovat jazyk IAL - International Algebraic Language, ale od toho se upustilo [5] ), byly problémy rychle realizovány, k řešení z nichž komise vytvořila novou verzi normy - Algol 60; stal se „klasickým“ Algolem. V roce 1959 John Backus vyvinul Backus Normal Form (BNF), formální způsob popisu algoritmických jazyků. První jazyk, jehož specifikace byla zaznamenána v BNF, byl Algol 58. Následně po vylepšeních navržených Peterem Naurem vznikla forma Backus-Naur (stejná zkratka - BNF nebo BNF), která byla použita pro specifikaci jazyka ALGOL 60 již ve fázi svého vývoje.

Nový jazyk našel jak přívržence, tak kritiky. Ve Spojených státech byl Algol přijat chladně, byl populární pouze v akademickém prostředí, a i to ne všude. Ti, kteří se pokusili implementovat Algol, čelili řadě obtíží. Tak se například zjistilo, že žádný z existujících počítačů tehdy nepodporoval vstup-výstup všech 116 písmen, která tvořila Algolovu abecedu.

SHARE - Americká asociace uživatelů počítačů IBM - požadovala, aby společnost implementovala Algol pro své stroje, ale kompilátor Algol pro IBM OS / 360  , který se nakonec ukázal, byl extrémně nepohodlný - je zcela přirozené, že IBM , která investovala obrovské částky ve Fortranu , neměl žádný podnět k vytvoření nového produktu, který by pouze konkuroval tomu starému. Zároveň nedostatky Fortranu donutily IBM hledat náhradu a vedly k vývoji PL / I  , nástupnického jazyka Fortranu, ve kterém byl vliv Algolu velmi patrný.

Ale v Evropě byl Algol přijat s nadšením. V akademickém prostředí si rychle získal oblibu, všude se vyvíjely kompilátory, z nichž mnohé se i přes potíže s implementací ukázaly jako velmi úspěšné. Algol se rozšířil z Velké Británie na Dálný východ SSSR a stal se jak univerzálním jazykem pro popis algoritmů ve vědeckých publikacích, tak prostředkem skutečného programování.

V SSSR byl ve Výpočetním centru Akademie věd SSSR v Programovací laboratoři pod vedením V. M. Kurochkina vytvořen překladač z jazyka ALGOL 60 pro počítač BESM-6 . Po mnoho let sloužil jako důležitý nástroj pro řešení aplikovaných problémů v různých oblastech přírodních věd a byl široce používán v mnoha organizacích SSSR.

Jazyk Algol převzala společnost Burroughs Corporation do svých modelů počínaje B5000  – tento jazyk se nazýval Elliott ALGOL. Počítače LGP-30 Dartmouth ALGOL 30

I když se jazyk Algol téměř přestal používat pro programování, zůstal po dlouhou dobu oficiálním jazykem pro publikování algoritmů.

Před textem popisu jazyka byl použit epigraf z Tractatus Logico-Philosophicus Ludwiga Wittgensteina : „Co lze vůbec říci, lze říci jasně; a o čem se nedá mluvit, o tom by se mělo mlčet. [6]

Vlastnosti jazyka

Vlastnosti jazyka Algol se staly typickými pro většinu imperativních jazyků vytvořených později. Právě v Algolu se myšlenka programu neobjevila jako volná sekvence příkazů, ale jako bloková struktura skládající se z jasně popsaných a oddělených částí. Hlavním blokem programu v Algolu je samotný hlavní program. Obsahuje svou spustitelnou část uzavřenou v bloku vymezeném dvojicí klíčových slov begina end, a také popisy podprogramů. Každý podprogram je miniaturní program, který má v sobě popsaná vlastní data, jedinečně definované rozhraní v podobě názvu a seznamu formálních parametrů a blok kódu. V tomto případě lze v bloku alokovat podbloky.

Byly identifikovány strukturní řídicí struktury: větve, smyčky, sekvenční sekce, které provádějí podmíněně nebo násobně vnořené sady příkazů, také omezené stejnými klíčovými slovy begina end, což umožnilo popsat logiku programu bez použití nepodmíněných skoků - nechvalně známý operátor goto , který vyvolává tvorbu nepřehledných a špatně strukturovaných programů.

Moderním programátorům se taková programová struktura zdá samozřejmá, poněkud zastaralá a ne vždy pohodlná (nekonečná begin je často kritizována endv programech Pascal, které tuto vlastnost zdědily od Algolu), ale v době, kdy se Algol objevil, to vše byl znatelný krok vpřed. Programy se staly pravidelnými, což umožnilo jejich navýšení objemu, aby byly viditelné, srozumitelné, přístupné analýze a opravám. Právě na základě Algolu a jeho potomků byla úspěšná práce na analytickém důkazu správnosti programů.

Extrémně důležitou vlastností Algolu byla možnost organizovat rekurzivní procedury, které dříve v průmyslových jazycích chyběly (vedoucí trhu - Fortran a Cobol - rekurze je přímo zakázána), ale široce používané v Lisp . Použití rekurzivních výpočtů může v některých případech výrazně zjednodušit strukturu programu a učinit jej srozumitelnějším díky blízkosti matematického popisu algoritmu řešení problému.

Samozřejmě, že ne všechny funkce Algolu lze nyní nazvat úspěšnými a plně promyšlenými. Jazykový standard například zcela ignoroval I/O zařízení; vývojáři se rozhodli, že každá implementace jazyka může tento problém vyřešit nezávisle, na základě charakteristik cílového stroje a potřeb uživatelů. Na druhou stranu koncept modulárního programování pomocí standardních knihoven podprogramů v té době prostě neexistoval a I/O operátory musely být obsaženy přímo v jazyce. To vedlo k tomu, že každá implementace organizovala I/O svým vlastním způsobem a v této části se programy Algol pro různé kompilátory ukázaly jako téměř zaručeně nekompatibilní.

V Algolu byly navrženy dvě metody pro předávání parametrů podprogramu - podle názvu a podle hodnoty . Druhá metoda je široce používána v naprosté většině jazyků dodnes. První předpokládá, že se proceduře předá jméno skutečného parametru a procedura funguje, jako kdyby byl její kód zapsán v referenčním bodě, kde se místo formálního parametru zapíše název skutečného parametru. Funkce s takovými parametry se snadno implementují pomocí preprocesoru (jako v jazyce C), ale generování objektového kódu pro ně je poměrně komplikované: ve skutečnosti musel kompilátor předat složité výrazy podle názvu vytvořit speciální nepojmenovanou funkci, která vyhodnocuje tento výraz ve vlastním prostředí, tzv. potopil . Nejbližším analogem thunk je closure , ale thunk se vyskytuje pouze v konkrétním kontextu předávání parametru. Tato vlastnost jazyka Algol 60, který je jinak vcelku rozumně uspořádaný, je pozoruhodná překvapivou kombinací naprosté praktické zbytečnosti s extrémní složitostí a neefektivností implementace. Proto se v dalším vývoji programovacích jazyků od předávání parametrů jménem upustilo. V jazyce PL / I, který obecně hodně zdědil od Algol-60, na této vlně zároveň opustili předávání parametrů hodnotou a ponechali, jako na začátku Fortranu, jediný mechanismus - odkazem. [7] V C naopak zůstal pouze parametr předávání hodnotou (předávání odkazem lze modelovat pomocí parametrů typu "pointer"). A pro případy, kdy má předávání parametrů podle jména smysl (je nutné například, pokud chcete vytvořit funkci, pro kterou by se hodnoty parametrů v době volání nepočítaly), byly vytvořeny speciální syntaktické mechanismy .

Datové typy

Psaní v Algolu je silné a statické .

Čísla

Algol má dva typy pro reprezentaci čísel: integer ( anglicky  integer ) a s pohyblivou řádovou čárkou ( anglicky  real ), například: 200, 100.5, . Tečka se v Algolu používá jako oddělovač desetinných míst .+210-1

Číselné literály bez znaménka jsou typu integer, zatímco všechny ostatní jsou typu real.

Booleovské hodnoty

K reprezentaci hodnot true a false se používají literály true(true) a false(false) typu Boolean, které jsou používány logickými operacemi.

Operace

Aritmetické operace

Algol poskytuje nejběžnější aritmetické operace pro celá čísla a čísla s plovoucí desetinnou čárkou :

Označení Probíhá operace Příklad Příklad výsledku
+ Přidání 1.45 + 2 3.45
- Odčítání 7-3 4
× Násobení 1.2×0.4 0.48
/ Divize 6 / 3 2
Umocňování 5↑3 125

Příklady kódu

Ahoj světe

Dobrý den, světový program v dialektu Dartmouth ALGOL 30 [8] :

ZAČÍT SOUBOR F(DRUH=VZDALNE); EBCDIC ARRAY E[0:11]; NAHRAĎTE E ZA „AHOJ, SVĚTE!“; KDYŽ PRAVDU DĚLEJTE ZAČÍT WRITE(F, *, E); KONEC; KONEC.

Pro Elliott Algol :

program HiFolks; začít tisknout "Ahoj světe"; konec ;

Pro IBM OS/360 ALGOL F :

'ZAČÍT' OUTSTRING (1, '('AHOJ, SVĚT!')'); 'KONEC'

Práce s maticí

postup Absmax(a) Velikost:(n, m) Výsledek:(y) Indexy:(i, k); hodnota n, m; pole a; celé číslo n, m, i, k; skutečné y; komentář Největší prvek matice a o velikosti n krát m je předán jako výsledek y a jeho indexy jsou předány parametrům i a k; počáteční celé číslo p, q; y:= 0; i:= k:= 1; for p:=1 krok 1 dokud n proveďte pro q:=1 krok 1 dokud m neprovede if abs(a[p, q]) > y then begin y := abs(a[p, q]); i:= p; k := q koncový konec Absmax

Tisk tabulky

Příklad implementace Elliott 803 ALGOL .

TEST ALGOLU PLOVOUCÍHO BODU' ZAČÁTE SKUTEČNĚ A,B,C,D' ZNOVU PRIDAT' PRO A:= 0,0 KROK D DO 6,3 DO ZAČÍT TISK PUNCH(3),££L??' B := SIN(A)' C := COS(A)' TISK DĚROVÁNÍ(3),SAMELINE,ZAROVNANÉ(1,6),A,B,C' KONEC' KONEC'

Tady:

  • PUNCH(3) nepošle text na děrovač, ale na vzdálenou tiskárnu.
  • SAMELINE potlačí návrat vozíku.
  • ALIGNED(1,6) určuje formát - 1 znak před a 6 znaků za desetinnou čárkou.

Jensenův trik

Zvažte následující program Algol:

začít proceduru p(a, b); jméno a, b; celé číslo a, b; začít pro a:=1 krok 1 do 10 udělat b:= 0 konec p; celé číslo i; celočíselné pole s[1:10]; p (i, s[i]) konec

Protože parametry procedury p jsou předávány jménem (viz výše), vyvolání procedury p v tomto případě povede k vynulování všech prvků pole s. Toto použití předávání parametru jménem bylo nazýváno "Jensenovým trikem" podle programátora, který jej jako první navrhl.

Viz také

Poznámky

  1. AJ Perlis , K. Samelson. Předběžná zpráva: mezinárodní algebraický jazyk  // Komunikace ACM. - 12.12.1958. - T. 1 , ne. 12 . — S. 8–22 . — ISSN 0001-0782 . doi : 10.1145 / 377924.594925 . Archivováno z originálu 16. července 2011.
  2. AJ Perlis , K. Samelson. Zpráva o algoritmickém jazyce ALGOL výboru ACM pro programovací jazyky ​​a výboru GAMM pro programování  //  Numerische Mathematik. - 12.12.1959. — Sv. 1 , iss. 1 . — S. 41–60 . — ISSN 0945-3245 . - doi : 10.1007/BF01386372 . Archivováno z originálu 24. listopadu 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 . Zpráva o algoritmickém jazyce ALGOL -60  = Zpráva o algoritmickém jazyce ALGOL-60 // Výpočet. matematika. a mat. nat. - svazek 1 , č. 2 . - S. 308-342 . — ISSN 0044-4669 .
  4. R. M. Demorgan , I. D. Hill , B. A. Wichman. Algoritmický jazyk Algol 60. Upravená zpráva = Upravená zpráva o algoritmickém jazyce Algol 60 / per. z angličtiny. A. F. Rar, ed. A. P. Ershova. - M .: Mir, 1972. - 72 s.
  5. AJ Perlis. Talk on Computing v padesátých letech // Národní konference ACM. — 1981.
  6. Otázky Vladimíra Belkina (Moskva). Otázka 34 | Co? Kde? Když? . Datum přístupu: 6. června 2015. Archivováno z originálu 2. května 2016.
  7. Pratt T. Programovací jazyky: vývoj a implementace. — M.: Mir, 1979. — 576 s.: nemocný.
  8. Ahoj světe! Ukázkový program Archivován z originálu 4. února 2010.

Literatura

Odkazy