EPOC32 -- operační systém dvaatřicetibitových počítačů PSION -- je v současnosti nejlepší operační systém pro kapesní systémy, od nejjednodušších (jako jsou např. mobilní telefony), až po universální a flexibilní kapesní počítače a PDA. Na rozdíl od jiných systémů typu Windows CE je EPOC32 navržen přímo pro kapesní systémy, takže optimálně pracuje v jejich specifických podmínkách: malá obrazovka, relativně málo výkonný procesor, relativně málo paměti -- jak operační, tak vnější, extrémní nároky na úspory energie.
Tento článek není zaměřen na obecné výhody EPOCu proti jiným "kapesním" alternativám; jeho účelem je ukázat, jak se pro něj píší aplikace. EPOC/32 programátorům nabízí v současnosti tři alternativní vývojová prostředí; ačkoli se jejich služby do jisté míry překrývají, je každá optimální pro jiný účel:
- první a základní prostředí běží pod Windoze NT nebo 95, a je založeno na programovacím jazyku C++ (ve kterém je ostatně napsán také prakticky celý EPOC/32). Všechny služby jsou k dispozici prostřednictvím zaveditelných sdílených knihoven. Týká se to i služeb kernelu a služeb jednotlivých serverů; pro ty je k dispozici mezivrstva sdílených knihoven, jejíž služby programátor přímo využívá. Knihovny pak samy volají služby jádra nebo komunikují se servery. API je kompletně postaveno na jazyku C++; samo o sobě sice C++ není nejšťastnější volba, výkon dnešních palmtopů je však stále relativně omezen, a těžko by stačil pro skutečně objektový systém, jaký nabízí např. Objective C. Pro statické pseudoobjekty C++ však stačí pohodlně, a proti plain C je C++ rozhodně daleko příjemnější. Knihovny sestavené ze tříd -- byť se nejedná o plnohodnotné třídy dynamických objektových systémů -- také nabízejí programátorům větší flexibilitu a zároveň lepší ochranu proti chybám, než klasické knihovny funkcí. Knihovny nabízejí skutečně mnoho velmi pohodlných služeb; ačkoliv jejich množství (a díky C++ ani pohodlí programátora) nedosahuje úrovně OpenStepu, nabízejí rozhodně daleko víc nesrovnatelně pohodlnějších služeb, než např. Win32 API. Právě na toto prostředí se podíváme v článku podrobněji.
- Druhou alternativou je OPL -- vlastní programovací jazyk firmy PSION, vzdálený potomek BASICu. Jeho možnosti jsou zhruba na půl cestě mezi klasickým BASICem a C++: nabízí větší flexibilitu než BASIC, ale ne takovou, jako C++; jeho interpret je o poznání rychlejší, než interpret BASICu, ovšem samozřejmě nemůže soupeřit s překládaným jazykem C++. Hlavní výhodou OPL je to, že v něm můžeme programovat přímo na počítači Psion, a nepotřebujeme křížové vývojové prostředí pod Windoze.
- Třetí možností je Java: Epoc osahuje její interpret a je k dispozici i vývojové prostředí.
Základní prostředky pro programování PSIONa jsou sdruženy v C++ SDK. To je CD, které obsahuje kompletní dokumentaci EPOCu/32, knihovny a hlavičkové soubory pro C++, množství pomocných toolů (včetně kompletního interpretu jazyka Perl), hostující implementaci EPOCu, používanou pro ladění, překladač GNU C++ a řadu příkladů. Abychom jej mohli využít, potřebujeme počítač s Windoze NT nebo Windoze 95 a vývojovým prostředím Visual C++: SDK totiž z naprosto nepochopitelných důvodů využívá pro ladění právě tento překladač, a GNU C++ slouží až pro vytvoření cílové podoby aplikace pro počítač S5.
Celkový postup při tvorbě aplikace je následující: nejprve připravíme zdrojové soubory -- minimálně zdrojový kód v C++, obsahující základní služby aplikace (popíšeme si je blíže v posledním odstavci, zaměřeném na aplikační rozhraní EPOCu), a zdrojový resource soubor, obsahující, zhruba řečeno, lokalizovatelná data aplikace. Pak, s využitím několika pomocných programů, systému Visual C++ a hostujícího emulátoru EPOCu, můžeme aplikaci testovat a upravovat. Nakonec, jakmile jsme spokojeni, spustíme překladač GNU C++, který vytvoří hotovou aplikaci pro počítač S5; tu přeneseme po sériovém rozhraní na Psion, a jsme hotovi.
Ukažme si podrobněji jednotlivé fáze na jednoduchém příkladu: pro další zjednodušení nebudeme vytvářet kompletní aplikaci, ale vyrobíme pouze naprosto triviální program "Hallo, world" bez grafického uživatelského rozhraní. Tím si ušetříme mj. také resource.
Zdrojový program bude velmi jednoduchý -- uživatelé jazyka C nebo C++ mu na první pohled porozumějí:
#include <e32cons.h>
#include <e32svr.h>
GLDEF_C TInt E32Main() // main function called by E32
{
CConsoleBase* console=Console::NewL(_L("HalloWorld"),
TSize(KDefaultConsWidth,KDefaultConsHeight));
console->Printf(_L("No nazdar, světe...\n"));
console->Getch();
return 0; // and return
}
Snad jen makro _L není na první pohled srozumitelné: jedná se o ekvivalent konstrukce @"..." z Objective C, generující namísto C-stringu statický objekt třídy string. C++ nenabízí ani zdaleka takové možnosti jako Objective C, proto je nutné na to využít makro, které objekt vytvoří "standardním" způsobem.
Pro překlad a ladění využijeme pomocné tooly, které jsou součástí SDK, a Visual C++. Příprava je trochu komplikovaná; to je ovšem vinou Visual C++, a nikoli SDK -- vývojářům firmy Psion lze vytknout snad jedině to, že nepoužili lepší systém (sami však pracujeme na SDK pro OpenStep, takže již brzy by mělo rozumnější prostředí být k dispozici). Celý postup vypadá takto: nejprve připravíme 'makefile' -- soubor v proprietary formátu, který Visual C++ informuje o tom, jaký soubor má vlastně překládat, jaké knihovny použít, kam uložit výsledek a tak dále. Protože vlastní 'makefile' Visual C++ je, stejně jako celé VC, naprosto zmatené, nabízí SDK pomocný script 'makmake', který většinu práce udělá za nás.
Pak otevřeme 'makefile' přímo z prostředí Visual C++, a můžeme překládat, a po odstranění případných syntaktických chyb ladit. Knihovny SDK automaticky zajistí, že po spuštění přeloženého programu se spustí emulátor S5, a v něm se program rozběhne; to ilustruje následující obrázek,na kterém jsme v debuggeru uložili breakpoint na příkaz 'getch':
Jakmile je program odladěn, přeložíme jej řádkovým překladačem GNU C++; jeho korektní vyvolání opět zajistí pomocné tooly z SDK. Celý proces vidíme na dalším obrázku:
Výsledkem je program 'hello.exe', který můžeme přímo spustit na počítači Psion S5, a který tam bude pracovat stejně, jako pracoval pod emulátorem ve Windoze.
Ve druhé části článku se zběžně seznámíme se službami, které nabízejí standardní knihovny EPOCu. Základem systému je samozřejmě mikrokernel, který zajišťuje nejdůležitější úlohy (jako je správa paměti, správa procesů a threadů), a nad ním pracuje řada serverů -- často dynamicky zaveditelných -- které se starají o vše ostatní, od správy souborů až po vstup a výstup.Celkovou strukturu ukazuje obrázek:

