Vyšlo v týdeníku Computerworld č. 21/93 v roce 1993
Vytištěno z adresy: http://www.earchiv.cz/a93/a321c120.php3

Von Neumannova architektura

Představ o tom, jak by počítače měly vypadat a jak by měly fungovat, existovalo a existuje více. Přesto drtivá většina dnešních počítačů vychází z jediné takovéto představy. Ta se zrodila v polovině padesátých let v USA, v rámci projektů, které daly vzniknout dnes již legendárním počítačům EDVAC (Electronic Discrete Variable Computer) a EDSAC (Electronic Delay Storage Automatic Calculator). Šlo samozřejmě o kolektivní dílo, které však bylo pojmenováno jen po jednom ze svých autorů - zřejmě po tom, který měl na utváření celé koncepce největší vliv. Tím byl všestranný vědec, americký matematik maďarského původu John von Neumann (1903-1957), který kromě práce na vývoji počítačů stihl ještě založit matematickou teorii her, významně přispět fyzikům k jejich kvantové teorii a také se po určitou dobu podílet i na vývoji první atomové bomby.

Tzv. von Neumannova architektura (von Neumann architecture), někdy označovaná také jako von Neumannova koncepce či von Neumannovo schéma, je tedy ucelenou soustavou názorů a představ o tom, jak by měl počítač fungovat, z jakých hlavních částí by se měl skládat, co a jak by tyto části měly dělat, jak by měly vzájemně spolupracovat atd.

Dnes nám již připadá zcela samozřejmé, že počítač by se měl skládat z procesoru, tvořeného řadičem a aritmeticko-logickou jednotkou, dále z operační paměti a nezbytných vstupně-výstupních zařízení. To více či méně předpokládaly i všechny koncepce, které předcházely von Neumannově. Novum však představovala zásada, že vnitřní struktura počítače by se neměla nijak měnit v závislosti na zpracovávané úloze. Vnitřní struktura by tedy měla být maximálně univerzální, tak aby dokázala vyjít vstříc potřebám úloh nejrůznějšího typu. Veškeré přizpůsobení konkrétním úkolům má být řešeno výhradně programem.

Velmi revoluční pak byla na svou dobu myšlenka, že programy i jejich data by se měly uchovávat v téže operační paměti. Všechny předcházející koncepce totiž vycházely z představy, že programy a data jsou dvě různé věci, které nelze směšovat. Předpokládaly proto existenci samostatné paměti pro data a samostatné paměti pro programy a tyto dva druhy pamětí se nijak nepřekrývaly - měly mj. samostatné adresy a nebylo v principu možné zaměnit program za data a naopak. Von Neumannova koncepce poprvé přišla s myšlenkou, že jak programy, tak i data jsou ve své podstatě jedno a totéž (posloupnosti nul a jedniček) a rozdíl mezi nimi je dán pouze významem, který jim přisuzuje ten, kdo s nimi pracuje. Počítač vycházející z von Neumannovy koncepce, proto uchovává programy i data "na jedné hromadě" - tedy v jediné společné paměti. Záleží pak na právě probíhajícím programu, jak bude interpretovat to, co v operační paměti najde.

To je na jedné straně velmi nebezpečné, neboť nelze vyloučit riziko chybné interpretace - právě probíhající úloha může omylem "zabrousit" do dat a interpretovat je jako program, nebo naopak. Na druhé straně však tato možnost připouští takové věci, bez kterých bychom se dnes již těžko obešli: například překladače generují přeložený kód jako svá výstupní data, ale ta mohou být vzápětí interpretována jako program a spuštěna.

Dalším význačným rysem von Neumannovy architektury je samotný způsob provádění programu. Dnes nám asi připadá zcela samozřejmé, že strojové instrukce, ze kterých se každý přímo spustitelný program skládá, se provádějí postupně, jedna za druhou. Řečeno jinými slovy: každá instrukce se provede tehdy, až na ni dojde řada, a nad takovými daty, jaká jsou právě k dispozici. Je ale takovýto postup jedinou možností, nebo k němu existuje nějaká alternativa? Co kdyby se okamžik provedení určité akce řídil nikoli tím, kdy na tuto akci dojde řada (jako je tomu u von Neumannovy koncepce), ale naopak připraveností všech dat, která jsou k provedení určité akce zapotřebí? Pak by se jednalo o alternativu k von Neumannově koncepci, která se označuje jako data-flow neboli řízení tokem dat. Výhodou by byla možnost provádět více činností souběžně - tedy větší potenciál paralelismu, který von Neumannově koncepci naopak chybí. Podle von Neumannovy koncepce (v protikladu k "data-flow" označované také jako control-flow) jso u jednotlivé akce, reprezentované strojovými instrukcemi, řazeny za sebe a prováděny postupně, tj. sekvenčně.

Von Neumannova architektura je tedy ryze sekvenční a ve své čisté podobě nepředpokládá žádný paralelismus. To je na jedné straně velká výhoda, neboť sekvenční postup je přirozenější a intuitivnější než postup paralelní. Psát programy, které předpokládají čistě sekvenční zpracování, je pak snazší než psaní paralelních programů. I to je zřejmě jeden z důvodů, proč se von Neumannova koncepce udržela až dodnes, zatímco alternativní koncepce, podporující větší míru paralelismu, nejsou zdaleka tak úspěšné.

Sekvenční charakter von Neumannovy architektury je však zároveň i její velkou nevýhodou. Postupné provádění jednotlivých činností bez možnosti souběhů znamená, že v každém okamžiku bude vždy vytížena jen jedna část počítače, zatímco ostatní budou zahálet.

Další velkou nevýhodou se posléze ukázala i původní přednost von Neumannovy architektury - její snaha o maximální univerzálnost a neměnnou vnitřní strukturu. Počítač, který je univerzální, dokáže sice (téměř) všechno, ale neefektivně. Specializované počítače, jejichž vnitřní struktura je uzpůsobena pro určitý konkrétní typ úloh, dokáží být mnohem efektivnější (nejlépe je to asi patrné na specializovaných šachových počítačích).

Určitou nevýhodou von Neumannovy architektury je pak také to, že neodpovídá příliš dobře představám vyšších programovacích jazyků. Nabízí například jen jednorozměrnou (lineární) operační paměť, zatímco vyšší programovací jazyky umožňují pracovat s vícerozměrnými poli, obecnějšími datovými strukturami a záznamy, které nemají přímé ekvivalenty v hardwaru. Vše je pak nutné zajistit programovými prostředky (tedy například "zamapovat" vícerozměrné pole do jednorozměrného), ale to s sebou nese určitou režii, která dále zvyšuje celkovou neefektivnost a komplikuje i konstrukci překladačů (především těch jejich částí, které se starají o generování kódu).

Univerzální, na řešené úloze nezávislá, sekvenční a relativně jednoduchá von Neumannova architektura, kterou mají téměř všechny dnešní počítače, má tedy své výhody i své nevýhody. Vznikla sice již poměrně dávno, ale vydržela až dodnes, a přitom se nijak zásadně nezměnila (o jejím průběžném vývoji si povíme v příštích dílech). Alternativních koncepcí sice existuje více (nejen výše citovaná koncepce "data-flow"), ale žádná z nich se neujala natolik, aby dominantní postavení von Nemannovy architektury nějak ohrozila.