Kommander je řešení tohoto problému od vývojářů KDE. Je to směska shellu, skriptovacích jazyků a speciálních znaků jazyka Kommanderu. Pro běžného administrátora to má tu výhodu, že se prakticky nemusí učit nový jazyk nebo používat pro něj neznámé grafické toolkity. Nevýhody jsou dvě. První je fakt, že pod pojmem Kommander se skrývají dva různé jazyky (starší a novější). Druhou nevýhodou je to, že je tento jazyk primitivní a neumožňuje používat pokročilejší programátorské techniky.
Editor
Pro vývoj slouží prostředí zvané Kommander editor. Jde o upravenou verzi Qt designeru od společnosti Trolltech, takže ti, kteří s Qt už pracovali, jsou ve výhodě. Ale práce s vývojovým prostředí je vcelku jednoduchá a intuitivní. Jsou podporovány dva typy projektů, klasická okna (Dialog) a průvodci (s oběma typy jsme se setkali v prázdninovém dvojčísle, pozn. red.). Jedinou výjimkou je potom způsob, jak přidat k nějakému prvku obslužný kód. K tomu slouží kontextové menu schované pod pravým tlačítkem myši a příkaz Edit Kommander text...
Prostředí rovněž zdědilo z Qt správce rozložení (layout) a rozpěrky (splitters), takže přestože může jazyk Kommanderu vypadat křehce (protože takový je), výsledné aplikace si, co do propracovanosti, nezadají s těmi napsanými v lepších programovacích jazycích a uživatel nepozná žádný rozdíl.
Starý parser
Jedná se o makrojazyk, který textově nahrazuje řetězce za výrazy shellu, jenž je interpretuje. Makra jsou uvozena znakem @. To se bohužel podepsalo na skutečně podivných vlastnostech jazyka a troufám si říct, že patří k těm nejhorším na světě. Nicméně v něm byla napsána spousta aplikací, což značí, že se jeho špatné vlastnosti podařilo lidem obejít.
Jeden příklad za všechny, kterak přistupuje k proměnným. Rozlišují se celkem čtyři typy proměnných a ke každé z nich se přistupuje odlišným způsobem.
- Proměnné prostředí - přístup k nim se realizuje pomocí krkolomného zápisu @exec(echo $FOO). Nově lze napsat i @env(FOO)
- Proměnné shellu - protože kód vesměs v shellu běží, stačí napsat $FOO
- Globální proměnné Kommanderu - přístup realizují funkce @setGlobal(foo) a @global(foo)
- Proměnné v cyklech - speciální cykly v Kommanderu mají i svoje speciální proměnné
@for(i,1,5,1) @Message.info(@i) @endif
Starý parser poskytuje poměrně nelogicky i vlastní klíčová slova, přičemž bohatě stačí využít možností shellu. Navíc je implementace @if, @for a @while více než problematická.
@if ( …) @if ( ... ) @endif @endif
Takový pokus o zanoření skončí chybovým hlášením Unknow special.
Nový parser
Nový parser přinesl spoustu užitečných prvků do jazyka:
- globální (s prefixem _) a lokální proměnné;
- asociativní pole;
- práce s řetězci;
- podmínky a cykly.
Rovněž se jedná o skutečný parser, takže podmínky a cykly je již možné zanořovat dle libosti. To také znamená, že nejdůležitějším syntaktickým rozdílem mezi nimi je to, že v novém parseru se nepoužívá @.
@label.setText("Starý parser") label.setText("Nový parser")
Protože mezi nimi není kompatibilita, ve výchozím stavu je nastaven ten starý. Pokud chceme využívat výhod nového, musíme na začátek skriptu napsat #!kommander, nebo nastavit globálně pro celý formulář vlastnost useInternalParser na hodnotu true.
Rovněž byl odstraněn rádobyobjektový přístup k některým funkcím.
@Array -> array_ @File -> file_ @Input -> input_ @File -> file_ @Message -> message_ @String -> str_
Nový parser tudíž odstraňuje většinu nevýhod starého. Jediným problémem může být to, že ve starém parseru bylo možné pomocí funkcí execBegin() ... execEnd stanovit část kódu, která mohla běžet v jiném skriptovacím jazyce než v shellu. Tato možnost u nového pochopitelně chybí, protože ten už shell nepoužívá.
Co s tím?
Kommander je docela rozporuplný projekt, na straně jedné fatální chyby v návrhu staré verze jazyka a jeho přílišná jednoduchost. Na straně druhé propracované vývojové prostředí založené na Qt Designeru od Trolltechu, které pomáhá vytvořit profesionálně vypadající a fungující aplikace. Jediným nedostatkem, který je společný mladým open-source projektům, je špatná dokumentace. Pokud vás zaujal, více toho najdete v miniseriálu na serveru abclinuxu.cz.
Jak Kommander pracuje
Kommander je založen na masivním používání technologie DCOP. Jedná se o způsob, jakým lze skriptovat KDE aplikace. Kommander potom ovládá widgety následujícím způsobem:
@Widget.názevFunkce(Obsah) # se převede na volání dcop @dcopid KommanderIf názevFunkce Widget Obsah
Díky DCOP není třeba řešit binární kompatibilitu skriptů s KDE a protože jsou volání prováděna binárním kódem, jsou navíc poměrně rychlá.
Technologie DCOP
DCOP (Desktop COmmunications Protocol) je způsob meziprocesové komunikace, respektive vzdáleného volání procedur (RPC/IPC). KDE aplikaci obvykle poskytuje své funkce prostřednictvím definovaného rozhraní a klient je může používat. Díky rozhraní příkazové řádky umožňuje do jisté míry skriptovat i grafické aplikace. Například je možné přiřadit tlačítkům na dálkovém ovladači jednotlivé akce přehrávače a používat jej způsobem, který jeho tvůrci nepředpokládali, ani nenaprogramovali. Je přímou inspirací pro DBUS (který je obecnější), který jej také podle plánu v připravovaných KDE4 nahradí. Je součástí snah o sjednocení unixových desktopových prostředí KDE a GNOME.
Starý a nový parser Kommanderu
Přesto, že je Kommander technologie několik málo let stará, došlo na jejím začátku k velmi nešťastným designovým rozhodnutím. Ty nakonec vyústily v přepsání původního jazyka Kommanderu, takže dnes musíme rozlišovat, zda používáme starý, nebo nový parser.