Logo GNU
Kodovani Předchozí Následující Obsah

8. EMX - překladač pro OS/2, DOS, Windows3.1 a Windows95/NT

EMX je port GCC pro OS/2, DOS, Windows3.1 a Windows95/NT vytvořený Eberhardem Mattesem. Naprostá většina GNU programů je pod OS/2 přeložena právě tímto překladačem. Na rozdíl od DJGPP či CygWin32 EMX používá extendery, které vytvoří shodné API na všech zmíněných platformách. Pokud aplikace nepoužívá žádné nativní služby některého z podporovaných systémů, je možné spustit výsledný program na libovolném z nich.

Každý z podporovaných systémů má vlastní extender. Ty zprostředkovávají nejdůležitější služby závislé na architektuře, jako memory management, textový vstup a výstup (DOS-box i fullscreen), práci se soubory, multithreading (nekompatibilní s POSIXem), multitasking (fork, komunikaci pomocí pipe), a další. Je to vlastně emulátor jednoduchého EMX operačního systému s API velmi podobnému UNIXu. Přes celkem velkou komplikovanost extenderů se jejich velikost se pohybuje od 50 do 110KB, a to je stále méně než DOS4GW. Samotný emx.exe (09c) má 50943 B, rsx.exe (5.10) má 107804 B. Pokud ale aplikace potřebuje jiné služby, například grafiku, musí mít speciální kód pro podporované operační systémy.

Program si nejdříve ošahá prostředí, v němž běží, a podle toho si buď zavede OS/2 dynamickou knihovnu (emx.dll), anebo pod čistým DOSem nebo VCPI prostředím extender emx.exe (od E. Mattese), či pod DPMI prostředím (např. DOS box v OS/2 či ve Windowsech) si zavede extender rsx.exe (o ten se stará R. Schnitker). Vlastnost, že jediný spustitelný soubor (mnoho z vás jistě zná tex386.exe anebo mf.exe z emTeXu) funguje pod všemi těmito platformami, je jeho nespornou výhodou oproti DJGPP.

Navíc EMX umí generovat i nativní programy pro OS/2 a Windows v případě, že program je příliš závislý na daném prostředí a není třeba požadovat jeho přenositelnost.

Důvodem pro vznik EMX byl překlad emTeXu, který se do té doby překládal v komerčních překladačích. Proto je EMX navrženo tak, aby prostředí poskytované aplikaci (API knihoven apod.) bylo co nejpodobnější UNIXu. Díky tomu v něm byly později přeloženy i další GNU programy jako Emacs, texinfo apod. Spočátku EMX neposkytovalo velký komfort pro vývoj nových aplikací (bylo určeno hlavně pro převod hotových programů), ale postupem času se vývojové prostředí emx rozrostlo až do současné podoby (verze emx09c, září 1997), kdy jsou k dispozici veškeré programy sdružené kolem GNU C/C++ překladače. Jsou podporovány i další jazyky, například fortran (f2c a g77), pascal (p2c), GNU ada. Překladač optimalizovaný pro procesory Pentium je pgcc. Jako debugger je možné používat používat gdb (textový) anebo pmgdb (OS/2 Presentation Manager verze, neboli GUI verze gdb), či fullscreen. Programy lze optimalizovat profilerem.

Hlavní výhody oproti DJGPP:

  1. Funguje i core dump. Pokud program spadne, vytvoří se obraz paměti na disku, ze kterého potom můžete debuggerem zjistit, co bylo špatně. Na rozdíl od DJGPP se nedozvíte jenom číslo řádky, kde program spadnul, ale můžete si prohlédnout i obsah proměnných apod.
  2. Vyvíjet můžete na libovolné z podporovaných platforem.

Standardní knihovny se dodávájí hned ve dvou verzích: single-threaded a multi-threaded. Single-threaded jsou rychlejší a kratší a je možné je používat i v programech použivající thready. Pokud ale více threadů používá knihovní funkce, mohou se dít podivné věci. Multi-threaded knihovna je na tom lépe, má errno pro každý thread a další. Výstup do souboru prý ale ještě úplně thread safe není. Další knihovny dodáváné ve standardní distribuci jsou: bsd, termcap, curses, fl (pro flex), gcc, graph (podporující jednoduchou VGA, EGA a CGA grafiku), os2, regexp, socket, video (interface pro fulscreen text podporovaný extenderem). Nezávislí programátoři přispěli dalšími přídavky: VESA, SVGA, multimedia atd.

K jednotlivým platformám:

8.1 OS/2

Toto je nativní platforma EMX, tudíž je detailně rozpracována co se týče jak podpory OS/2, tak i vývojového prostředí. Některé utility již byly zmíněny v úvodu, jako např. Presentation Manager verze gdb, mezi dalšími můžeme uvést například gcc zavaděč, který po jistou dobu ponechá v paměti gcc kompiler, aby se potom rychleji zaváděl - to může značně urychlit překlad rozsáhlých knihoven. Programy se většinou píší v editoru EPM (free editor od IBM), emacsu, resp. se vyvinou v nějakém více user-friendly IDE a pod emx/gcc se jenom přeloží, protože gcc/emx je znám jako jeden z výpočetně nejrychlejších překladačů. Visual Development Tools pro emx jsou též dostupné.

