Vyšlo v týdeníku Computerworld č. 6/94,
Vytištěno z adresy: http://www.earchiv.cz/a94/a406c506.php3

von Neumannova architektura

Tento článek vyšel v tzv. tématu týdne v CW 6/94, jako šestý ze série článků věnované prvopočátkům výpočetní techniky.

Na myšlenku, že počítače by mohly být řízeny programem, přišel více než sto let před Johnem von Neumannem angličan Charles Babbage. Konkrétní způsob realizace této myšlenky se ovšem vyvíjel postupně: první představa byla taková, že počítač má svůj program zaznamenán na nějakém vnějším záznamovém médiu (děrné pásce či děrných štítcích), postupně jej načítá a ihned provádí. To ale sebou přináší některé nepříjemné komplikace - například provedení skoku znamená přemotání děrné pásky na požadované místo (analogicky pro štítky), což trvá nezanedbatelnou dobu. Zdlouhavé a problematické je pak i volání podprogramů, eventuelní rekurze při takovémto volání apod. Hlavní vinu na tom má především sekvenční charakter paměti, používané pro uchovávání programu, a s tím souvisejí postupné načítání té části programu, která je zapotřebí. Proto John von Neumann navrhl uchovávat program takovým způsobem, aby byl celý trvale k dispozici (tj. aby se nemusel postupně načítat), a aby bylo možné v něm libovolně (a hlavně "okamžitě") skákat - navrhl tedy uchovávání celého programu v paměti počítače, a navíc v takové paměti, která nemá sekvenční charakter, ale chová se jako paměť s tzv. přímým přístupem.

Velmi zajímavým momentem bylo také zpochybnění dosud zastávané představy o tom, že program a data jsou principiálně odlišné objekty, které v zásadě není možné jakkoli míchat (a tudíž ani uchovávat společně). Snad nejvýznamnější myšlenkou celé von Neumannovy architektury je právě zásada, že program i data jsou ve své podstatě jedno a totéž (a to posloupnost bitů), a o jejich povaze rozhoduje pouze způsob, jakým je interpretuje ten, kdo s nimi pracuje. Tato zásada pak von Neumannovi umožnila navrhnout, aby počítač měl jedinou paměť (tzv. operační paměť), ve které by se společně uchovávaly jak data, tak i celé programy.

Rozeberme si poněkud podrobněji tento klíčový prvek v celé soustavě názorů, které tvoří von Neumannovu architekturu: pokud se přijme zásada, že programy a data jsou principiálně odlišné objekty, je nutné je uchovávat odděleně v různých pamětech. To má jistě své výhody (například tu, že programátoři nebudou z principu moci psát samomodifikující se programy), ale také četné nevýhody. Uvědomme si například, jak pracují dnešní překladače a tzv. linkery (sestavující programy): přeložený program generují jako svá výstupní data (tedy jako objekt charakteru dat), ale tato samá data mohou být záhy spuštěna jako program (tj. mohou být interpretována jako program). Pokud bychom trvali na tom, že data a program jsou něco v principu jiného, musel by překladač a sestavující program vygenerovat přeložený program do paměti pro data, a odsud by pak musel být tento program explicitně přenesen do paměti pro programy, odkud by teprve mohl být spuštěn. Dovedete si představit, jak by na takovémto počítači fungovaly všechny ty dnešní integrované překladače typu compile&go (tj. "přelož a ihned spusť")! A co teprve nejrůznější ladící programy (debuggery), které se chvíli dívají na jednu a tutéž posloupnost bitů jako na program, a chvíli se k nim zase chovají jako k datům?

Další zásadní myšlenkou celé von Neumannovy koncepce je čistě sekvenční způsob fungování počítače. Tato představa počítá s tím, že jednotlivé strojové instrukce, tvořící program, se budou provádět postupně tak, jak jsou umístěny za sebou (až na případné skoky, volání a návraty z podprogramů). Ve své podstatě tento přístup znamená, že úkol, který má být splněn, je rozdělen na posloupnost kroků, a tyto se provádí postupně - nikoli souběžně. Pro člověka, který takovýto program píše, je jeho dekompozice do posloupnosti sekvenčně prováděných kroků mnohem přirozenější a jednodušší, než rozklad do takových činností, které se mohou provádět souběžně, mohou se prolínat v čase, a je nutné dbát na jejich správnou návaznost.

Čistě sekvenční charakter je dnes tím, co je von Neumannově architektuře snad nejvíce vyčítáno. Důvodem je skutečnost, že sekvenční charakter výpočtů nedává téměř žádný prostor pro jejich zásadní zrychlení, které by naopak bylo možné, kdyby některé činnosti bylo možné provádět souběžně (paralelně). Objevily se samozřejmě i různé alternativní architektury (tzv. ne-von Neumannovské), které s možností paralelismů předem počítají. Ovšem skutečnost, že se prosadily jen v dosti speciálních aplikacích, naznačuje zajímavou souvislost: že není ani tak těžké zkonstruovat paralelní počítač, jako jeho paralelismus využít. Problém je tedy spíše v samotném člověku, který musí stále ještě zajišťovat algoritmizaci řešených úkolů, neboli jejich vhodné naprogramování. Lidskému myšlení je skutečně blíže sekvenční postup, než velká míra paralelismu.

Velmi důležitou myšlenkou, která se prosadila v rámci von Neumannovy architektura, je následující zásada: počítač by se neměl přizpůsobovat potřebám konkrétní aplikace svou vnitřní strukturou, ale pouze programem. Jinými slovy: vnitřní struktura počítače by se neměla měnit, a měla by být maximálně univerzální, tak aby vycházela vstříc potřebám co možná nejširšího okruhu aplikací. "Šité na míru" by naopak měly být programy.

Tato zásada má jednu obrovskou výhodu: veškerou složitost, spojenou s řešením určitého zadání, převádí pouze na složitost návrhu programu (a nikoli na složitost návrhu vnitřní struktury počítače) - řeší ji tedy jen v softwaru, a nikoli v hardwaru. I v oblasti návrhu hardwaru samozřejmě existují různé metody a nástroje, umožňující vyrovnat se s velkou složitostí řešeného úkolu, ale na poli softwaru jsou analogické metody a nástroje mnohem výkonnější, lacinější i rychlejší, a v důsledku toho umožňují zvládnout i složitější a náročnější úkoly.

Jinou otázkou je ovšem efektivnost tohoto řešení. Počítač von Neumannovy koncepce je zcela záměrně navržen tak, aby na něm šlo naprogramovat prakticky cokoli. Na druhé straně hardware, který je "šit na míru" potřebám nějakého úzce vymezeného okruhu aplikací, bude zcela zákonitě efektivnější. Příkladem může být skutečnost, že úspěšné šachové počítače nejsou univerzálními počítači, ale počítači úzce specializovanými.