Hlavní navigace

Squeak: návrat do budoucnosti (9)

6. 4. 2004
Doba čtení: 8 minut

Sdílet

Můžete mít sebelépe navržený programovací jazyk, ale o jeho použitelnosti stejně nakonec rozhoduje kvalita vývojových nástrojů. Než dokončíme výklad jazyka Smalltalk, představíme si v následujících dílech základní principy a prostředky, které dělají ze smalltalkovských systémů jedny z nejproduktivnějších vývojových prostředí současnosti.

Smalltalk se vyznačuje tím, že neodděluje vývojové nástroje od samotné vyvíjené aplikace a fáze návrhu, prototypování, kódování, ladění a testování programu slučuje do jediné. Ve spojitosti se silnými reflektivní prvky jazyka se tak ze Smalltalku stává mocný nástroj jako stvořený pro aplikaci moderních metod vývoje softwaru. V našem výkladu začneme popisem nejzákladnějších programů – Workspace, Transcriptu a Browseru.

Workspace

Workspace je v podstatě obyčejné textové okno, které se svými schopnostmi příliš neliší od ostatních oken pro zadávání kódu. Otevřete jej kliknutím levým tlačítkem na pracovní plochu (vyroluje se tzv. World menu) - open – workspace. Další možností je vysunutí záložky Tools a přetažení ikonky Workspace kamkoliv na plochu. Pokud má focus plocha, lze jej také spustit klávesovou zkratkou Atl+k. Otevřeno může být současně několik oken Workspace.

Zdrojové kódy, které v něm napíšete, nejsou součástí žádné metody, tzn. že smí používat pouze svoje lokální proměnné a vykonávání kódu není vázáno na žádný objekt (self a super vrací nil). Jeho velkou předností je, že si pamatuje nedeklarované proměnné. To znamená, že pokud v něm napíšete kus kódu a necháte jej provést, nemusí obsahovat podobně jako např. v PHP explicitní deklaraci proměnných, tzn. jejich seznam v rourách.

| var1 var2 var3 |

Zároveň jsou tyto proměnné v kontextu Workspace uchovávány. Co to znamená v praxi? Ve své podstatě není Smalltalk nic jiného než objektová databáze. Workspace pak plní funkci databázové konzole. Pokud v něm napíšete nějaký výraz, označíte jej myší a k jeho vykonání dáte povel pomocí stisku Alt+d nebo vyvoláním kontextového menu volbou položky do it, vytvoří se v tom okamžiku instance kompilátoru, která váš kód zkontroluje, přeloží do bytekódu a provede. Výsledek se nikam neukládá ani nevypisuje. Neméně důležitá je volba print it (Alt+p), která dělá totéž co do it, ale výsledek výrazu za něj vypíše a označí (aby jej bylo možno rychle smazat).

Protože si Workspace pamatuje proměnné, pracuje se s ním podobně, jako kdybyste postupně vytvářeli SQL dotazy, mezivýsledky vkládali do dočasných tabulek, nad nimi opět prováděli další dotazy, zkoumali výsledky, prověřovali různé varianty apod. To, že se jedná o poměrně příjemný styl psaní kódu, vám jistě potvrdí nejeden programátor v Prologu, Lispu apod.

Platnost implicitních proměnných ve Workspace končí v okamžiku, kdy je jeho okno uzavřeno. Je dobré pamatovat na dvě drobnosti. Pokud v označeném a vykonávaném bloku kódu nadeklarujete lokální proměnné v rourách, stanou se proměnnými bloku a jejich platnost končí s ukončením provádění bloku. Workspace o nich nemá ani potuchy. Druhou drobností je, že pokud ve Workspace napíšete doposud neznámý identifikátor, je považován za neinicializovanou proměnnou s hodnotou nil, takže je třeba si dávat pozor na překlepy.

Transcript

Transcript plní funkci standardního výstupu. Otevřete jej mimo jiné pomocí World menu – open – transcript nebo přetažením ze záložky Tools.

Transcript je globální proměnná třídy TranscriptStream. Proto s ním lze odkudkoliv pracovat např. pomocí klasického výrazu

Transcript show: 'hello world'; cr.

Pokud je otevřeno více oken Transcriptu zároveň, probíhá výpis do všech současně. Přistupovat k Transcriptu může zároveň i více vláken a při jeho používání je nutné počítat s implicitní režií na zamykání a synchronizaci. Proto je jeho výstup poměrně hodně pomalý. Uplatnění nachází především pro ladící výstupy.

