Pár úvah o dynamických jazycích

Dnes jsem se byl podívat v MDCC (Microsoft Development Center Copenhagen) na TechTalku s názvem Dynamic languages for statically typed minds – česky bych to překřtil na Dynamické jazyky pro staticky typované mozečky. 😉

Přednášel Niclas Nilsson a jeho hlavním cílem bylo přesvědčit nás, programátory zvyklé především na staticky typované jazyky, že dynamické jazyky mají také své výhody. Niclas nezacházel do žádné teorie, ale rovnou se vrhnul na zpochybňování typických argumentů proti dynamicky typovaným jazykům a na ukázky kódu, zejména v Ruby. Nechci se pokoušet zopakovat všechno, co na TechTalku zaznělo, spíš vypíchnout pár myšlenek a přidat něco vlastního.

Velice se mi líbila ukázka, kterou Niclas reagoval na chybějící typovou bezpečnost. Podívejte se na následující C# kód:

int x = 100000000;
Console.WriteLine(x*x);

Výsledkem je 1874919424, z důvodu přetečení rozsahu typu. Díky typové bezpečnosti známe předem typ výsledku – ale ten výsledek je špatně. Je tahle bezpečnost tak skvělá?

Podívejme se, co se stane v dynamickém jazyku. (Protože jsem v životě nenapsal ani řádku v Ruby, sáhnu po jiném dynamickém jazyku, o kterém je na tomto blogu často řeč – PowerShellu.)

[int]$x = 100000000
$x*$x #Výsledek: 1E+16
($x*$x).GetType().Name #Double

PowerShell se rozhodl použít jiný typ, aby mohl správně zpracovat výsledek. To je skvělá zpráva, ta špatná je ta, že dopředu nevíme, jaký typ vlastně z celé operace dostaneme. A když se typ dozvíme až za běhu, znamená to, že nejsme schopni provádět typové kontroly v době kompilace.

Niclas měl na absenci těchto kontrol zajímavou odpověď  – Test-Driven Development. Tím, že je všechno schopen ověřit dynamicky, nijak zvlášť nepotřebuje statickou kontrolu.

Dále ukazoval pár zajímavostí v Ruby, z toho mě hodně zaujala jedna věc. Jsem obeznámený s věcmi jako jsou dynamicky vytvářené typy, změny existujících typů za běhu a podobně, ale tak nějak předpokládám, že pokud se snažím volat neexistující metodu, dojde k chybě. V Ruby ale objekty mohou zpracovávat i volání metod, které daný objekt nemá – prostě dostane zprávu “někdo se na tobě snaží volat metodu X s parametry Y” a objekt může nějak reagovat. Niclas to prezentoval na objektu, který takto zpracovával všechna volání (neexistujících) metod se jménem začínajícím find_by_ a snažil se hledat ve svých datech. Třeba pro find_by_name se podíval do vlastnosti name a porovnával její hodnotu s obdrženým argumentem.

V diskusi na TechTalku často zaznívaly názory jako “To lze v C# také udělat”. To je sice pravda, ale pointa podle mě vůbec není v tom, jestli to jde, ale jak snadno se určité typy úloh řeší v nějakém jazyce (rodině jazyků, paradigmatu…). Pokud mi něco umožňuje udělat tu samou práci rychleji, čitelněji, s menším množstvím kódu nebo celé řešení snadněji udržovat, měl bych se nad tím zamyslet.

Mimochodem, kdyby byly staticky typované objektové jazyky nejlepší vždy a všude, proč bychom do nic přidávali funkcionální prvky (např. Lambda výrazy v C#), deklarativní programování (XAML) nebo dynamické typy (klíčové slovo dynamic)?

S dynamickými jazyky jsem se seznámil v PHP, teď se setkávám hlavně s PowerShellem, ale i v C# na občas narazím na dynamické typy (třeba v UI Automation). Zkrátka dynamicky typované jazyky nejsou nějaká hračka pro ty, co ještě neobjevili “pořádnou” typovou kontrolu – je to jen jiný přístup k problému.

Jsem přesvědčený, že dobří programátoři musí mít široký rozhled – pomáhá to správně volit způsob implementace, dívat se na jednu věc z více úhlů a často také snáze se naučit novou technologii. Denně vidím programátory, kteří se snaží poprat s těmi divnými událostmi v Dynamics AX 2012 – přitom třeba C# je má už deset let. Nebo já sám bych daleko snáze pochopil LINQ, kdybych tehdy věděl víc o funkcionálním programování.

Od konferencí nebo podobných setkání jako je TechTalk neočekávám, že se něco konkrétního naučím, ale že budu mít nad čím přemýšlet a do čeho se případně pustit sám. A to se dnes Niclasovi povedlo. Díky.