Aktuální vydání

celé číslo

03

2021

Digitální transformace, chytrá výroba, digitální dvojčata

Komunikační sítě, IIoT, kybernetická bezpečnost

celé číslo

Čtyřicet let objektově orientovaného programování

Čtyřicet let objektově orientovaného programování

V roce 1967 byl odborné veřejnosti představen jazyk Simula [1], tehdy nazvaný Simula 67, jako první programovací prostředek, který nabízel nástroje pro programovací paradigma, jež bylo později nazváno objektově orientované programování, po čase se rozšířilo do celého světa a je ještě v současnosti nejrozšířenějším a nejefektivnějším způsobem profesionální přípravy programových produktů. Zrod tohoto jazyka měl zajímavou prehistorii i zajímavé pokračování, o němž pojednává tento příspěvek.

Prehistorie jazyka Simula

Začátkem šedesátých let minulého století vzniklo několik jazyků pro diskrétní simulaci, jejichž autoři si všimli podobnosti mezi algoritmickým řízením výpočtů a pravidly pro realizaci paralelních dějů v mnoha oblastech, pro které simulace na počítačích slibovala přinést podstatné zlepšení exaktního studia. Vzniklo tak paradigma zaměřené na paralelní procesy, které v oblasti simulace bylo reflektováno tzv. kvaziparalelním programováním, totiž programem chápaným (a vytvořeným) jako běh vznikajících a zanikajících výpočtů vzájemně se přerušujících a aktivujících v rámci jediné výpočetní úlohy (práce, „jobu“). Vedle velmi populárního amerického jazyka GPSS a ne tak populárního – rovněž amerického – SOL (který ovšem navrhl tehdy velmi populární autor programátorských učebnic Donald Knuth. Jeho pětisvazkové dílo The Art of Computer Programming bylo zařazeno mezi dvanáct nejčtenějších knih dvacátého století z oboru matematiky a fyziky spolu s díly, která napsali Einstein, Wiener či von Neumann, vznikl i jazyk Simula, navržený dvěma norskými odborníky Ole-Johanem Dahlem a Kristenem Nygaardem a v polovině šedesátých let velmi úspěšně používaný [2], [3].

Název tohoto jazyka Simula se v šedesátých letech proslavil a první z jeho autorů byl požádán, aby na mezinárodní letní škole NATO ve francouzském Villard-de-Lans přednesl tutorial o jazycích pro diskrétní simulaci [4], [5]. Tam se setkal s C. A. R. Hoarem a s jeho příspěvkem [6] o hierarchických datových strukturách. Ten O.-J. Dahla podle jeho vlastních slov (viz např. [7], [8]) inspiroval k rozšíření jazyka Simula.

Hoarovy myšlenky vedly k jakýmsi třídám datových struktur, od nichž bylo možné dynamicky tvořit libovolný (totiž předem neurčený) počet „instancí“ (konkrétních datových exemplářů) a předem neurčený počet jakýchsi podtříd (tříd struktur obohacených o další složky dat). Složky tříd byly pojmenovány a bylo možné na ně ukázat pomocí tzv. tečkové notace. Například třídu člověk lze chápat jako třídu struktur majících složky pojmenované např. stáří, křestní_jméno, příjmení a adresa, přičemž třída, do níž patří adresy, je definována jako třída struktur majících složky město, ulice a domovní_číslo. Podtřídou třídy člověk mohou být třeba třídy důchodce (se složkou výše_důchodu navíc) a žák (se složkami škola a ročník navíc), kde škola patří do určité třídy, která má také složku adresa. Tečková notace umožňuje vyjádřit např. stáří člověka X výrazem X.stáří, ulici, kde X bydlí, výrazem X.adresa.ulice a – v případě, že X je student – ulici, kam chodí do školy, výrazem X.škola.adresa.ulice. Připomeňme, že možnost vytváření předem neznámého počtu instancí byla známa již dříve, konkrétně právě v jazycích SOL a Simula, které umožňovaly vše, co navrhoval Hoare, kromě tečkové notace a zavádění podtříd. Třída „procesů“ v tomto jazyku totiž odpovídala Hoarovým datovým strukturám, obohaceným ovšem o „životní pravidla“, tedy algoritmicky formulovaná pravidla, prováděná každou instancí a podle „plánovacích příkazů“ v nich obsažených, automaticky přepínaná v řízení monoprocesorového výpočetního systému.

Zrod objektově orientovaného programování

O.-J. Dahl tedy zavedl tečkovou notaci a podtřídy pro dosavadní procesy jazyka Simula, avšak nezůstal jen u toho. Současně totiž zavedl (a to na základě diskusí – někdy velmi bouřlivých – se svým původním spoluautorem K. Nygaardem) ještě tyto možnosti:


a) formulovat procedury jako složky (původně datových) struktur,
b) formulovat některé takové procedury jako „virtuální“, tj. otevřené změně či konkretizaci své náplně různým způsobem v podtřídách,
c) rozšířit virtualitu na cíle přenosu provádění algoritmu životních pravidel,
d) pracovat s deklarací třídy jako s jakoukoliv jinou deklarací,
e) rozšířit plánovací příkazy z oblasti simulačních modelů na jakýkoliv přenos řízení výpočtu.

