čtvrtek, července 20, 2006

Jazykotepci

Není nic smutnějšího, než zamlklý blogger. Chci říct: nějak se mi v létě ani nechce nic psát, ale protože přiznat, že se mi nechce psát, by v kontextu weblogu působilo dost podivně, řeknu, že jsem se věnoval studiu jazyků. A opravdu. Narazil jsem teď nedávno na dva docela zajímavé programovací jazyky, kterým jsem věnoval nějaký ten čas, který bych jinak třeba věnoval psaní duchaplností.

Takže první z nich je Boo. Boo je převodem syntaxe dynamicky typovaného Pythonu do prostředí staticky typované platformy .NET, bez pythonovských dogmat, ale s některými rysy, které připomínají tak trochu Ruby a malinko (opravdu malinko a jen někdy) Lisp. Zní to dost zmateně, ale Boo má všechno, co jsem kdy záviděl programátorům ve skripotvacích jazycích, jako jsou třeba closures (pěkně o closures píše třeba guru extremních programátorů Martin Fowler tady), generátory nebo Perlovská syntaxe regulárních výrazů, a přitom se zbavuje některých věcí, které jsou opravdu otravné v C# (verzi dva), jako je třeba nutnost psát sáhodlouhé názvy typů tam, kde si kompilátor může typ domyslet sám, a obecně potřeba chrlit desítky řádků kódu, abyste napsali nějakou v zásadě jednoduchou věc.

Další výhodou Boo je třeba že: a) generuje standardní .NET assemblies (pro verzi frameworku 1.1 i 2.0), což prý IronPython (port Pythonu na platformu .NET) neumožňuje, b) díky tomu, že je staticky typovaný, netrpí výkonovou ztrátou, která je pro dynamicky typované jazyky obvyklá, c) je podporován vývojovým prostředím SharpDevelop, d) i když ho vyvíjí prakticky jediný člověk, je otevřený, a tudíž není pod kontrolou jediné firmy, e) disponuje báječnou věcí, které se říká syntactic macros, která umožňuje doplnit jeho syntaxi o cokoliv, co vás jen napadne (nebo skoro cokoliv), f) komunita kolem něj není příliš velká a v zásadě je velmi rozumná, takže se zatím dokázal ubránit smršti fanatických debat o hloupostech.

Zkoušel jsem psát v Boo dva jednoduché programy (jeden pro příkazovou řádku, druhý s WinForms), a byla to moc příjemná práce. Samozřejmě, že Boo má své nevýhody. Asi největší je absence podrobnější dokumentace, druhou pak skutečnost, že zatím nepodporuje generika, což někdy může být docela nepříjemný problém. Tak jako tak, ze skupiny alternativních .NET jazyků jako je IronPython, F# nebo Nemerle, je mi Boo nejsympatičtější a uvažuji, že v něm zkusím napsat nějakou obsáhlejší aplikaci.

Druhým jazykem na který jsem narazil, který je z akademického pohledu mnohem zajímavější než Boo, je Inform 7. I7 je jazyk (nebo spíše prostředí) určený jen a pouze pro vývoj interaktivních fikcí (interaktivní fikce se má k textovým hrám asi tak, jako nejnovější Toyota k prvnímu autu Henryho Forda), a zajímavé na něm je, že se maskuje jako angličtina.

Čili pokud chcete definovat nějakou herní lokaci (třeba kuchyni, ve které je stůl a na něm hrnek), napíšete něco jako Kitchen is a room. Description of kitchen is "Nice little kitchen". Table is supporter. Table is in the kitchen. Cup is container. It is on the table., čímž jste popsali kuchyni jako místnost, stůl jako objekt, na který se dají pokládat objekty a hrnek jako objekt, který může obsahovat objekty a který se nachází v kuchyni na stole (ve skutečnostidokonde stačí napsat jen něco jako Description of kitchen is "Nice little kitchen". Table is in the kitchen. Cup is on the table. Tea is in the cup., z čehož už si I7 domyslí co je co). Kouzelné je, že celý I7 je rule-based, a umožňuje definici různých operátorů jako je "většina", "několik", "skoro žádný", a tak podobně, které pak lze kombinovat s definovanými pravidly (takže můžete říct, že stůl unese 10kg, a ze když je přetížen rozpadne se -- to všechno v angličtině, samozřejmě). Dále I7 obsahuje implementaci path-findigu, který lze ovšem aplikovat nejen na hledání nejlepší cesty z místnosti do místnosti pro NPC (non-player characters), ale třeba také na stromy dialogů, které umožňují NPC bavit se s vámi poměrně sofistikovaným způsobem.

Zkrátka je to moc pěkný experiment, který se může (ale také nemusí) ukázat úžasným zjednodušením práce autorů interaktivních fikcí. Hlavní výhodou i nevýhodou I7 je používání angličtiny jakožto programovacího jazyka. Výhodou je, že když se podíváte na nějaké ukázkové programy, hned máte pocit, že programovat v I7 je jednoduché, z čehož jste ovšem záhy vyléčeni, protože I7 nerozumí angličtině, ale jen a pouze angličtině I7. Ta se, s tím, jak se snažíte dělat složitější a složitější věci, stále více vzdaluje angličtině, a více se přibližuje běžnému programovacímu jazyku, takže postupně zjišťujete, že se stejně musíte naučit programovací jazyk, jen o dost užvaněnější než jiné jazyky (snad s vyjímkou Visual Basicu).

V každém případě mě myšlenka alespoň takto omezeného použití "přirozeného" jazyka k programování nadchla a skoro si začínám myslet, že tudy se bude ubírat vývoj jednoduchých skritovacích jazyků: Každý si nadefinuje svou vlastní verzi angličtiny, které se vzájemně nebudou příliš lišit, a které otevřou programování i lidem, kterým teď připomíná kabalu. Hlavním proti je skutečnost, že různí lidé mluví různými jazyky a že lokalizace takového programovacího prostředku není triviální (pokusy naučit I7 česky alespoň na úrovni parseru příkazů jsem po pár hodinách vzdal, protože jsem měl nepříjemný pocit, že marním svůj čas).

Tak jako tak, bude zajímavé z povzdálí sledovat, co se z Inform 7 vyvine...