Při překladu je možné zvolit výsledný .exe soubor hned několika způsoby. Jednak "nativní emx", vyžadující dynamickou knihovnu emx.dll, ovšem s tou výhodou, že tentýž .exe lze spustit i pod DOSem či Windowsy, kde si automaticky natáhne patřičný extender. Dále je možné program slinkovat standardním IBM linkerem LINK386 namísto GNU linkeru. Pokud chceme zmenšit velikost výsledného přeloženého programu (anebo ho slinkujeme emx linkerem, ale nechceme, aby byl daný program používán pod DOSem), můžeme využít podpory jádra OS/2 pro zavádění a multitaskování komprimovaných exe souborů a přejet ho programem lxlite (kompresní poměr je většinou 1:2).

Aplikace pod OS/2 mohou být typu textové (windowed i full-screen), workplace shell (WPS) anebo Presentation Manager, včetně statických i dynamických DLL knihoven. Jsou k dispozici všechny hlavičkové soubory OS/2 a je možné linkovat a volat všechny 16ti i 32bitové funkce. Dále je možné překládat aplikace pro XFree86-OS2, tj. pro free X-Windows pro OS/2.

8.2 DOS

V DOSu běhají 32bitové emx programy pod extendery. Používají se dva: EMX, který zařizuje podporu protected mode sám, a RSX, který funguje jako DPMI klient. Ten první je menší a rychlejší, RSX zase funguje v situacích, kde není možné procesor přepnout do supervisorského režimu pod DPMI serverem (DOS prompt v OS/2 anebo Windows, QEMM, Novell či jiný DPMI server). Jejich funkce je přibližně stejná a program si při spuštění sám vybere ten správný. EMX podporuje VCPI, XMS2.00 a pozdější, normální nebo fast A20 gate, některé nestandardní obstarožní mainboardy a ramdisky, takže by s ním snad neměly být potíže. Umí využít veškerou dostupnou fyzickou pamět a v případě nutnosti swapovat na disk. Pokud není k dispozici koprocesor, pokusí se zavést přídavný emulátor koprocesoru (emxfpemu). Existuje také rozšířená verze s debuggerem. Extender je navíc možné zaintegrovat do .exe souboru (tzv. bounded executable).

RSX má o něco méně práce, protože 32bitový DPMI server je již spuštěn. Přesto je RSX ze záhadných důvodů o celých 50 KB větší než EMX. Emulaci koprocesoru má zaintegrovanou do samotného extenderu na rozdíl od debuggeru, o který se stará zvláštní program. Funguje spolehlivě pod OS/2 (dos box), Windows, cwsdpmi a qdpmi. Naopak mohou nastat potíže pod Dosemu a pmode, jelikož oba mají pouze částečnou implementaci DPMI. Dokumentace také říká, že funguje pod 386max a umí spouštět Win32 console apps (aplikace pro Win95 využívající emulaci terminálu). Má také podporu pro kompatibilitu s DJGPP 1.1. Podporuje dlouhé názvy u Win95. Pokud není DPMI server k dispozici, umí nastartovat program jménem CSX (krycí název pro CWSDPMI) - oba jsou součástí distribuce RSX. Toto řešení je však o něco pomalejší. Poslední verze také obsahuje experimentální verzi scheduleru, takže funguje například i gcc -pipe.

Rozhodl jsem se také udělat srovnání s DJGPP. Zajímala mě rychlost extenderů, tedy jaké zpomalení přináší převod volání EMX jádra na volání cílového operačního systému. Proto jsem udělal jednoduchý program, který má za úkol zaměstnat extendery a DOS tím, že 1000krát otevře soubor, po jednotlivých bytech tam zapíše 100 nul a potom jej zase uzavře.

DPMI server čas v DJGPP čas v EMX použitý extender
cwsdpmi 4.88 6.37 rsx
pmode 2.91 - -
bez DPMI - 3.52 emx
Win DOS 6.04 6.15 rsx
Windows - 8.51 rsxwin
QDPMI 6.81 9.78 rsx
Výstedky testu (časy jsou v sekundách)
Z testů je vidět, že cena za extender je cca 24% pod DOSem. To není málo, ale na druhou stranu většina aplikací není natolik závislá na rychlosti systémových voláních. Pokud pracujete se soubory, používáte bufferovaný vstup/výstup - stdio. Verze programu pro stdio už trvala oběma pouze 0.66 sekundy. Zajímavé je, že nebuffrovaná verze byla na BC výrazně rychlejší (2.86) - cena za protected mod je minimálně 10%. Stdio (bufferovaná) verze už byla pomalejší (0.71) - cena za neoptimalizující kompiler a špatně napsané knihovny. Zajímavé také je, že Windows verze je pomalejší oproti DOSové běžící v DOS promptu. Zklamáním pro mně byla také rychlost EMX extenderu, kterou jsem očekával o něco lepší než u DPMI, protože implementace DPMI je komplikovanější. Pouze pro zajimavost: Pod Linuxem test trval 0.66 sekund a stdio verze pouze 0.25 sekund.

