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

6. DJGPP - GNU překladač pro DOS

DJGPP je port GCC pro DOS, který začal vyvíjet Dj Delorie. Jak píše, začal o tom uvažovat v roce 1986, kdy se ptal RMS, jestli GNU plánuje port pro DOS. Ten ale říkal, že to není možné, protože DOS nesplňuje předpoklady GCC na operační systém.

Jako první verzi zkompiloval GCC pod ICS Unixem na 386/16Mhz. Přepsal systémová volání, potom slinkoval s ICS C knihovnou a pomocí programu výsledek předělal do 32 bitového EXE pro Phar Lap extender. Protože ale Phar Lap neměl virtuální paměť, napsal vlastní extender go32. A byla na světě první verze GCC(1.32), která sama sebe zkompilovala. Potom vzal knihovnu z BSD a převedl ji pro DOS. První použitelná verze byla DJGCC1.03. Práce mu trvala opravdu dlouho, protože 1.03 vyšla před třemi roky. Verze 1 používala go32. Ten ale nebyl zrovna nejlepší. Vyznačoval se velkou nesnášenlivostí (neběžel ani pod emm386). Potom přidal G++ a přejmenoval výtvor na DJGPP. Verze 1.05 už podporovala VCPI, 1.10 DPMI a 1.11 přidala DPMIEMU. Byl tu ale pořád jeden nedostatek. Go32 se kompilovalo pomocí překladače firmy Borland a to nebylo zrovna nejlepší. Práce na odstranění tohoto nedostatku začala pro verzi 2. Jako první napsali assembler, který vygeneruje 16ti bitový zavaděč. Tento zavaděč ale vyžadoval DPMI a tak aplikace už zase neběžely všude, proto se go32 používalo dál, jako DPMI server. To se vyřešilo až pomocí CWSDPMI, to je velmi kvalitní DPMI server dodávaný s DJGPP. Zavaděč ho umí sám spustit, když DPMI není k dispozici, takže v podstatě CWSDPMI vypadá skoro jako extender, ale není. Vyvinout verzi 2 trvalo celé dva roky. Byla zveřejněna v polovině roku 1996.

Verzi 2 jsem si nainstaloval jen tak ze zvědavosti a opravdu mě nadchla. Jen několik parametrů:

To dělá z DJGPP jeden z nejlepších překladačů pro DOS. Je velice podobný Watcom C. Vyznačuje se opravdu dobrou stabilitou. Programy kompilované pod DJGPP fungují bez potíží pod windows, čistým DOSem, EMM386, Qemm386, Qemm386 s jeho DPMI serverem, Linuxovým dosemulátorem a pod. Autoři uvádějí problémy s Novell DOS DPMI serverem, který má chyby a tak některé věci zlobí. Stačí ale DPMI vypnout a už všechno chodí tak, jak má. Podobný problém je se starým Qemm DPMI serverem.

Poslední verze je dnes 2.01. Ta odstraňuje pár chyb, které byly ve verzi 2. Zejména kolem dlouhých názvů ve win95.

Oproti 16ti bitových překladačům (jako je Borland C) ma ale i některé nevýhody. To je rychlost volání služeb DOSu a BIOSu. Jako v každé protected módové aplikaci v DOSu, každé takové volání si vynucuje několikanásobné přepínaní mezi v86 a protected modem. Takže čtení souboru je asi o 10% pomalejší. Druhá výhoda je velikost .exe souboru. U klasického hello word jde velikost stáhnout na cca 10KB, což je sice hodně, ale je v tom celý 32 bitový zavaděč. Oproti 200KB dos4gw to je ale pořád krásné.

Bylo samozřejmě zkompilováno hodně GNU programů (EMACS, indent, make atd.), ale vzniklo i mnoho nových zajímavých DOSových věcí:

Allegro

grafická knihovna specializovaná na hry a dema. Umí jenom 256 barevné mody, ale zato je dost rychlá, umí hodně modů X ( třeba 256x256), práci s fonty, sprite, zvuky (SB), VESA mody, ale má i svoje drivery, pro S3, trident atd. Pro případ, že VESA není. Umí VESA2, 3D grafiku, jednoduché GUI, časování atd.

Rhide

To je docela věrná kopie Borlandího IDE. Umí skoro všechno, co Borlandí IDE - debugger, syntax highlighting (pro C, C++, Pascal, ASM a další, co si nadefinujete) atd. Volá externí překladač, takže není tak monolitické. A má některá hezká rozšíření, jako další textové mody apod.

Gpc

Pascal byl předělán tak, aby se co nejvíc podobal Borlandímu.

Grx

něco jako GNU verze BGI. Je pomalejší než Allegro, ale stále dost rychlá na akční hry. Umí ale více grafických primitiv, pracuje s VESA a má svoje drivery. Umí černobílé, 16ti barevné, 256ti barevné, hi color a truecolor mody.

Djp

Velice kvalitní kompresor spustitelných souborů - rozbalí 10MB do sekundy, proto tím mám zabalený i samotný překladač.

jptui

celkem hezké GUI, které vypadá jako to z Nortonových utilit.

mikmod

player modu apod. Jde použít pro zvuk ve hrách.

ta2as

převaděč klasického assembleru do AT&T syntaxe.

djgpptsr

ukázka, že v DJGPP lze psát i rezidenty. (Už jste někdy viděli rezident v protected modu?)

cwsdpmi

velmi kvalitní DPMI server

pmode

port extenderu určeného původně pro assembler. Je o něco rychlejší a kratší, než CWSDPMI a jde spojit do jednoho .exe souboru. Na druhou stranu je více nesnášenlivý a neumí celé DPMI.