Základní komponenty, včetně vrstvy ukrývající specifika konkrétního hardware, obsahuje blok Base. Jeho služby pak využívají další moduly: větev driverů, zajišťujících komunikaci (a mimochodem také transparentní přenos souborů mezi EPOCem a Windoze bez problémů s českými znaky), a větev knihoven a služeb vlastního EPOCu.
Základní vrstva Base zajišťuje především správu systému, obsahuje drivery pro jednotlivá zařízení, souborový server (schopný samozřejmě pracovat s dynamicky zaváděnými systémy souborů, takže pro něj není problém rozumět si např. s DOSovskými nebo Macovskými disky), komunikační služby (bohužel, EPOC32 neobsahuje distribuované objekty; namísto toho má programátor k dispozici BSD sockety), rychlé předávání zpráv pro architekturu klient/server (v real-time systému) a podobně. Součástí Base je také vrstva 'HAL' -- to není reminiscence na Vesmírnou odysseu, ale "Hardware Abstraction Layer", který skrývá specifika libovolné konkrétní architektury, na níž může být EPOC32 implementován (dnes pracuje bez problémů na procesorech Intel 80x86 a ARM, a připravuje se M.CORE).
EPOC32 je, na rozdíl od naprosté většiny ostatních systémů, navržen pro neustálou práci: palmtop přeci jednou zapneme, a od té doby běží; jeho "vypnutí" je ve skutečnosti jen vypnutím displeje a pozastavením procesoru. Restart nepřipadá v žádném případě úvahu. Proto má programátor k dispozici velmi silné prostředky pro ošetření výjimek a chybových stavů, implementované již na úrovni základní vrstvy: jedná se o standardní systém výjimek, rozšířený o automatické uvolnění objektů a zdrojů. Pokud je mi známo, žádný jiný systém (s jedinou výjimkou OpenStepu, tam je to však samozřejmý důsledek plně objektové implementace garbage collectoru) podobnou podporu nenabízí.
Služby vrstvy 'Engine' zajišťují vše, co programátor potřebuje pro vlastní činnost aplikace -- tj. to, co se netýká grafického uživatelského rozhraní: je zde velmi luxusní databázový systém, obsahující mj. i omezenou implementaci SQL, podpora pro práci s persistentními objekty (tzv. "stream stores"; až na naprosté výjimky je v EPOCu cokoli, co se ukládá na disk, právě stream store -- z hlediska programu tedy síť objektů), práce s textem a podobně. Podpora pro práci s textovými řetězci dokáže pracovat jak s osmibitovým kódováním, tak i s kódováním UNICODE; potenciálně tedy dokáže snadno obsloužit jak češtinu, tak i mnohem exotičtější jazyky (konkrétní implementace ve stávajících počítačích Psion nebo Ericsson však bohužel UNICODE nevyužívají, takže tam je nutné češtinu zajistit "standardní" cestou změny kódové tabulky).
Grafický subsystém EPOCu vcelku odpovídá běžným grafickým systémům s ad hoc sestavenou sadou grafických primitiv, jako je např. Apple QuickDraw, WIN32 nebo XWin. Na rozdíl od nejjednodušších z nich však má samostatný window server, který vlastní a obsluhuje potřebné zdroje (obrazovku, klávesnici, pero...), a na který se obracejí jednotliví klienti; tento model je mnohem praktičtější a flexibilnější, než jednoduchá sada knihovních služeb, jakou disponuje např. QuickDraw.
Jak jsme se již zmínili v úvodu, je nadto EPOC optimalizován pro poměrně malou obrazovku, schopnou zobrazit jen málo barev nebo dokonce jen několik stupňů šedi, často s dost špatným kontrastem. Díky tomu jsou jeho služby pro kapesní systémy daleko praktičtější, než služby grafických systémů, navrhovaných primárně pro obrazovku s vysokým rozlišením. Příkladem může být třeba podpora pro změnu velikosti písma: v EPOCu je naprosto běžné, že uživatel může pohodlně přepínat velikost písma v právě aktuální aplikaci, aniž by měnil skutečně použitý font. Zároveň grafický systém nezapomíná na malou obrazovku, takže po zvětšení se text automaticky přeláme a stále jej můžeme pohodlně číst. Samozřejmostí je i podpora tisku, tiskového náhledu (preview) a faxování.
Grafické uživatelské rozhraní je v EPOCu jasně rozděleno do dvou knihoven: zatímco CONE (CONtrol Environment) obsahuje abstraktní ovládací a zobrazovací primitiva (jako je okno, menu, dialog, tlačítko...), teprve další úroveň, EIKON, jej odívá do konkrétního vzhledu a vybavuje jej konkrétním způsobem ovládání. Díky tomu je poměrně snadné v případě potřeby změnit grafické uživatelské rozhraní EPOCu, aniž by bylo nutné měnit aplikace, která pod ním pracují. To má samozřejmě jen malý smysl u palmtopů nebo PDA; EPOC ale zahrnuje také aplikace typu "mobilní telefon", kde je specifický vzhled GUI velmi žádoucí.
Nejvyšší, aplikační vrstva EPOCu implementuje striktně objektový pohled na práci se systémem. Namísto "spouštění aplikací" spíše "zpracováváme dokumenty": ačkoli, jak jsme viděli v jednoduchém příkladu na začátku tohoto článku, EPOC podporuje i standardní programy, jeho běžná aplikace takovým programem není. Aplikace v EPOCu totiž není "program", ale adresář, který obsahuje (a) resource soubor, nebo soubory, pro všechny jazykové mutace, které aplikace podporuje, (b) specifikaci typu dokumentů, s nimiž aplikace pracuje, a (c) knihovnu aplikačních služeb. Knihovna obsahuje implementaci základních služeb ('otevření dokumentu', 'vytvoření nového dokumentu' apod.); v EPOCu vlastně není možné "spustit aplikaci"; namísto toho ale můžeme v systému otevřít dokument nějakého typu, a systém podle typu dokumentu automaticky využije služeb odpovídající aplikační knihovny.