Uvedené možnosti byly zabudovány a koncem 60. let implementovány v jazyku nazvaném Simula 67. Možnost a) umožnila volit názvy procedury tak, že jejich vyvolání tečkovou notací připomíná anglické (a někdy i české) věty – např. a.into(b), a.follow(c), a.vstup_do(b), a.nasleduj(b), a tedy definovat nové programovací jazyky bez nutnosti programovat jejich překladače. Možnost b) se během času ukázala jako nutný (ačkoliv zdaleka ne triviální) doplněk možnosti a) kombinované s možností tvořit podtřídy.

Možnosti c) až e) budou zmíněny později, nyní se zastavme u možností a) a b). Jen jejich přínos pro programování byl tak převratný, že trvalo přes deset let, než byly odbornou veřejností oceněny a zcela přijaty. Například v sedmdesátých letech dvacátého století přijala veřejnost s vlnou nadšení strukturované programování a později s novou vlnou nadšení modulární programování, přičemž autoři odpovídajících „nových“ programovacích prostředků se odvolávali na jazyk Simula 67, ačkoliv nerespektovali téměř nic z toho, co nabízel (např. programový modul sice mohl být chápán jako struktura s možností a), avšak bez dalších, již zmíněných možností, dokonce i bez možnosti modul implementovat nezávisle na budoucím počtu jeho současně existujících a případně kooperujících instancí).

Trvalo přes deset let, než byly možnosti a) a b) přijaty jinými specialisty než uživateli jazyka Simula 67. Stalo se to v jazyku SmallTalk. Jeden z jeho autorů – Alan Key – zavedl pro odpovídající paradigma název objektově orientované programování. Jelikož autoři jazyka SmallTalk byli Američané, tedy občané počítačově atraktivní země (na rozdíl od Skandinávie, do té doby stále ignorované), rozšířilo se objektově orientované programování do celého světa a začaly vznikat i další jazyky splňující toto paradigma. Největší popularity z nich dosáhl jazyk C++ a posléze také Pascal, který se postupně vyvinul po mnohých peripetiích a doplněních, která dost připomínala to, čemu se v Česku říká bastlení.

Popularita objektově orientovaného programování dočasně měla i svou stinnou stránku: když se tento termín zpopularizoval, kdekdo na něm hodlal parazitovat. Objekt lze totiž vidět ve všem, a tak kdekdo říkal, že programuje objektově orientovaně. Význam těchto slov se tak zamlžil, že bylo možné se setkat i v odborné literatuře s takovýmito „odbornými“ definicemi: „objektově orientované programování je programování tak nějak podobné programování v jazyce SmallTalk“. A češi si termín zkrátili na objektové programování.

Souběžně s tím pokračoval i seriózní vývoj, a tak nyní už je téměř všeobecně přijato, že objektově orientované programování je to, které využívá možnosti a), b) a možnosti navržené Hoarem (přestože Hoarova tečka může být zaměněna za jiný symbol, např. mezeru). A objektové programování, přesněji řečeno anglické object programming, dostalo také jiný význam, totiž vytváření výpočetních postupů z modulů bez použití tříd a podtříd.

Dále za hranice objektově orientovaného programování

