Deklarace v Go mají svou logiku

Ještě jednou se vrátím k jazyku Go. Jedním z jeho prvků, který vzbudil největší emoce, je syntaxe deklarací, která je poměrně odlišná od deklarací v C/C++. Rozdíl ukážu na příkladu deklarace pole pěti ukazatelů na int:

C/C++:

int * a[5];

Go:

var a [5] * int;

Soudě podle ohlasů na internetu, hodně lidem přijdou deklarace v Go neintuitivní a "pozpátku". Pokud se na ně ale podíváme podrobněji, zjistíme, že na rozdíl od deklarací v C/C++ mají velice průhlednou vnitřní logiku – čtou se totiž vždy zleva doprava. Schválně si zkuste druhou deklaraci přeříkat slovy: "proměnná a je pole pěti prvků, které obsahuje ukazatele na int." Bylo to jednoduché, že? A výsledek odpovídá tomu, jak byste tuto deklaraci nejspíš popsali slovy sami.

Čtení deklarací v C/C++ je oproti Go docela náročné, musí se postupovat od deklarovaného identifikátoru (nebo typu, pokud jsme v typedef) "cik cak směrem ven" a brát v úvahu závorky. Do intuitivity to má daleko a rozlišit na první pohled třeba mezi typy "ukazatel na funkci" a "funkce vracející ukazatel" chce cvik.

Neviděl jsem to už někde?

Pamětníci si možná všimli, že deklarace Go jsou v podstatě shodné s deklaracemi v Pascalu – ty se také čtou zleva doprava, ale jsou poněkud upovídanější. Náš příklad by v Pascalu vypadal takto:

var
    a: array[0..4] of ^Integer;

Je pravděpodobné, že ani Pascal nebyl se tímto zápisem deklarací originální. Nicméně by mě docela zajímalo, zda autoři Go nezávisle "objevili kolo", nebo se jen inspirovali.

Co to zkusit obráceně?

Při zkoumání deklarací v Go mě napadlo, že když přijdou většině lidí "pozpátku", možná by nebyl marný nápad zachovat linearitu, ale otočit směr. Co kdyby naše ukázková deklarace vypadala následovně:

var int * [5] a;

Při čtení zleva doprava tento způsob zápisu možná není tak intuitivní ("vezmu int, udělám na něj ukazatel, zabalím do pole pěti prvků a pojmenuju a"), ale možná by céčkařům mohl být bližší. Nevýhodou je, že zápis strukturou trochu připomíná německé věty – to podstatné (deklarujeme pole) se objeví až na konci.

Jak jsem posléze zjistil, nevymyslel jsem nic nového – přesně tento způsob zápisu používá například C#.

A není jedno, jak deklarace píšeme?

Možná vás napadlo, zda se tu nerýpu v nepodstatných detailech a zda má smysl se syntaxí deklarací takto podrobně zabývat. Možná ano, možná ne. Syntaxe deklarací je na jednu stranu poměrně povrchní aspekt jazyka a jejich čtení do značné míry otázka zvyku. Na druhou stranu ale zápis deklarací značně určuje "feel" jazyka a z reakcí na Go je zřejmé, že lidem na něm záleží.

Nov 14, 2009 – 14:42

Comments

David Grudl
Čistý zápis deklarací se mi na Go moc a moc libí - jak trefně uvádíš, má čitelnost Pascalu (koneckonců Pascal nebyl navržen pro programování, ale pro výuku) a stručnost C. Chápu i obrácený zápis, ten se totiž ideálně hodí při prefixovém zápisu návratové hodnoty funkce (jestli se nepletu, Pascal používá postfix). Ale je jasné, že jako každý pokrok vzbudí nevoli u ‚opravdových programátorů’ :))
David Majda
[1] Nemyslím si, že ty deklarace mají úplně "čitelnost Pascalu". Jak jsem už psal jinde, hrozně mi v nich chybí dvojtečka za názvem proměnné/proměnných - IMO by čitelnosti hodně pomohla a urychlila by zběžné pročítání kódu (oči by se měly víc na čem zachytit).
Miloslav Ponkrác
Souhlasím s Davidem Majdou, skvělý postřeh. Go sice neznám, a v C/C++ jsem programoval mnoho let, ale deklarace Go jsou velmi pěkné a intuitivní. Je to moc hezky navrženo. Dal bych tomu přednost před C/C++.

Add Comment

It is not possible to add comments to posts older than one month.