Obsah
1. Operační paměť počítačů Burroughs B5000
3. B5000 – první počítač s virtuální pamětí
4. Operační systém – Master Control Program (MCP)
5. Nízkoúrovňové a vysokoúrovňové programovací jazyka na mainframech
6. Jednoprůchodový překladač ALGOLu na platformě B5000
8. Programovací jazyk ALGOL na dalších sálových počítačích
1. Operační paměť počítačů Burroughs B5000
V předchozí části seriálu o historii výpočetní techniky jsme si řekli základní informace o sálových počítačích B5000, které byly na počátku šedesátých let minulého století zkonstruovány a následně vyráběny společností Burroughs Corporation. Architektura těchto mainframů v několika ohledech předběhla svoji dobu, protože počítač Burroughs B5000 patřil mezi první počítače s virtuální pamětí, možností rychlého přepínání procesů a taktéž se jednalo o platformu nabízející hardwarovou (obvodovou) podporu vyšších programovacích jazyků, především pak programovacího jazyka ALGOL, jehož syntaxe a sémantika se stala inspirací pro mnoho dalších programovacích jazyků (právě kvůli tomu se mnohdy mluví o takzvané „algolské větvi“ programovacích jazyků). V následujících kapitolách se s některými výše zmíněnými vlastnostmi platformy Burroughs B5000 seznámíme podrobněji. Nejdříve začneme popisem organizace operační paměti, protože právě struktura této paměti a způsob jejího ovládání do značné míry ovlivnila i další vlastnosti těchto počítačů.
Obrázek 1: Bubnovou paměť můžeme z technologického hlediska považovat za předchůdce dnešních pevných disků, i když se u některých počítačů používala jako sice relativně pomalá, ale zato poměrně rozsáhlá operační paměť (popř. jako sekundární oblast operační paměti, což je právě případ mainframů Burroughs B5000). Na rozdíl od pevných disků se u bubnových pamětí používala pro každou stopu samostatná sada čtecích a zápisových hlav, což zjednodušilo konstrukci paměti (nemusel se totiž konstruovat mechanismus pro vystavení hlav, které byly ostatně mnohem těžší než hlavy pevných disků, což by vystavování činilo mnohem složitějším) a současně se umožnil paralelní zápis či čtení dat ze všech stop současně.
Již minule jsme si řekli, že paměť počítače Burroughs B5000 byla rozdělena na dvě konstrukčně zcela odlišné oblasti. První oblast byla představována bubnovou pamětí (popř. i několika jednotkami bubnové paměti), která sice měla poměrně velkou kapacitu, ovšem přístup k datům nebyl zcela náhodný – doba čekání na čtení či zápis dat se lišila podle toho, kde byla data na bubnové paměti uložena a jak byla tato oblast v daném okamžiku vzdálena od čtecích či zápisových hlaviček. Druhá oblast paměti byla představována feritovou pamětí, tj. pamětí vytvořenou mřížkou vodičů, v jejichž průsečících se nacházela toroidní feritová jádra (pro každý bit bylo vyhrazeno právě jedno jádro). Tato paměť měla sice menší kapacitu a současně i větší cenu za každý uložený bit než paměť bubnová, ovšem na druhou stranu tato paměť umožňovala skutečně náhodný přístup ke čteným či zapisovaným datům. U počítačů Burroughs B5000 neměli programátoři umožněn přímý přístup do paměti (tj. do jednotlivých 48bitových slov), což je sice na jednu stranu poněkud omezující, na stranu druhou to však umožnilo vyvinout poměrně novátorský způsob práce s programovým kódem a daty uloženými v jedné z paměťových oblastí.
Obrázek 2: Sálové počítače Burroughs pracovaly se slovy o šířce 48 bitů, které byly na bubnovou paměť ukládány způsobem zobrazeným na tomto nákresu.
2. Deskriptory a segmenty
Při popisu organizace operační paměti sálových počítačů B5000 nám pomůže nákres struktury této paměti, který je zobrazený na třetím obrázku umístěném pod tímto odstavcem. Na tomto nákresu můžeme vidět především oblast nazvanou Master Control Program, což není nic jiného než paměť rezervovaná pro jádro operačního systému, nazývané taktéž zkráceně MCP. Ovšem zajímavější jsou oblasti nazvané Program Reference Table, které byly (operačním systémem) vytvořeny pro každý spuštěný proces. Na ilustračním obrázku zobrazeném pod tímto odstavcem jsou alokovány tři oblasti Program Reference Table, protože je zde zobrazena struktura paměti ve chvíli, kdy byly v počítači spuštěny tři procesy. V těchto oblastech paměti byla uložena řídicí slova známá pod jménem deskriptory (ostatně není bez zajímavosti, že slovo descriptor použila poprvé v tomto kontextu právě firma Burroughs při popisu platformy B5000). Každý deskriptor popisoval jeden datový segment, programový segment nebo segment používaný pro vstupně-výstupní operace.
Obrázek 3: Oblasti vytvořené v paměti sestavené z feritových jader.
Deskriptor datového segmentu obsahoval především velikost tohoto segmentu, počáteční adresu segmentu v paměti, adresu téhož segmentu v bubnové paměti, číslo bubnové paměti (pokud bylo použito více jednotek bubnových pamětí) a v neposlední řadě taktéž bit, který určoval, zda byl tento segment uložen pouze v bubnové paměti nebo i v paměti feritové (jádrové). Prakticky stejné informace byly ukládány i u dalších dvou typů segmentů. Povšimněte si, že na rozdíl od některých dalších architektur nemusela být velikost segmentů konstantní – bylo tomu právě naopak, protože například překladač programovacího jazyka ALGOL vytvářel pro každé alokované pole nový segment, což mimochodem vedlo k tomu, že se hardwarově kontrolovalo, zda se při indexování prvků pole nepřekračuje jeho alokovaná velikost (nikoli ovšem to, zda je překročena mez indexů nižších dimenzí u vícerozměrných polí). Navíc se díky tomu, že jednotlivé typy segmentů byly odlišeny takzvaným tagem, mohlo zajistit (opět na hardwarové = obvodové) úrovni, aby se v datovém segmentu nesnažil někdo spustit kód a naopak – s programovým segmentem se nedalo v uživatelských programech nijak manipulovat, protože jeho obsah byl určen pouze pro čtení. Právě tyto vlastnosti činily z B5000 jednu z nejspolehlivějších a nejbezpečnějších platforem své doby.
Obrázek 4: Jedna z dobových konstrukcí feritové paměti. I přesto, že tyto paměti byly poměrně velké a měly nevýhodný poměr cena/bit, byly (a pravděpodobně doposud jsou) tyto typy pamětí používány například v družicích, protože feritové paměti jsou odolné vůči kosmickému záření. U některých typů počítačů a dalších specializovaných zařízení bylo taktéž využito další vlastnosti: feritová paměť jednou zapsanou informaci „zapomene“ až po poměrně dlouhé době a nikoli ihned po výpadku napájení.
3. B5000 – první počítač s virtuální pamětí
V předchozí kapitole jsme si řekli, že každý deskriptor datového, programového nebo I/O segmentu obsahoval i jednobitový příznak určující, zda je tento segment uložen v paměti tvořené feritovými jádry, nebo pouze v některé z bubnových pamětí (tento bit byl poměrně názorně nazvaný presence bit). Aktuální hodnota tohoto bitu byla hlídána obvodově, což znamenalo, že při pokusu o přístup do segmentu uloženého pouze v bubnové paměti byla vyvolána na hardwarové úrovni výjimka (přesněji řečeno došlo k přerušení vedoucí později ke vzniku výjimky), která mohla být obsloužena operačním systémem, a to poměrně jednoduše – systém zkopíroval obsah segmentu z bubnové paměti do paměti feritové (popř. předtím nějaký segment naopak uložil do bubnové paměti, aby se uvolnila potřebná kapacita v paměti feritové). Tuto kopii mohl systém provést celkem jednoduše, protože měl všechny potřebné informace k dispozici v deskriptoru segmentu, kde byla uložena – jak již víme z předchozí kapitoly – délka dat či délka programu, číslo bubnové paměti, počáteční adresa segmentu na bubnové paměti a počáteční adresa segmentu v paměti feritové.
Obrázek 5: Data a taktéž programy mohly být ukládány na vícestopé magnetické pásky. Na této fotografii je zobrazena magnetopásková jednotka dodávaná firmou Burroughs Corporation ke svým mainframům.
Díky obvodovému řešení sálového počítače Burroughs B5000 (konkrétně kvůli hlídání stavu bitu presence s podmíněným vyvoláním přerušení) a podpoře pro kopie obsahů segmentů v jeho operačním systému MCP byla tato platforma s velkou pravděpodobností prvním počítačem s virtuální pamětí. V praxi se existence virtuální paměti projevila tak, že tento počítač nebo některý z jeho následovníků, dokázal mít v jeden okamžik spuštěný proces nebo i více paralelně běžících procesů, které mohly pracovat s daty, jejichž objem mohl být v součtu větší, než byla celková kapacita jádrové paměti. Programátoři se přitom vůbec nemuseli (a v podstatě ani nemohli!) starat o to, jakým způsobem operační systém zajistí, aby byly všechny potřebné informace přístupné. Paradoxní přitom je, že například na platformě IBM PC se ještě v osmdesátých letech minulého století (tj. 20 až 25 let po konstrukci B5000!), museli programátoři v DOSu explicitně starat o to, jakým způsobem budou pracovat s objemnými daty, které mohly být uloženy například v pamětech typu XMS, EMS či na disku nebo disketě. Teprve příchod chráněného režimu vývojáře od této povinnosti odstínil.
Obrázek 6: Zařízení pro zápis informací na děrné štítky, které bylo taktéž dodáváno k mainframům firmy Burroughs.
4. Operační systém – Master Control Program (MCP)
Firma Burroughs Corporation dodávala svým zákazníkům kromě vlastního sálového počítače a jeho periferních zařízení i operační systém Master Control Program (MCP), o němž jsme se ostatně již několikrát zmínili v předchozích kapitolách. Ovšem zatímco v současnosti se operační systémy (většinou) vyvíjí a upravují na již existující hardwarovou platformu, byla situace u firmy Burroughs v mnoha ohledech odlišná, protože řídicí obvody počítače, jeho instrukční sada i operační systém byly navrhovány současně, a to takovým způsobem, aby byl zajištěn co nejrychlejší ale současně i co nejbezpečnější běh uživatelských aplikací. Typickým příkladem vzájemného přizpůsobení hardware a software (operačního systému) je například instrukce LLLU (linked-list lookup) navržená takovým způsobem, aby zjednodušila a urychlila správu paměti operačním systémem. Dalším příkladem vzájemného přizpůsobení je elektronický obvod zajišťující, aby se při příchodu přerušení nejenom uložil stav běžícího procesu na zásobník (což je dnes ostatně zcela běžné), ale aby se i automaticky spustila dříve zaregistrovaná funkce, samozřejmě s předáním všech potřebných parametrů – a to bez nutnosti zásahu operačního systému, což ve výsledku umožnilo, aby byl přerušovací subsystém počítačů Burroughs B5000 velmi rychlý.
Obrázek 7: Rychlá řádková tiskárna používaná u mainframů Burroughs B5000 k vytváření tiskových sestav atd.
Zajímavé a ve své době i neobvyklé bylo, že operační systém Master Control Program nebyl napsán ani ve strojovém kódu ani v assembleru, ale ve vyšším programovacím jazyce nazvaném ESPOL (Executive Systems Programming Oriented Language), což byla upravená verze ALGOLu. V současnosti již jsme, zejména díky existenci různých větví Unixu, zvyklí na to, že i operační systémy jsou naprogramovány ve vysokoúrovňových programovacích jazycích, ovšem v šedesátých letech minulého století se stále jednalo spíše o výjimku. Poznámka: v dalších kapitolách se zmíníme o tom, že instrukční sada i struktura samotného procesoru mainframu B5000 byly optimalizovány pro běh přeložených programů napsaných v ALGOLu, ovšem stejné tvrzení samozřejmě ještě ve větší míře platí i pro programovací jazyk ESPOL. Na tomto programovacím jazyku je navíc zajímavé i to, že prakticky každá instrukce z instrukční sady procesoru mainframu B5000 měla svoji přímou obdobu v některé konstrukci jazyka ESPOL, což je opět jedna z odlišností od dnešní dominantní architektury i386/x86_64, kde je mezi instrukční sadou a některým vyšším programovacím jazykem dosti velká „sémantická mezera“.
Obrázek 8: Tiskárna používaná pro tisk zpráv posílaných operačním systémem. S touto tiskárnou je spojena i klávesnice, takže celek vlastně tvořil operátorskou konzoli (terminál).
5. Nízkoúrovňové a vysokoúrovňové programovací jazyka na mainframech
Vývojáři, kteří vytvářeli programy v padesátých a začátkem šedesátých let minulého století (v některých zemích však i mnohem později), měli k dispozici poměrně omezené prostředky. Při použití nižších (tj. nestrukturovaných) programovacích jazyků se řešený algoritmus nejdříve navrhl pomocí vývojových diagramů. Posléze se takto popsaný algoritmus převedl do assembleru a v této podobě se zapsal na děrné štítky. Po překladu byl výsledný objektový kód většinou zapsán na magnetickou pásku a páska byla uložena pro opětovné načtení programu do operační paměti počítače. Tvorba programů ve vyšších (strukturovaných) programovacích jazycích byla sice jednodušší, ale stále se jednalo o poměrně zdlouhavou práci s mnoha kroky. Program musel být nejdříve napsán na připravený formulář, který byl následně na děrovačce přenesen na děrné štítky. Právě zde se ukázala nutnost používat programovací jazyk se striktní syntaxí, aby se případné chyby při děrování štítků odhalily (ostatně některé chyby neodhalené při překladu jsou dnes považovány za jednu z největších známých programátorských chyb – viz často citovaná záměna čárky za tečku ve Fortranu).
Obrázek 9: Na tomto obrázku je zobrazen bitový formát dat ukládaných na magnetickou pásku mainframů Burroughs. Z obrázku se však dá vyčíst i mnohem více údajů; například to, že znaková sada měla pouze 64 znaků (2 zónové bity + 4 numerické bity) a taktéž to, že se nejednalo o sadu ASCII, ale o sadu uzpůsobenou potřebám programovacího jazyka ALGOL.
Původní překladače vyšších programovacích jazyků, které byly tradičně používány na první a druhé generaci mainframů, byly většinou implementovány takovým způsobem, že se vlastní překlad prováděl ve třech krocích. To, zda byly tyto kroky prováděny před uživatelem skrytě, záviselo na konstrukci překladače a taktéž na tom, jakou kapacitu operační paměti měl překladač k dispozici (ostatně i dnes lze u některých překladačů nařídit pouze provedení některého kroku překladu). V prvním kroku se provádělo zpracování vlastního zdrojového textu, tj. parsing textu, tvorba tokenů a popř., v závislosti na překladači, i tvorba abstraktního syntaktického stromu (AST – Abstract Syntax Tree). Ve druhém kroku se transformovaný program reprezentovaný například AST či sekvencí tokenů znovu transformoval do vhodného mezikódu (intermediate code) – mohlo se například jednat o tříadresový kód, v pozdějších dobách se používal P-kód, zásobníkový kód atd. Teprve v kroku třetím skutečně došlo k vygenerování výsledného objektového kódu, který byl buď ještě zpracován linkerem, nebo se mohlo v některých případech jednat o výsledný spustitelný kód.
Obrázek 10: Jednoduchý program v ALGOLu, na němž je vidět bloková struktura tohoto programovacího jazyka, strukturované rozhodovací příkazy, statické typování a taktéž to, že se v programu vyskytovaly operátory zapisované pomocí znaků, které nepatřily do znakové sady ASCII.
6. Jednoprůchodový překladač ALGOLu na platformě B5000
„Here is a language so far ahead of its time that it was not only an improvement on its predecessors but also on nearly all its successors.“
C. A. R. Hoare
Tříkrokový postup překladu programů, o němž jsme se zmínili v předchozí kapitole, s sebou přinášel některé výhody. První výhodou bylo zjednodušení jednotlivých částí překladače, protože se oddělil jeho frontend od backendu a v některých případech bylo možné backend překladače spustit až po proběhnutí frontendu, což byl postup využívaný na některých platformách s malou kapacitou operační paměti. Dále bylo možné kompilovaný program optimalizovat již na úrovni AST a/nebo mezikódu, kde se některé typy optimalizací (zjednodušování aritmetických a logických výrazů, detekce invariantů v programových smyčkách, rozbalování smyček, použití inline funkcí atd.) mohly provádět jednodušeji, než při generování výsledného objektového kódu. Ovšem cena za tuto větší univerzalitu byla poměrně velká: především došlo k prodloužení doby překladu (zvláště citlivé téma v dobách, kdy se platilo za strojový čas počítače) a taktéž kvůli několika transformacím a mezipřekladům docházelo k takové změně výsledného objektového kódu, která znesnadňovala jeho ladění – jinými slovy to znamená, že mezi původním zdrojovým textem a výsledným objektovým kódem byly značné sémantické rozdíly.
Obrázek 11: Manuál k první verzi FORTRANu určeného pro mainframy IBM 704.
U mainframů Burroughs B5000 byla situace poněkud odlišná, protože se při návrhu instrukční sady tohoto sálového počítače jeho tvůrci zaměřili na to, aby se první dva kroky při překladu mohly sloučit do kroku jediného a krok třetí vlastně nemusel být proveden vůbec. Díky použití zásobníkového procesoru to bylo skutečně možné – zdrojový kód byl prakticky ihned po své tokenizaci přímo převáděn do strojových instrukcí, které svou sémantikou odpovídaly známé převrácené Polské notaci (RPN – Reverse Polish Notation). Není tedy divu, že překlad programů byl v porovnání s mnoha dalšími tehdy existujícími počítači velmi rychlý, což s sebou přineslo i jednu zajímavost – pro počítače B5000 neexistoval assembler, což znamenalo, že všechny systémové utility byly psány v ESPOLu či ALGOLu (konkrétně v ALGOLu 60), protože FORTRAN a v určitém ohledu i COBOL začaly být považovány za jazyky nevhodné pro tvorbu rozsáhlejších programů – navíc byl překlad programů psaných v ALGOLu nejjednodušší.
Obrázek 12: Jedna z populárních dobových učebnic ALGOLU 68.
7. ALGOL namísto assembleru?
In general I viewed ALGOL as a perfected version of BASIC and FORTRAN, sort of a programmer's dream language.
Vzhledem k tomu, že se programátoři na sálovém počítači Burroughs B5000 prakticky nikdy nesetkali s assemblerem ani přímo se strojovým kódem, byla zaručena i dopředná kompatibilita s dalšími počítači navrženými touto společností, které byly používány v následujících více než 25 letech – programy napsané ve vyšším programovacím jazyce ALGOL 60 nebo COBOL 61 bylo možné jednoduše přenést na modernější systémy, které mohly být teoreticky vybavené zcela odlišnou instrukční sadou (ve skutečnosti se instrukční sada v naprosté většině případů sice rozšiřovala, ale neměnila). Nejednalo se tedy o striktně binární kompatibilitu, s jakou se můžeme setkat především na některých mainframech IBM a samozřejmě též na platformě i386, ale o kompatibilitu zaručenou tím, že programátoři nikdy nemuseli a ve většině případů ani nemohli přistupovat přímo „na železo“.
Obrázek 13: Spolu s rozšiřováním Fortranu z mainframů firmy IBM na další architektury – včetně sálových počítačů Burroughs – se zvyšovala potřeba standardizace tohoto jazyka. Postupně vzniklo několik norem, například ANSI norma FORTRAN 66, FORTRAN 77, či ANSI/ISO standard Fortran 90 (názvy standardů jsou uvedeny správně – jméno jazyka se skutečně postupem času změnilo z „FORTRAN“ na „Fortran“).
Jak jsme se již zmínili v předchozím textu, byl překladač ALGOLu, přesněji řečeno jeho implementace na počítači Burroughs B5000, která se v několika maličkostech odlišovala od standardního ALGOLu 60, velmi rychlý. Čas překladu průměrně rozsáhlých programů se pohyboval v řádech desítek sekund až jednotek minut, zatímco u mnoha dalších platforem se programy v některých případech překládaly i několik desítek minut až hodin. Navíc se, především díky použití zásobníkového kódu, většina výrazů přeložila takovým způsobem, že ladění programů bylo snazší (u architektur používajících pracovní registry namísto zásobníku je v některých případech problematické zjistit, jak se vlastně nějaký aritmetický či logický výraz přeložil, protože některé registry musí být použity pro uložení mezivýsledků, popř. je pořadí některých operací přehozeno; zatímco u zásobníkového kódu tomu tak nemusí být a v případě B5000 tomu tak ani nebylo).
Obrázek 14: Na mainframech Burroughs B6700 byla použita mírně upravená verze ALGOLu 60.
Kromě programovacího jazyka ALGOL se na platformě B5000 poměrně často používal i programovací jazyk COBOL 61, takže si programátoři v závislosti na povaze řešeného projektu většinou vybírali mezi „algebraickým“ jazykem ALGOL a „konverzačním“ jazykem COBOL, v němž se původně prakticky všechny deklarace, příkazy a dokonce i výrazy zapisovaly pomocí sekvence anglických slov.
8. Programovací jazyk ALGOL na dalších sálových počítačích
Programovací jazyk ALGOL původně vznikl za účelem snadno pochopitelného algoritmického popisu matematických (především numerických) úloh, výuku programování a vývoj překladačů. Z tohoto důvodu například původní návrh jazyka (IAL – International Algorithmic Language, později přejmenovaný na ALGOL 58) neobsahoval žádné konstrukce pro vstup a výstup dat (ty ostatně ani nebyly součástí ALGOLu 60), ovšem se vznikem prvních reálných překladačů se množina konstrukcí jazyka postupně rozrůstala, takže ve standardu ALGOL 68 již jazyk obsahoval jak operace vstupu a výstupu, tak i podporu pro nenumerické úlohy aj. V programovacím jazyce ALGOL byly prakticky poprvé použity konstrukce umožňující strukturované programování – týká se to především programových smyček bez návěští, podmíněných příkazů, blokové struktury programu a též lexikálního rozsahu (viditelnosti) proměnných v závislosti na tom, ve kterém programovém bloku je proměnná deklarována (tuto vlastnost z ALGOLu převzal i programovací jazyk Scheme, který je v v mnoha jiných ohledech založený na LISPu).
Obrázek 15: Graf syntaxe smyčky FOR v ALGOLu. Povšimněte si toho, že pomocí této jazykové konstrukce lze vytvořit jak počítanou smyčku (což je dodnes dodržovaný úzus při použití klíčového slova FOR), tak i smyčku typu WHILE s podmínkou vyhodnocovanou na začátku těla smyčky.
Programovací jazyk ALGOL se využíval jak pro zápis programů v učebnicích a vědeckých článcích (mnohdy až prakticky do současnosti), tak i v každodenní programátorské praxi. V tištěné literatuře se používal poněkud jiný způsob zápisu, protože bylo možné použít typografické zvýraznění jednotlivých prvků jazyka i sadu znaků velké a malé abecedy, zatímco některé mainframy používaly pouze znaky velké abecedy. Jednou ze zajímavostí je, že se tento jazyk (resp. jeden z jeho dialektů) používal i v SSSR, mj. také v projektu raketoplánu Buran. Tato verze jazyka byla dokonce v SSSR standardizována takovým způsobem, že používala znakovou sadu definovanou v normě GOST 10859 (kromě toho vznikl derivát ALGOLu nazvaný ALGAMC). Existuje i čínská verze tohoto jazyka, ve které se namísto znaků z tabulek ASCII či EBDIC používají národní znaky. Programovacím jazykem ALGOL se inspirovali tvůrci mnoha dalších programovacích jazyků. Jedná se například o jazyky Simula, Pascal (i další jazyky navržené N. Wirthem) a v neposlední řadě též trojice na sebe navazujících jazyků BCPL, B a C. Na syntaxi céčka jsou postaveny další jazyky, zejména C++, Java a dokonce dynamicky typovaný JavaScript. Těmto jazykům se proto také někdy říká „algolské“ (Algol-like) nebo též jazyky patřící do algolské větve.
Obrázek 16: Programovací jazyk ALGOL byl používán nejenom na platformě B5000, ale například i o deset let později na sálových počítačích Burroughs B6700.
Na následujícím výpisu krátkého programu (jedná se o známý Bresenhamův algoritmus rasterizace úsečky) si povšimněte, že je celý program snadno pochopitelný i v případě, že jazyk ALGOL neznáte. Mnoho konstrukcí ALGOLu totiž skutečně „zdomácnělo“ i v dalších programovacích jazycích. Poznámka: zde je použitý dialekt ALGOL 68, při použití ALGOLu 60 by se například programové smyčky zapisovaly odlišným způsobem.
PRAGMAT READ "Basic_bitmap_storage.a68" PRAGMAT; line OF class image := (REF IMAGE picture, POINT start, stop, PIXEL color)VOID: BEGIN REAL dx = ABS (x OF stop - x OF start), dy = ABS (y OF stop - y OF start); REAL err; POINT here := start, step := (1, 1); IF x OF start > x OF stop THEN x OF step := -1 FI; IF y OF start > y OF stop THEN y OF step := -1 FI; IF dx > dy THEN err := dx / 2; WHILE x OF here /= x OF stop DO picture[x OF here, y OF here] := color; err -:= dy; IF err < 0 THEN y OF here +:= y OF step; err +:= dx FI; x OF here +:= x OF step OD ELSE err := dy / 2; WHILE y OF here /= y OF stop DO picture[x OF here, y OF here] := color; err -:= dx; IF err < 0 THEN x OF here +:= x OF step; err +:= dy FI; y OF here +:= y OF step OD FI; picture[x OF here, y OF here] := color # ensure dots to be drawn # END # line #;
Následující příklad (převzatý ze stránek projektu Rosetta Code) vypočítá přibližnou hodnotu čísla Π metodou Monte Carlo. Opět se jedná o program napsaný v dialektu ALGOL 68. Povšimněte si především operátoru ** (mocnina) a taktéž +:= (displacement operator vracející původní hodnotu a současně provádějící inkrementaci):
PROC pi = (INT throws)REAL: BEGIN INT inside := 0; TO throws DO IF random ** 2 + random ** 2 <= 1 THEN inside +:= 1 FI OD; 4 * inside / throws END
9. Odkazy na Internetu
- ALGOL in the early 1970s
http://www.simnia.com/it/clycl/algol/algol.htm - Burroughs: IF (Dec, 1961)
http://blog.modernmechanix.com/2009/02/10/burroughs-if/ - Burroughs B5000: Encyclopedia II – Burroughs B5000 – ALGOL
http://www.experiencefestival.com/a/Burroughs_B5000_-_ALGOL/id/4823149 - HOW ASCII GOT ITS BACKSLASH
http://www.bobbemer.com/BACSLASH.HTM - Burroughs B5000 Computer
http://www.cs.uaf.edu/2010/fall/cs441/proj1/b5000/ - Burroughs large systems (Wikipedia)
http://en.wikipedia.org/wiki/Burroughs_large_systems - Burroughs large systems instruction sets (Wikipedia)
http://en.wikipedia.org/wiki/Burroughs_large_systems_instruction_sets - William Seward Burroughs
http://history-computer.com/MechanicalCalculators/19thCentury/Burroughs.html - Burroughs Corporation (Wikipedia)
http://en.wikipedia.org/wiki/Burroughs_Corporation - Adding machine (Wikipedia)
http://en.wikipedia.org/wiki/Adding_machine - Burroughs B-205
http://www.angelfire.com/scifi/B205/ - Burroughs 205 Hardware Package Design
http://tjsawyer.com/B205Pkg.htm - ERA 1101 Documents
http://ed-thelen.org/comp-hist/ERA-1101-documents.html - Ukázkový program pro UNIVAC 1101/ERA 1101
https://wiki.cc.gatech.edu/folklore/index.php/Engineering_Research_Associates_and_the_Atlas_Computer_(UNIVAC_1101) - UNIVAC I Computer System
http://univac1.0catch.com/ - UNIVAC I Computer System
http://univac1.0catch.com/yellowpage.htm - UNIVAC (Wikipedia)
http://en.wikipedia.org/wiki/Univac - UNIVAC I (Wikipedia)
http://en.wikipedia.org/wiki/UNIVAC_I - UNIVAC II – Universal Automatic Computer Model II
http://ed-thelen.org/comp-hist/BRL61-u4.html - UNIVAC II (Wikipedia)
http://en.wikipedia.org/wiki/UNIVAC_II - UNIVAC III (Wikipedia)
http://en.wikipedia.org/wiki/UNIVAC_III - UNIVAC 1101 (Wikipedia)
http://en.wikipedia.org/wiki/UNIVAC_1101 - UNISYS History Newsletter
https://wiki.cc.gatech.edu/folklore/index.php/Main_Page - UNIVAC Solid State (Wikipedia)
http://en.wikipedia.org/wiki/UNIVAC_Solid_State - Bi-quinary coded decimal (Wikipedia)
http://en.wikipedia.org/wiki/Bi-quinary_coded_decimal - UNIVAC III Data Processing System
http://ed-thelen.org/comp-hist/BRL61-u4.html#UNIVAC-III - The UNIVAC III Computer
https://wiki.cc.gatech.edu/folklore/index.php/The_UNIVAC_III_Computer - UNIVAC III Photos
http://jwstephens.com/univac3/page01.htm - A History of Unisys Computers (kniha)
http://www.lulu.com/product/hardcover/a-history-of-unisys-computers/4627477 - UNIVAC III Instructions Reference Card
http://www.bitsavers.org/pdf/univac/univac3/UT-2455_UNIVACIII_RefCd61.pdf - Index register (Wikipedia)
http://en.wikipedia.org/wiki/Index_register - FLOW-MATIC, COBOL's Roots, Birth of COBOL…
http://www.inf.fu-berlin.de/lehre/SS01/hc/pl/cobol.htm - FLOW-MATIC
http://en.wikipedia.org/wiki/FLOW-MATIC - FLOW-MATIC Manual
http://archive.computerhistory.org/resources/text/Remington_Rand/Univac.Flowmatic.1957.102646140.pdf - Grace Murray Hopper
http://cs-www.cs.yale.edu/homes/tap/Files/hopper-story.html - Grace Hopper
http://en.wikipedia.org/wiki/Grace_Hopper - Biographies of Women Mathematicians: Grace Murray Hopper
http://www.agnesscott.edu/lriddle/women/hopper.htm - A-0 System
http://en.wikipedia.org/wiki/A-0_programming_language - Rosetta Code – Category:COBOL
http://rosettacode.org/wiki/Category:COBOL - COmmon Business Oriented Language
http://foldoc.org/COBOL - COBOL Compilers
http://www-01.ibm.com/software/awdtools/cobol/ - Cobol: Not Dead Yet
http://www.computerworld.com/s/article/266156/Cobol_Not_Dead_Yet?intsrc=kc_rfavs - The future's bright … the future's Cobol
http://features.techworld.com/applications/3056/the-futures-bright–the-futures-cobol/ - COBOL Example Programs
http://www.csis.ul.ie/COBOL/examples/default.htm - Introduction to COBOL
http://www.csis.ul.ie/COBOL/Course/COBOLIntro.htm - COBOL programming – tutorials, lectures, exercises, examples
http://www.csis.ul.ie/COBOL/ - Wikipedia: COBOL
http://en.wikipedia.org/wiki/COBOL - Humor on Computers, Systems and Programming
http://www-crypto.htw-saarland.de/weber/misc/programming.html - OpenCOBOL
http://en.wikipedia.org/wiki/OpenCOBOL - OpenCOBOL.org
http://opencobol.org/ - OpenCOBOL FAQ
http://opencobol.add1tocobol.com/ - TinyCOBOL
http://tiny-cobol.sourceforge.net/ - TinyCOBOL FAQ
http://tiny-cobol.sourceforge.net/docs/faq/ - JTC1/SC22/WG4 – COBOL
http://ra.dkuug.dk/jtc1/sc22/wg4/ - COBOL on COGS
http://www.coboloncogs.org/INDEX.HTM - Cobol Coders: Going, Going, Gone?
http://www.computerworld.com/s/article/266228/Cobol_Coders_Going_Going_Gone_ - BUNCH
http://en.wikipedia.org/wiki/BUNCH - The Colossus That Works
http://www.time.com/time/magazine/article/0,9171,949693–5,00.html - Mainframe computer
http://en.wikipedia.org/wiki/Mainframe_computer - United States Census Bureau
http://en.wikipedia.org/wiki/United_States_Census_Bureau - Slideshow – More Core Memories
http://spectrum.ieee.org/computing/hardware/slideshow-more-core-memories - UNIVAC I Mercury Delay Line Memory
http://ed-thelen.org/comp-hist/vs-univac-mercury-memory.html - Digital Number System Part-III
http://www.asic-world.com/digital/numbering3.html - Excess-3 – Definition
http://www.wordiq.com/definition/Excess-3 - Excess-3
http://en.wikipedia.org/wiki/Excess-3 - Method of complements
http://en.wikipedia.org/wiki/Method_of_complements - Univac documentation
http://www.bitsavers.org/pdf/univac/univac1/ - UNISERVO
http://en.wikipedia.org/wiki/UNISERVO - John Mauchly
http://en.wikipedia.org/wiki/John_Mauchly - J. Presper Eckert
http://en.wikipedia.org/wiki/J._Presper_Eckert - BINAC
http://en.wikipedia.org/wiki/BINAC - Delay line memory
http://en.wikipedia.org/wiki/Delay_line_memory - Paměť se zpožďovací linkou
http://cs.wikipedia.org/wiki/Paměť_se_zpožďovací_linkou - Description of the BINAC
http://www.palosverdes.com/lasthurrah/binac-description.html - UNIVersal Automatic Computer
http://www.thocp.net/hardware/univac.htm - IBM 36-bit computers
http://www.36bit.org/ibm/ - Symbolics 36-bit computers
http://www.36bit.org/symbolics/ - IBM System 360/370 Compiler and Historical Documentation
http://www.edelweb.fr/Simula/ - Who Was Who in IBM's Programming Research? Early FORTRAN Days
http://www.trailing-edge.com/~bobbemer/PRORES.HTM - Control Data Corporation (CDC) 6600: 1966–1977
http://www.cisl.ucar.edu/computers/gallery/cdc/6600.jsp - Control Data Corporation (CDC) 7600: 1971–1983
http://www.cisl.ucar.edu/computers/gallery/cdc/7600.jsp - Cray History
http://www.cray.com/About/History.aspx?404;http://www.cray.com:80/about_cray/history.html - Cray Historical Timeline
http://www.cray.com/Assets/PDF/about/CrayTimeline.pdf - Company: Cray Research, Inc. (Computer History)
http://www.computerhistory.org/brochures/companies.php?alpha=a-c&company=com-42b9d5d68b216 - PDP-1 Web Pages
http://www.pdp-1.org/ - PDP-1 Restoration Process
http://pdp-1.computerhistory.org/pdp-1/ - Programmed Data Processor
http://en.wikipedia.org/wiki/Programmed_Data_Processor - Digital Equipment Corporation
http://en.wikipedia.org/wiki/Digital_Equipment_Corporation - PDP-1
http://en.wikipedia.org/wiki/PDP-1 - Ancient Computing Machinery
http://www.ee.ryerson.ca/~elf/ancient-comp/index.html - Spacewar – The first computer video game. Really!
http://www3.sympatico.ca/maury/games/space/spacewar.html - Programmed Data Processor-1 Handbook
http://www.dbit.com/~greeng3/pdp1/pdp1.html