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:
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:
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.
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 |
|
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)
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.drv
a keyboard.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čů.
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.
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.
Dotazy a připomínky ohledně stránky posílejte na hubicka@paru.cas.cz