Transcript samozřejmě umožňuje libovolnou editaci svého obsahu včetně příkazů do it, print it a atd. Při práci je vhodné jej mít otevřený, protože sem tam do něj někdo napíše něco užitečného.

Browser

O Browseru jsme se již zmínili. Jedná se o sadu několika nástrojů pro procházení a editaci zdrojových kódů systému.

System Browser

Naleznete jej v záložce Tools nebo pod položkou open ve World menu. Je to nejpoužívanější varianta Browseru s pěti okny. První obsahuje seznam systémových kategorií, druhé třídy v dané kategorii, třetí seznam kategorií metod, čtvrté seznam metod a největší páté text vlastní metody, nápovědu apod.

V kontextovém menu vyvolaném nad seznamem systémových kategorií je zcela jistě nejdůležitější možnost vyhledání třídy podle jména (find class). V něm rovněž naleznete položky pro přidání vlastní systémové kategorie, přejmenování již existující nebo její odstranění. Důležitá je rovněž možnost pomocí volby fileOut vyexportovat zdrojové texty všech tříd v kategorii do jednoho souboru.

V kontextovém menu nad seznamem tříd máte mimo jiné možnost otevřít další specializované varianty Browseru. Kromě vyfajlování třídy, jejího přejmenování, vytvoření její kopie (včetně metod), odstranění apod. máte na výběr ještě celou řadu dalších užitečných funkcí, např. procházení míst použití dané instanční/třídní proměnné, procházení míst použití dané třídy, procházení nepoužitých metod, nepoužitých instančních a třídních proměnných, vytvoření a správu demonstrační instance dané třídy atd.

Máte zde rovněž možnost automaticky vygenerovat metody přistupující k instančním proměnným. Protože všechny instanční proměnné jsou výhradně privátní (přesněji řečeno protected), lze k nim přistupovat pouze prostřednictvím zpráv. Máte-li např. instanční proměnnou value, pak metoda pro její čtení vypadá takto:

value
        ^ value

a metoda pro zápis do ní nějak takto:

value: anObject
        value := anObject.

Tedy je to obdoba properties např. v C#, ale se smalltalkovskou syntaxí. Určitě neuškodí připomenout, že výraz value uvnitř metody je reference na instanční proměnnou, kdežto volání metody value se zapisuje jako self value (první vždy musí být příjemce zprávy).

Pokud se budete snažit vytvořit nebo přejmenovat nějakou třídu pouhým přepsáním jejího jména v definici, vytvoříte její kopii bez metod v ní obsažených. Na druhou stranu, pokud přepíšete v definici jméno systémové kategorie, dojde ke korektnímu přesunu této třídy a případně k vytvoření nové kategorie, pokud v systému neexistuje.

S kategoriemi metod můžete provádět očekávatelnou množinu operací, tzn. pustit nad nimi specializovanou verzi browseru, přejmenovávat je, reorganizovat, odstraňovat, vyfajlovávat atd.

Nad metodami lze provádět nepřeberné množství operací. Ty nejdůležitější jsou přístupné mimo kontextového menu i přes speciální lištu tlačítek a funkce, které nabízejí, rozhodně nejsou k zahození.

senders
zobrazí všechny metody, v nichž je daná metoda volána
implementors
zobrazí všechny stávající implementace této metody v celém Smalltalku
versions
zobrazí seznam všech verzí metody. Můžete se vracet ke starším, porovnávat změny apod
inheritance
zobrazí všechna přetížení metody v hierarchii tříd. Změnou barvy tohoto tlačítka můžete můžete vidět, zda se jedná o již přetíženou metodu
hierarchy
spustí Hierarchy Browser
inst vars, class vars
již zmíněné procházení použití instančních a třídních proměnných

Dále je možné měnit způsob zobrazení metody. Od nejjednoduššího čistě textového přes automatické přeformátování zdrojového textu, barevné zvýrazňování syntaxe, zobrazení dekompilované verze metody a jejího bytekódu až po výpis s alternativní slovní syntaxí nebo třeba vytvoření grafické reprezentace, kdy můžete s kódem pracovat pomocí myši.

Mimo to lze v Preferences pomocí volby annotationPanes zapnout další podokno Browseru s dodatečnými informacemi o metodě. Je to například čas jejího vytvoření, iniciály autora apod. Pro nastavení položek, které má toto podokno obsahovat, slouží nástroj Annotations v záložce Tools pracovní plochy.

