Hlavní navigace

Startujeme

2. 9. 2006 21:18 smalltalk

Blog věnovaný Smalltalku začneme pár poznámkami k jeho spuštění. Popravdě řečeno, nastartování Smalltalku je velice složitá operace a u většiny implementací mají i ty největší kapacity často jen mlhavou představu, jak se to vlastně dělá.

Skoro u všech programovacích jazyků je dnes postup vytváření programů a jejich spuštění obdobný. Nejdříve ve svém oblíbeném textovém editoru nebo vývojovém prostředí napíšete zdrojový kód, ten pak u kompilovaných jazyků přeložíte a následně spustíte, často pod nějakým virtuálním strojem. Během spuštění se načtou moduly potřebné pro běh programu, načte se samotný program a od určitého bodu se nastartuje výpočet. U Smalltalku je tento proces v zásadě podobný, ovšem s tím rozdílem, že ho už 30 let nikdo nedělal.

Smalltalk je totiž jeden z velmi mála jazyků, který používá poměrně odvážný koncept obrazů objektové paměti nazývaných image nebo také snapshot. Od chvíle, kdy byl Smalltalk v roce 1976 ve vývojových laboratořích Xeroxu spuštěn, se již znovu nestartuje a pouze se ukládá jeho aktuální stav výpočtu, stav všech jeho objektů. Proces je to velice podobný hibernaci počítače. To mu dává status jednoho z nejdéle běžících programů vůbec a navíc celou řadu pozitivních a jedinečných vlastností, které formují jeho svébytný charakter natolik odlišný od toho, s čím se dnes může programátor běžně setkat.

Samozřejmě byla image během té dlouhé doby mnohokrát upravována a měněn její formát, ale pouze s tím, že byly přetransformovány všechny objekty z původní image. Některé objekty např. v dnešním Squeaku, který sám o sobě jako implementace oslaví na přelomu září a října deset let své existence, tak mají na krku už tři křížky.

Samotný proces spuštění image je, jak je u Smalltalku dobrým zvykem, geniálně jednoduchý a stojí za povšimnutí. Hibernace totiž neprobíhá tak, že by nad ní měl virtuální stroj plnou kontrolu. Že by existoval nějaký speciálně definovaný smalltalkovský kód, který by virtuální stroj spouštěl během inicializace bez vazby na právě hibernovaný výpočet. Skutečný postup lze schématicky vyjádřit tímto kódem:

 snapshot: save andQuit: quit
     | resuming |
     Smalltalk processShutDownList: quit.
save ifTrue: [resuming := self snapshotPrimitive].
quit & (resuming == false) ifTrue: [self quitPrimitive].
Smalltalk processStartUpList: resuming.

Znát dobře proces startování image je potřeba především v okamžiku, kdy připravujeme smalltalkovské programy pro praktické nasazení. V okamžiku, kdy potřebujeme image uložit nebo ukončit, se spustí tato metoda s patřičnými booleovskými hodnotami v parametrech save a quit (tedy například Smalltalk snapshot: true andQuit: false pro pouhé uložení image).

Nejdříve se provede ukončovací kód všech zaregistrovaných tříd, které se postarají například o korektní odpojení od databáze, zminimalizují své paměťové nároky, aby výsledný obraz paměti byl co nejmenší apod. Poté se provede primitivní metoda, při níž VM uloží image a následně se provede případné ukončení. Během provádění ukládací primitivy se může změnit hodně věcí. Čas, aktuální adresář, počítač nebo třeba platforma, na níž program běží. Virtuální stroj dá pomocí návratové hodnoty ukládací primitivy vědět, jestli je image spouštěna spolu s virtuálním strojem nebo zda se jedná o uložení za běhu. Na základě této hodnoty dojde k případnému vypnutí, aby se Smalltalk ihned po probuzení zase neukončil. Nakonec se provede startovací kód zaregistrovaných tříd. Mezi nimi je například jako jedna z posledních třída, která si přečte pomocí primitiv parametry, se kterými byl Smalltalk pouštěn z operačního systému, a zpracuje je. Řízení se poté vrátí na místo, odkud byla tato ukládací metoda volána, a pokračuje se nerušeně dále.