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ů:
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í:
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.
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.
Pascal byl předělán tak, aby se co nejvíc podobal Borlandímu.
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.
Velice kvalitní kompresor spustitelných souborů - rozbalí 10MB do sekundy, proto tím mám zabalený i samotný překladač.
celkem hezké GUI, které vypadá jako to z Nortonových utilit.
player modu apod. Jde použít pro zvuk ve hrách.
převaděč klasického assembleru do AT&T syntaxe.
ukázka, že v DJGPP lze psát i rezidenty. (Už jste někdy viděli rezident v protected modu?)
velmi kvalitní DPMI server
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.
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.
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.):
Nejdůležitější programy, konfigurační soubory a knihovny
Linker, assembler a další
Vlastní překladač GNU C
DPMI server
Další užitečné soubory jsou (podle důležitosti):
Make utilita - nutná pro kompilaci většiny programů
FAQ - odpovědi na často kladené otázky
Dobrý kompresor .EXE souborů
Borland-like IDE
Kompilátor C++ (bez knihoven)
C++ knihovna - nutná pro C++
Prohlížeč dokumentace
Allegro - grafická knihovna
GRX - jiná grafická knihovna
Indent - formátuje C zdrojáky
Gzip - kompresní program používaný v UNIXu
Kompilátor Pascalu
GNU debugger - neumí grafiku atd.. Jiný debugger je třeba fsdb v djdev nebo Borland-style v RHIDE.
*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:
set DJGPP=(cesta1)/djgpp.env
- POZOR! Tady se v cestě píšou normální / místo \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:
To asi nemáte dobře nastavenou cestu do bin adresáře, nebo tam není cwsdpmi.exe
něco chybí, nebo nejsou správně nastavené proměnné v autoexec.bat.
Tady jsou následující možnosti:
Č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
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
, cpp
a as
.
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
, cc1plus
a cc2
). 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.
Dotazy a připomínky ohledně stránky posílejte na hubicka@paru.cas.cz