Iniciály autora jsou uchovávány v časové známce metody, a pokud je nemáte v systému nastaveny, zeptá se vás na ně Smalltalk ve chvíli, kdy jsou potřeba, formou malého dialogového okna. Časová známka vypadá např. takto: jm 3/27/98 06:19.

Další varianty Browseru

Package Browser rozšiřuje System Browser o okno se seznamem balíčků. Nejedná se o nic jiného než o sloučení systémových kategorií se stejným prefixem před pomlčkou. Hierarchy Browser umožňuje snadný pohyb v hierarchii tříd. Protocol Browser slouží k procházení seznamu všech metod dané třídy včetně metod předků. Class Browser omezuje procházení zdrojových kódů jen na danou třídu. Message Category Browser slouží k procházení metod dané kategorie metod. Message Browser se používá všude, kde je třeba procházet implementace více různých metod.Versions Browser umožňuje zkoumání více verzí jedné metody.

Obecné možnosti editace zdrojových textů

Všechna okna sloužící k editování zdrojových kódů mají velmi podobné vlastnosti. Kromě samozřejmých funkcí, jako je práce se schránkou, operace zpět, vyhledávání apod., nabízejí ještě mnoho navíc. Když pomineme pro programátora nepříliš důležité možnosti změny fontu, velikosti a třeba i rozpoznávání ručně psaného písma, stále naleznete celou řadu operací, které jsou nesmírně užitečné.

Nejužitečnější je funkce browse it. Pokud ji zvolíte v kontextovém menu nad myší označeným textem nebo stisknete klávesovou zkratku Alt+b, otevře se Browser nad tím, co označený text představuje. Nejčastěji to bývá jméno třídy nebo selektor metody. Je důležitá především proto, abyste získali dokumentaci k dané třídě či metodě, tedy abyste si mohli prohlédnout záložku ? v Browseru či přečíst si vysvětlující komentář u metody.

Funkce senders of it, implementor of it a references to it vyvolávané nad selektorem metody či třídy jistě není třeba znovu představovat. Často používané jsou funkce, které nad označeným kouskem textu vyhledávají selektory metod, které označený text obsahují, vyhledávají všechny metody, které obsahují daný řetězec, vyhledávají všechny třídy, které označený řetězec obsahují v dokumentaci apod. Dokonce je možné zkusit nalézt označený řetězec ve všech zdrojových kódech v celém Smalltalku a existují Goodies, které tuto funkci dokáží omezit třeba jen na konkrétní systémovou kategorii.

Užitečná je funkce doplňování rozepsaného selektoru zprávy nebo třídy pomocí (i opakovaného) stisku Alt+q. Potěší např. i automatické ohraničování textu do hranatých závorek (bloky) nebo do apostrof (řetězce), odsazování a přisazování textu o tabelátor (Crtl+r, Ctrl+l), rychlé psaní ifTrue: a ifFalse: (Ctrl+t, Ctrl+r) apod.

Opravdu potřebná je schopnost dvojklikem na uvozovky, apostrofy a závorky všeho druhu označit oblast v nich obsaženou. Jen připomínám, že k uložení změn slouží volba accept (Alt+s). Při opouštění editace se samozřejmě Squeak na zahození změn slušně zeptá.

Pokud běžně pracujete s moderními vývojovými nástroji, jistě najdete i pár vlastností, které vám moc vyhovovat nebudou. Co by vám mohlo vadit, je to, že zvýrazňování syntaxe sice Squeak umí, ale nad nedokončeným kódem tuto funkci zatím nepoužívá. Syntaxe Smalltalku je sice velmi jednoduchá, ale barevně oddělit třeba komentáře nebo řetězce by se opravdu hodilo.

CS24 tip temata

Nedostatečné je zatím také automatické dokončování identifikátorů. Zkratka Alt+q sice trochu pomáhá, nicméně stále to není ono. Z principu je tato schopnost ve Smalltalku hodně omezená. Zde mají typované jazyky výhodu, protože ve Smalltalku neznáte skutečný typ předávaného parametru nebo proměnné, a tedy nemůže programátorovi automaticky nabídnout povolenou množinu operací. Rovněž kompilátor při kontrole vašeho kódu pouze zkoumá, jestli je vámi zadaný selektor v systému obsažen, a musí mu být úplně jedno, v jaké třídě se vyskytuje.

V příštím dílu si něco řekneme o vyhledávačích metod, ladících nástrojích, inspektoru, exploreru, nástrojích pro analýzu programu apod. Ukážeme si, co to znamená pracovat s živým programem a jaké netušené možnosti to přináší.