Úvod do GNU: DJGPP - GNU překladač pro DOS

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žovatv roce 1986, kdy se ptal RMS, jestli GNUplánuje port pro DOS. Ten ale říkal, že to není možné, protože DOS nesplňujepředpoklady GCC na operační systém.

Jako první verzi zkompiloval GCC pod ICSUnixem na 386/16Mhz. Přepsal systémová volání, potom slinkoval s ICS Cknihovnou a pomocí programu výsledek předělal do 32 bitového EXE proPhar 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. Potomvzal 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šlapř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ž podporovalaVCPI, 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. Jakoprvní napsali assembler, který vygeneruje 16ti bitovýzavaděč. Tento zavaděč ale vyžadoval DPMI a tak aplikace už zaseneběžely všude, proto se go32 používalo dál, jako DPMI server. To sevyř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žev podstatě CWSDPMI vypadá skoro jako extender, ale není. Vyvinout verzi 2trvalo 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 velicepodobný Watcom C. Vyznačuje se opravdu dobrou stabilitou. Programykompilované pod DJGPP fungují bez potížípod windows, čistým DOSem, EMM386, Qemm386, Qemm386 s jehoDPMI serverem, Linuxovým dosemulátorem a pod.Autoři uvádějí problémy s Novell DOS DPMI serverem, který má chyby a takněkteré věci zlobí.Stačí ale DPMI vypnout a už všechnochodí 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žebDOSu 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 jevelikost .exe souboru. U klasického hello word jde velikost stáhnoutna 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ýchvěcí:

Allegro

grafická knihovna specializovaná na hry a dema. Umí jenom256 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, žeVESA 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áledost rychlá na akční hry. Umí ale více grafickýchprimitiv, pracuje s VESA a má svoje drivery. Umí černobílé, 16ti barevné, 256ti barevné, hi color a truecolormody.

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ěkdyvidě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 .exesouboru. 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 BorlandC (například xlib).

Pokud chcete nějaký příklad programů pod DJGPP, můžete zkusittřeba Quake, demo Hard Rox, Info-ZIP (teď archivuje i dlouhé názvy),GhostScript, Executor - emulátor MACu, WatTCP, Xemu, DESQview/Xdevelopers 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.czv adresáři /pub/dos/programming/djgpp/distribution. Samotné stahovánínení nic jednoduchého. Adresář je plný podadresářů a velká částsouborů 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 tambudou 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, coprogramy nahrajete na svůj počítač, rozbalte je do adresáře, kdechcete 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. Jedinouvyjí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ůžeteotestovat. 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, nebotam 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 BorlandC) a to potom většinou nefunguje, ujistěte se, že první na cestě jemake z balíku mak375b.zip

Něco jiného,

Tady si musíte poradit sami, nebo se obrátit namailing 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ělatkonfiguraci s co nejvíce volnou pamětí, nějakou cache a CWSDPMIspuš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 jepravděpodobně více, než rychlost Vašeho disku. Když je kompilování pomalé,pomůže zvětšení transfer bufferu u ld.exe pomocí programustubedit.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 jejpomocí programy stubedit zvětšit (u cc1, cc1pluscc2). Je lepší používatCWSDPMI 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.


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