Objektově orientované programování se od konce osmdesátých let dvacátého století stalo tak populárním a účinným, že jeho uživatele ani nenapadlo jeho nástroje rozšiřovat. O tom přemýšleli teoretici programování a autoři implementací. Z mnoha jejich někdy docela zajímavých nápadů se však ujal jen jeden, implementovaný v jazyku Small-Talk 80, totiž že vše – např. i čísla a texty – lze chápat jako instance tříd, a v důsledném pojetí tedy i sám pojem třídy. Je tudíž smysluplné uvažovat i o třídě tříd a – dovede-li se tento nápad logicky do konce – že SmallTalk sám je produktem SmallTalku, čili – řečeno termíny praxe – že SmallTalk se chová, jako by byl až na výjimečné malé „jádro“ jazyk, který jeho uživatel definoval pomocí tohoto „jádra“, a dále že tento jazyk lze kdykoliv předefinovat (někdy ovšem tak, že už se ztratí prostředky pro jeho předefinování zpět do původní podoby). Tímto objektově orientované programování prokázalo, že překročilo meze simulace směrem k tomu, co je považováno za typický příklad inteligence, totiž k sebereflexi.

Jen zvolna si však světová odborná veřejnost uvědomovala (a s obtížemi uvědomuje ještě dnes), že už v roce 1967 byly v jazyku Simula 67 podstatně překročeny meze objektově orientovaného programování. V první řadě šlo o již zmíněná „životní pravidla“ aplikovaná v kvaziparalelním programování. Tím, že je autoři jiných objektově orientovaných prostředků zanedbali, připravili horké chvíle těm jejich uživatelům, kteří vytvářeli simulační modely. Ti se museli ve své práci vrátit o desítky let nazpět k technice použité při aplikaci tzv. prostředků orientovaných na události, z nichž nejznámější byly simulační sady ve fortranu a jazyky Simscript. Je zajímavé, že z objektově orientovaných jazyků převzaly kvaziparalelní programování zatím jen čtyři, a to ukrajinský Nedis [9], britský ModSim [10], australský C-Flavours [11] a dánský Beta [12], přičemž jen poslední dva přijaly zobecnění e). S velkým nadhledem lze mezi tyto jazyky zahrnout i dnes populární jazyk Java, který však v případě objektově orientovaného i kvaziparalelního programování nutí uživatele opravdu „bastlit“, někdy i s velmi nejistým výsledkem (viz např. [13]).

Možnost c) má smysl jen tehdy, když třídy mohou být doplňovány životními pravidly. Avšak žádný ze zmíněných čtyř jazyků ji nezavedl; jazyk Java rovněž ne. Převratná je možnost d), která u jazyků, jež jsou také blokově orientované (kromě jazyka Simula 67 je to i Beta), připouští lokální třídy (tedy třídy mající danou náplň jen v některých částech programů, zatímco v některých jiných mohou mít zcela jiný smysl) a obecně připouští, aby objekt sám nesl kromě obvyklých složek (dat, procedur a životních pravidel) deklarace tříd, takže může reprezentovat model formální teorie nebo jejího nositele (experta). V důsledku toho lze relativně snadno a bez chyby simulovat systém, který je řízen simulujícími automaty, nebo modelovat diskusi expertů, kteří se při ní řídí vlastní představivostí nebo její počítačovou podporou. A to je zcela jiná cesta než od SmallTalku k modelování inteligentních systémů.

Autoři jako lidé

O.-J. Dahl zemřel 29. června 2002 a K. Nygaard ho přežil o pouhých šest týdnů. Oba byli velcí odborníci a velcí milovníci vážné hudby, přičemž ani v jedné z těchto oblastí se neshodovali svým temperamentem. K. Nygaard o sobě skromně tvrdil, že je jen pasivním konzumentem hudby, avšak bylo možné s ním velmi zaujatě hovořit např. o Leoši Janáčkovi nebo o moderním francouzském skladateli Olivieru Messiaenovi. Netroufal jsem si tohoto velkého člověka pozvat do Československa. Když jsem se ale začátkem osmdesátých let dozvěděl, že má velice rád Bohuslava Martinů, podařilo se mi pro něho získat pozvání od ČSVTS na jednu pražskou mezinárodní konferenci. Při rozloučení mi ukazoval, že za všechny koruny, které u nás obdržel, si koupil balík desek s hudbou tohoto skladatele.

