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ň