jlib

jiná knihovna pro hry.

A další (jako například emulace Turbovision, BGI, 3D knihovny apod). Byly přeneseny i některé knihovny z Watcom C (jako npaříklad MIDAS) a Borland C (například xlib).

Pokud chcete nějaký příklad programů pod DJGPP, můžete zkusit třeba Quake, demo Hard Rox, Info-ZIP (teď archivuje i dlouhé názvy), GhostScript, Executor - emulátor MACu, WatTCP, Xemu, DESQview/X developers kit, real-time zoomer fraktálů XaoS, demo BB atd.

Djgpp funguje také pod okny. Více se o tom dozvíte v kapitole o EMX.

6.1 Instalace DJGPP

Začneme od začátku - tedy stahování z internetu. Hlavní distribuce DJGPP se nachází na ftp.simtel.net v adresáři /pub/simtelnet/gnu/djgpp. Český mirror je na ftp.kolej.mff.cuni.cz v adresáři /pub/dos/programming/djgpp/distribution. Samotné stahování není nic jednoduchého. Adresář je plný podadresářů a velká část souborů vůbec není třeba. Proto tu uvedu seznam, které soubory je nutné nahrát, i s krátkým popisem (čísla v názvech jsou verze, pokud tam budou pozdější verze, stáhněte je.):

v2\djdev201.zip (1538295)

Nejdůležitější programy, konfigurační soubory a knihovny

v2gnu\bnu27b.zip (1712024)

Linker, assembler a další

v2gnu\gcc2721.zip (1096967)

Vlastní překladač GNU C

v2misc\cwsdpmi4b.zip (40719)

DPMI server

Další užitečné soubory jsou (podle důležitosti):

v2gnu\mak375b.zip 209185

Make utilita - nutná pro kompilaci většiny programů

v2\faq210b.zip 399350

FAQ - odpovědi na často kladené otázky

v2misc\mlp105b.zip 40583

Dobrý kompresor .EXE souborů

v2apps\rhide14b.zip 1413201

Borland-like IDE

v2gnu\gpp2721b.zip 681045

Kompilátor C++ (bez knihoven)

v2gnu\lgb2721b.zip 970199

C++ knihovna - nutná pro C++

v2gnu\txi390b.zip 466929

Prohlížeč dokumentace

v2tk\alleg22.zip 1007783

Allegro - grafická knihovna

v2tk\grx20.zip 659602

GRX - jiná grafická knihovna

v2gnu\ind191b.zip 74952

Indent - formátuje C zdrojáky

v2gnu\gzp124b.zip 71947

Gzip - kompresní program používaný v UNIXu

v2gnu\gpc20b.zip 1125151

Kompilátor Pascalu

v2gnu\gdb416b.zip 520271

GNU debugger - neumí grafiku atd.. Jiný debugger je třeba fsdb v djdev nebo Borland-style v RHIDE.

Soubory *s.zip obsahují zdrojové kódy. Samozřejmě, že tam je hodně jiných užitečných věcí.

Potom, co programy nahrajete na svůj počítač, rozbalte je do adresáře, kde chcete mít DJGPP (třeba c:\djgpp) pomocí:

      pkunzip -d (jméno)
         (u djgpp je unzip386, který dělá automaticky i adresáře)

Programy se samy rozlezou po adresářové struktuře. Jedinou vyjímkou je allegro, které je třeba rozbalit stranou (třeba v adresáři contrib). Potom stačí přidat to autoexecu:

Potom rebootujte, zkontrolujte, jestli je environment v pořádku a můžete napsat nějaký hello world a zkusit kompilaci:

      gcc hello.c

Pokud kompilace proběhne, vytvoří se a.exe. Ten potom můžete otestovat. Pokud něco nefunguje, jsou následující možnosti:

Překladač píše, že nenalezl DPMI a že chce cwsdpmi.

To asi nemáte dobře nastavenou cestu do bin adresáře, nebo tam není cwsdpmi.exe

Překladač něco nenalezne

něco chybí, nebo nejsou správně nastavené proměnné v autoexec.bat.

Překladař spadne.

Tady jsou následující možnosti:

Make nefunguje

Často se stane, že na cestě je make z jiného C (například Borland C) a to potom většinou nefunguje, ujistěte se, že první na cestě je make z balíku mak375b.zip

Něco jiného,

Tady si musíte poradit sami, nebo se obrátit na mailing list djgpp@delorie.com.

Ještě pár tipů na konfiguraci:

Konfigurace je v souboru djgpp.env v hlavním adresáři s DJGPP. Je dobré přesměrovat dočasný adresář tam, kde máte ostatní soubory. Také si můžete udělat konfiguraci s co nejvíce volnou pamětí, nějakou cache a CWSDPMI spuštěným jako resident (cwsdpmi /r). Pomůže také udělat tmp adresář na ramdisku. Místo ušetříte, když zabalíte celý podadresář bin pomocí djp (mlp105b.zip). Zpomalení se bát nemusíte, protože djp rozbalí 10MB do sekundy a to je pravděpodobně více, než rychlost Vašeho disku. Když je kompilování pomalé, pomůže zvětšení transfer bufferu u ld.exe pomocí programu stubedit. To samé urychlí i ostatní fáze kompilace - cc1, cppas. Občas překladači C++ a C dojde zásobník, potom je třeba jej pomocí programy stubedit zvětšit (u cc1, cc1pluscc2). Je lepší používat CWSDPMI místo jiných DPMI serverů, protože potom programy detekují víc problémů s pamětí. Také doporučuji přečíst FAQ.


Předchozí Následující Obsah

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