OS/2
OS/2 + PC/2 = happy user/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.
DOS
Tatí! Co znamená FORMATING DRIVE C?
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í.
Windows 3.1
Pozor padá nápis:"Pozor padá nápis:"Pozor padá omítka!"!"!
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čů.
Win32
Ale ne Bille, to není XT, jenom jsme testovali Windows NT
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.
výheň