EMX programy také potřebují o něco delší čas ke spuštění než DJGPP programy, protože musí zavádět extender. Jedná se ale pouze o několik setin sekundy, takže se to většinou neprojeví.

Pro vývoj EMX programů lze použít i většinu utilit z DJGPP (jako například RHIDE)

8.3 Windows 3.1

O podporu Windows 3.1 se stará extender rsxwin. Klasické textové aplikace se tam startují v okně, které se objeví po prvním použití vstupně výstupních funkcí a vypadá trochu jako okna různých telnetů pro Windows. Běžně zkompilované programy pod EMX nezavádí rsxwin automaticky a je třeba použít rsxwin jméno_programu, použít jiný zavaděč, programy startovat z okna rsshellu (to je jakýsi command.com zkompilovaný pod EMX), nebo použít program rsxwlink, který umožňuje vytvořit startovací program (nové .EXE), který sám nastartuje rsxwin a navíc programu předá zvolené parametry. Pod Windows95 rsxwin také podporuje dlouhé názvy. Modul RSXIO.DLL umí emulovat textové výstupní funkce, včetně VT100 escape sekvencí.

Programy jsou 32bitové, ale nepotřebují žádné rozšíření do Windows (jako Win32) a používají 16ti bitové API. Pomocí balíku jménem rsxwdk můžete vyvíjet i plnohodnotné Windowsí aplikace. Je možné používat DLL knihoven, psát nové DLL knihovny i linkovat aplikace tak, že nepotřebují rsxwin. Potřebujete k tomu ale soubor windows.h, který je k dispozici ve většině komerčních kompilerů. Jeho freewarový přepis je obsažen ve Wine (Windows emulator pro UNIX) ale nemusí být 100% spolehlivý. Navíc potřebujete resource compiler. GNU resource compiler je obsažen v novější verzi tohoto balíku pro Win32. Nevím, jestli je použitelný i zde. Volání 16ti bitových funkcí Windows je poněkud komplikované, protože je nutné převádět ukazatele a formát dat na zásobníku je odlišný. Toho se dociluje pomocí několika maker. Pro hlavní funkce (z user.exe, gdi.exe, kernel.exe, sound.drvkeyboard.drv) jsou udělány knihovní funkce. Stejným způsobem je ale možné přidat další.

Vlastní WDK není úplně free. Pokud chcete vytvářet komerční programy, je nutné jej za $55 registrovat. To je stále ale méně než cena většiny komerčních překladačů.

8.4 Win32

Tento port vychází z portu pro Windows3.1, proto o něm platí většina toho, co jsem napsal v předcházejících odstavcích. Balík se jmenuje RSXNT, je o něco větší a obsahuje navíc například i jednoduché IDE nebo resource compiler. Stále jsou ale třeba headery z WinSDK (nebo Wine). Používá se tu extender jménem rsxwin32. Také existuje verze RSXNTDJ, kterou je možné použít s DJGPP.

8.5 Dokumentace

Dokumentace k EMX je rozsáhlá a podrobná, podobně jako k samotnému GNU C/C++ překladači. Je distribuována jednak ve formátu OS/2kovských hypertextových knížek (.INF), jednak jako čistě textové soubory. (Pro méně znalé uveďmě, že .INF formát je standardním formátem veškeré dokumentace v OS/2, podobně jako .HLP ve Windows či texinfo pro GNU. Prohlížeč view.exe je součástí operačního systému OS/2. Prohlížeč pro DOS je součástí operačního systému PC-DOS. Prohlížeč pro Windows je na síti volně k dispozici.)

To, že na rozdíl od většiny GNU programu dokumentace ale není v texinfo formátu, ale ve formátu bežném na daném operačním systému přináší ale i některé potíže. Pokud nemáte OS/2 nebo PC-DOS, jste odkázání na textovou podobu .INF dokumentace. Naštěstí jsou ale k dispozici free prohlížeče tohoto formátu pro DOS a Windows Větší potíže působí dokumentace pro RSX, RSXWIN a RSXWIN32, která je k dispozici pouze v .HLP formátu. Navíc dokumentace k RSXWIN32 je v .HLP formátu pro Windows95, který si nepřečtete ani ve Windows3.1.

Zřejmě nejznámější aplikací vyvinutou pod gcc/emx je emTeX, kompletní prostředí pro TeXování, které se používá pod OS/2, DOSem i Windowsy. Lze jen poznamenat, že je obecně velice rozšířeným omylem, že emTeX je DOSovský TeX; pouze uživatelé OS/2 mají možnost mít na obrazovce současně puštěný editor, překladač i dvipm (dvi prohlížeč pod OS/2), tedy skoro-WYSIWYG systém.

Rozhodně největším balíkem programů pro překladač OS/2 (běhající pouze pod OS/2), která nejsou dílem E. Mattese, jsou XFree86 for OS/2. Tento příklad též názorně dokazuje, jak blízko má OS/2 k Unixu.


Předchozí Následující Obsah

Dotazy a připomínky ohledně stránky posílejte na hubicka@paru.cas.cz