O.-J. Dahl byl klavírní virtuos a člen mezinárodní asociace amatérských hudebníků a veřejně koncertoval v Oslu i jinde. Miloval hudbu Johanna Sebastiana Bacha, a když byl hostem v mém bytě, brzy po obědě s potěšením zasedl ke klavíru, abychom si zahráli Bachovy sonáty pro housle a klavír. A nešlo jen o to, zahrát si, u každé ze sonát mi vysvětloval, co mu říká, jako by se chtěl rozdělit o potěšení, které mu skladba dává. Když mě pozval přednášet na univerzitu v Oslu, soukromě doplnil, zda bych mimo oficiální přednášky nemohl uspořádat i dvě přednášky o nejstarší slovanské a východoevropské hudbě pro Fakultu hudebních a divadelních věd a zda bych mu mohl přivést noty klavírního kvartetu od mladého Josefa Suka, který slyšel, ale od něhož marně sháněl party. Když jsem pak poprvé vstoupil do jeho domu a oznámil, že Sukovu skladbu přináším, s radostí mi dal do rukou housle, a oznámil, že jeho žena hraje na violoncello, jeho dcera na violu, a tak že si kvartet hned zahrajeme. Nejde o jednoduchou skladbu, odpočítat v ní např. třináct a půl taktů pomlky je dost obtížné, avšak Ole-Johan nás od klavíru dokázal všechny ještě dirigovat.

Závěr

Je pozoruhodné, že vše uvedené již bylo konzistentně navrženo před čtyřiceti lety a brzy nato implementováno v jazyku Simula 67. Ten byl necelých dvacet let poté přijat jako mezinárodní standard ISO [14] se zjednodušeným názvem Simula (uživatelé původního simulačního jazyka Simula totiž rychle a bez problémů přešli na jazyk Simula 67, takže původní simulační jazyk upadl v zapomenutí). Jazyk představený veřejnosti před čtyřiceti roky sice byl vždy vynikajícím prostředkem pro stavbu simulačních modelů, avšak od samého začátku překročil obor simulace systémů na počítačích a zahájil novou éru týkající se analýzy problémů a syntézy programových produktů ve všech oblastech použití výpočetní techniky.

Literatura:
[1] DAHL, O.-J. – MYHRHAUG, B. – NYGAARD, K.: Class and subclass declarations. In: Buxton, J. N. (ed.): Simulation Programming Languages. Proceedings of the IFIP working konference on simulation programming languages, Oslo, May 1967. North-Holland, Amsterdam, 1968, s. 158–174.
[2] DAHL, O.-J. – NYGAARD, K.: Simula – A Language for Programming and Description of Discrete Event Systems. Introduction and User’s Manual. Norsk Regnesetralen, Oslo, 1965.
[3] DAHL, O.-J. – NYGAARD, K.: Simula – an ALGOL-based Simulation Language. Communications of the ACM, 1966, roč. 9, č. 9, s. 671–678.
[4] DAHL, O.-J.: Discrete Event Simulation Languages. Norwegian Computing Center, Oslo, 1966. Přetištěno v [5], s. 349–394.
[5] GENUYS, F. (ed.): Programming Languages. Academic Press, London – New York, 1968.
[6] HOARE, C. A. R.: Record Handling. In [5], s. 291–346.
[7] DAHL, O.-J.: The Birth of Object Orientation: the Simula Languages. In: Broy, M. – Denert, E. (eds.): Software Pioneers: Contribution to Software Engineering. Springer, Berlin, 2002, s. 78–90. Přetištěno v [8], s. 15–25.
[8] OWE, O. – KROGDAHL, S. – LYCHE, T. (eds.): From Object-Orientation to Formal Methods. Essays in Memory of Ole-Johan Dahl. Lecture Notes in Computer Science, 2635, Springer, Berlin, 2004.
[9] GLUŠKOV, V. M. – GUSEV , V. V. – MARJANOVIČ, T. P. – SACHŇUK , M. A.: Programmnyje sredstva modelirovaniya nepreryvno-diskretnych sistem. Naukova Dumka, Kiev, 1975.
[10] HERING, C.: ModSim: A new object-oriented simulation language. In: SCS Multiconference on Object-Oriented Simulation. The Society for Computer Simulation, San Diego, 1990.
[11] KREUTZE, W. – STAIRMAND, M.: C-Flavours – a Scheme-based Flavour System with Coroutines and its Application to the Design of Object-Oriented Simulation Software. International Journal of Computer Languages, 1990, roč. 15, č. 4, s. 225–249.
[12] MADSEN, O. L. – MOLLER -PEDERSEN, B. – NYGAARD , K.: Object-Oriented Programming in the Beta Programming Language. Addison Wesley, Harlow – Reading – Menlo Park, 1993.
[13] VRBA, P.: Systémové aspekty objektově orientovaného přístupu. [Doktorská disertace.] Fakulta speciálních věd, Západočeská univerzita, Plzeň, 2000.
[14] Simula Standard. Simula AB, Oslo, 1986.

Evžen Kindler

Příspěvek lze ve formátu PDF stáhnout zde