č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...

1 komentář:

BVer řekl(a)...

Cekal jsem, kdy shrnes tu dlouhou debatu o prg. jazycich do nejakeho uhledneho oficialniho textu, abych si -- pochopitelne -- prihral svou polivcicku. ;-)

Boo je chvalyhodna snaha, nicmene pomerne uzce vazana na .NET (ja vim, je tu Mono, ale, precijenom jde o soukromy pozemek...) -- takze to je jeden cerny puntik. Dalsim puntikem je sire podpory -- jde zatim o trochu jednomuzny projekt, jak jsem pochopil, s urcitym rizikem toho, ze se necekane zvrtne... I kdyz prave tento aspekt muze znamenat velky potencial, takze jestlize vcas naskocis do vagonu, muzes se s Boo dostat pekne daleko; cili ten druhy puntik nevidim jako nutne cerny.

Co se tyce statickych typu a rychlosti behu -- ano, to je jiste pravda, jen je otazka, jak moc tahle dan vadi; pokud jde o rychlost navrhu, jsou na tom naopak dynamicky typovane jazyky lepe. Osobne vitam implicitne dynamicke a explicitne staticke typy (kdyz typ neuvedes, zaridi se vse dynamicky, mas mit ale moznost striktne urcit typ), prestoze podobny mix je asi implementacne to nejslozitejsi, co si lze predstavit.

Ma vyhrada k I7 se vztahuje hlavne k jeho vysoke mire pokrytectvi. I7 se tvari se byt pristupny pro zacatecniky, -- vzdyt jde "jen" o Anglictinu -- ale k tomu, abys ho ovladl, musis nejprve pochopit _vnitrni_model_ I7 (podobne jako kdyz programujes v C++, se za cas zacnes zajimat, jak jsou implementovany virtualni metody, tak dedicnost, co skryvaji uvnitr STL kontejnery...), presto ze tohle vsechno samozrejme nemusis vedet, kdyz zacinas. A tenhle aspekt I7 je pekne problematicky -- relace mezi objekty sveta a celkova orientace na text jsou sice skvela vec, pokud jde o psani textovek, ale kdyz nevis, co prekladac nakonec udela, jak dopadne interpretace "Tve Anglictiny", muzes v urcite fazi psani projektu travit dlouhe hodiny ziranim na hlasky typu "mame problem s popisem" (uz jen to prejmenovani error->problem svedci o urputne snaze videt veci v jinem svetle, nez v tom, jenz opravdu prochazi tvrdou optikou SW/HW).

Podobne jsem uvazoval o Pythonu a Ruby. Oba jazyky maji vic spoleceneho nez odlisneho, pricemz Python je (tusim) o 5 let starsi, takze ma vetsi podporu a rozsireni; vetsi pocet programatoru za delsi dobu precijen stihne ubalit vic knihoven, navic je implementace vychytanejsi, optimalizace a bugfixy jsou dany prave a jen dostatecne dlouhym vyvojem, atd...
Na druhou stranu se mi zda, ze Ruby ma pred sebou skvelou budoucnost a navic -- coz je pro me velmi podstatne -- je v nem mnoho z mysleni Perlu (regularni vyrazy, ruzne syntakticke vychytavky, obecne existuje vzdy vice cest k dosazeni stejneho cile). Je v urcitem slova smyslu "elegantnejsi" nez uzce ortogonalni __python__.
Shrnu-li to, Python se zda byt racionalni volbou bez rizika, ale k Ruby si progis jako ja snadno vytvori citovy vztah ;-)

Je zvlastni, ale nakonec celkem pochopitelne, ze stale vznikaji nove a nove programovaci jazyky (asi proto, ze diky novym jazykum dokazeme lepe ovladnout aplikacni domeny, jako napr. databaze, webove servery, xml dokumenty...).

Co je ale opravdu hodne zkoumani, jsou otazky typu: Proc se ujme tento jazyk a jiny naopak zanikne? Muzou za to objektivni kvality jazyka nebo spis komunita/firma, ktera ho prosazuje? A co prostredi, pro nez je jazyk urcen, jeho aplikacni domena? Jak se na uspesnosti jazyka podili pohodli vyvoje a nastroje (IDE, debuggery...)? Jak funguje prebirani rysu mezi jazyky (objektova orientace, funkcionalni pristup, metaprogramovani, closures..)?

Jednou, jestli se doziju duchodu, stanu se asi archeologem syntaxi:
http://www.oreilly.com/pub/a/oreilly/news/languageposter_0504.html