ADE: GNU C/C++ ObjectiveC 2.7.2.1Jan Skýpala
Na začátku byl Markus Wild se svým plánem naportovat NetBSD Unix na Amigu.
Protože základním překladačem tohoto operačního systému je GNU C, musel nejdříve
naportovat tento kompiler: Ten však využívá některé služby Unixu, které na Amize
nebyly dostupné, a tak úplně první věc, která vznikla, byla ixemul.library. Celé
to šlo podle plánu, ale několik dalších programátorů si řeklo, že by stálo za to
ve vývoji knihovny a překladače pokračovat. Později začali přenášet na Amigu i
další volně dostupný software (většinou s onou předponou GNU) a přibližně před
rokem a půl se zorganizovali pod jménem Amiga Developer Environment. Recenzí
překladače GNU C bych chtěl začít sérii článků, která se bude postupně věnovat
(snad) všem programům z balíku ADE. Jazyky C a C++ jsou dnes asi nejužívanější jazyky v programování. Je v nich
napsána většina operačních systémů (i většina AmigaOS) i většina aplikací.
Existuje obrovské množství překladačů a kdybychom hledali, na Amize jich bude k
desíti. Od základních, jako je NorthC, přes vyspělé překladače jazyka C, ovšem
bez překladače C++ (DiceC) až po ty nejvyspělejší. A k těm se právem řadí GNU C.
Tento překladač je výjimečný z několika hledisek. Asi jako první všechny potěší
zpráva, že je zdarma. GNU C je (podobně jako třeba Linux) vyvíjen mnoha fandy na
světě. Ale nejen to, i velké firmy (jako třeba Motorola či Intel) zaměstnávají
skupinky programátorů, které zajišťují, aby GNU C fungoval a generoval programy
pro jejich procesory.
Jistě jste již odtušili další zajímavost. GNU C existuje pro většinu procesorů a
operačních systémů. Zapomeneme-li na Atari 800, C-64 a Sinclairy řazeno podle
abecedy), tak lze říci, že snad na všech. Od PC/MS-DOSu přes Amigu či Maca až po
Unixy či BeOS. Překladač GNU byl od počátku navržen velice obecně, nejdříve
negeneruje skutečný kód, ale jakési algebraické čtveřice (matematika!) a teprve
pak je na tento pseudokód poslán překladači produkujícímu skutečný program.
To, že GNU C je takříkajíc všude, také zajišťuje, že pokud nepoužijete nějaké
speciální funkce daného operačního systému, t.j., budete používat jen to, co je
součástí distribuce jazyka, měl by program běhat naprosto všude. Píšu měl,
protože mohou nastat výjimky. GNU C totiž bylo navrženo na 32-bitové počítače a
na některých současných vymoženostech, jako jsou 64-bitové procesory DEC Alpha
nebo PowerPC 620, může dojít k nesprávnému zarovnávání proměnných (obzvláště u
polí struktur).
GNU C jsou ovšem 3 překladače, nejenom jeden. Vy sice budete spouštět překladač
příkazem gcc, případně g++ (vhodnější pro programy v C++, gcc ale funguje taky),
ovšem když se věci podíváte na zoubek, zjistíte, že v adresáři
ADE:lib/gcc-lib/m68k-amigaos/2.7.2.1 jsou skutečné překladače. cc1 je vlastní
překladač jazyka C, cc1 plus jazyka C++ a cc1obj jazyka ObjectiveC (jedná se o
trochu jinou implementaci objektů do jazyka C; ObjectiveC se proslavil tím, že v
něm je napsán operační systém NeXTStep). A hned se zarazíte: sakra, ty
překladače jsou ale dlouhé.
A to nás dostává do zádrhele. Ano, GNU C je trochu náročnější překladač.
Překladač jazyka C (ten jediný soubor – cc1) má délku 1.3MB, C++ dokonce 1.6MB.
Dále bude zapotřebí nějaké místo na zásobníku (odhadem 300kB) pro vnitřní
potřeby programu, no a samozřejmě paměť na váš zdrojový kód a generovaný
program. Takže pro seriózní práci je doporučeno alespoň 4MB paměti pro céčko a
6MB pro C++, pokud byste si chtěli zkompilovat něco velkého (například právě GNU
C naportované na váš hardware) pak 10MB. Kromě toho budete potřebovat nějaké
místo na harddisku, když započítáme i všelijaké knihovny a pár dalších utilit
(jako jsou třeba preprocesor či linker), takže si rezervujte alespoň nějakých
10MB. GNU C již dnes neběhá na AmigaOS 1.3 či ještě starších, to by ale nemělo
být velkou překážkou, protože tato verze snad už ani není používaná.
Takže překladač sice zadarmo je, ale pokud ho budete chtít seriózně používat,
tak vám základní A1200 stačit nebude a peníze vypláznete na nějakou tu
turbokartu a simma, popřípadě i větší harddisk. Co ale za své peníze dostanete?
Přiznejme hned na začátku, že hodně, ale ne vše. Pokud jste začátečníci a nemáte
po ruce někoho trochu znalejšího, asi budete zaskočeni. Překladač totiž nemá
žádné prostředí, žádný textový editor či nějaký project manager. Je téměř ve
stejném stavu jako na Unixu. Takže nahrajeme oblíbený GoldED či CygnusED, na
Workbenchi nahodíme shell a oddáme se tak trochu masochismu.
No až tak zlé to zase není. Jednoduchá utilita GCCOpts umí pro zdrojáky
vygenerovat základní Makefile. Do editoru si doděláte nějaká makra na překlad a
spouštění a jste skoro za vodou. Napíšete oblíbený HelloWorld.c, zjistíte, že to
funguje a můžete začít psát dle vašeho gusta.
Takže co nám překladač nabízí z hlediska programovacího jazyka? Zde opravdu
hodně. Céčko chodí jak má, podpora pro práci s amigáckými knihovnami je, takže
to, co fungovalo jinde, jede většinou v GNU taky. Jazyk nám však navíc nabízí
několik zpestření. POZOR. Pokud budete tyto věci využívat, vaše programy už
nebudou přeložitelné jinými překladači. Ale na druhou stranu vám hodně pomohou.
Přidaných věcí je skutečně hodně, a tak si uvedeme pouze několik málo. Vybral
jsem ty, které by měly každému (i začínajícímu) céčkaři ihned přijít jasné.
Takže pojďme na to.
Představte si makro zrovna jako tohle: #define max(x,y) ((x>y)?x:y) Vše jasné. A
co když v programu napíšete třeba c=max(i++,j). Pokud umím já dobře rozvádět
makra, tak tu máme zádrhel. Pokud bude větším číslem j, proběhne vše v pořádku,
ale pokud to bude i, po operaci bude tato proměnná ne o 1, ale o 2 větší. GNU C
vám umožňuje nádhernou okliku takto: #define max(x,y) ((x>y)?_x:_y) Pokud zadáte
makro takto, bude proměnná i v každém případě větší jen o 1.
Ačkoliv v céčku není pevně definovaný rozsah typů, většina překladačů dodržuje
velikost charu jako 8 bitů, shortu jako 16 bitů a intu a long fintu jako 32
bitů. Může se ovšem stát věc nemilá, že potřebujete větší rozsah než 4 miliardy,
a to s přesnosti na jednu celou (takže proměnné s desetinou čárkou jsou k
ničemu). Třeba počítáte rozpočet České republiky nebo tak něco. GNU C vám nabízí
nový typ, nazvaný long long int. Je zaručeno, že je dvakrát tak dlouhý jako long
int, takže má 64 bitů.
Už jste programovali v AmigaOS hook-funkci? Pokud ne, tak to je něco, co můžete
„podstrčit“ systému, a např. pomocí toho sami kreslíte položky list-gadgetu. Do
standardní hook-funkce systém předává 3 parametry: ukazatel na váš hook,
ukazatel na data (která má hook zpracovat) a kód operace, podle které
hook-funkce pozná, co má s daty udělat. Ve struktuře hooku je jeden ULONG na
vaše případná soukromá data. Když ale chcete předat více proměnných (a nechcete
použít globální proměnné - fuj!) máte v céčku jedinou možnost: vytvořit
strukturu, do které si vše, co chcete předat, umístíte a v hook-funkci to zase
rozparsovat. Ale Pascal měl jedno elegantní řešení: vnořované funkce. A jak už
asi tušíte, GNU C je má taky. Takže následující prográmek vytiskne trojku: #include <stdio.h>
void main()
{
int x; void;
foo()
{
printf(„%d
“, x);
}
x = 3;
foo();
} Přejděme k jazyku C++. Překladač je to velice komplexní - pokrývá teoreticky
vše, co je v C++ zadefinováno (výjimky jsou prý ještě ve vývoji, ale mně fungují
bez problémů). Takže kromě tříd, dědičnosti, přetěžování funkcí a operátorů
programátorovi nabízí i šablony (templates) a již zmiňované výjimky
(exceptions). Pokud si pohovoříte s nějakým zkušenějším programátorem, třeba
bude tak hodný a vysvětlí vám, na co jsou tyto vymoženosti vhodné.
Z vlastní zkušenosti musím říci, že když jsem vzal některé své zdrojáky (se
šablonami), které jsem napsal pod GNU C++ a zkusil je přeložit v Storm C++,
musel jsem provést několik úprav, aby se to Stormu líbilo. Nebyly to změny
velké, ale byly nutné.
Také jsem zkoušel portovat ClassLib z Borland C++ do GNU C++. I zde ale nastaly
jisté komplikace, a to u šablon. Konkrétně se jednalo o konflikt lokálně
zadefinovaného typu (lokálně pro třídu) a pak jeho použití v definici metody
(této třídy) mimo definici třídy: template <class T>
class myclass
{
public:
typedef void (*Func)(T&,void *);
T *method(Func cond,void *args);
}:
template <class T>
T*myclass::method(Func cond,void*args)
{
... // nějaký kód
} A teď k programování v GNU C na Amize. Jednou z pěkných věcí je psaní
síťových aplikací. V ixnet.library se nachází standardní unixovské funkce pro
práci se sítí a knihovna si sama umí rozpoznat, jestli je na počítači
nainstalováno AmiTCP či AS225 a použít konkrétní realizaci TCP/IP bez nutnosti
programátora psát program dvojmo, případně jeden pro oba síťové balíky.
Do GNU C již byla naportována většina Amiga direktiv z jiných překladačů jako
např. _saveds či _chip, takže přechod z jiného překladače by neměl být až tak
záludným problémem. Na předávání parametrů skrze registry je ovšem trochu jiná
konvence, místo psaní a0 před typ proměnně musíte napsat asm(„a0“) až za jméno
proměnně.
Jak možná někteří ví, Unix nemá žádná zařízení v tom duchu, jak tomu je na
Amize. Všechny soubory se zdají být na jednom velkém disku. Protože všechny GNU
aplikace jsou odvozeny od Unixu, bylo třeba zařídit i toto. Celá záležitost je
vyřešena velice vtipně: základní adresář na disku je v Unixu označen jako
lomítko na začátku cesty, tzn. třeba /soubor.txt by byl soubor.txt uložený v
základním adresáři. Ixemul.library následovně zajišťuje, že všechny požadované
cesty začínající lomítkem jsou převedeny na amigácké cesty tak, že jméno prvního
adresáře je převedeno na jméno zařízení (assignu). Celé to můžete vidět
spustíte-li si GNU C ve verbose režimu (parametr -v), místo ADE:... jsou všechny
cesty uváděny jako /ade/...
Co se týče délky a rychlosti výsledných programů, je GNU C velice dobrým
překladačem. Není sice tak dobrý jako SAS/C (přece jenom je na výsledném kódu
vidět, že překladač je napsán obecně pro jakýkoliv procesor), ale hravě za sebou
zanechá jak: StormC++ tak DiceC. Zkuste si někdy zapnout optimalizaci -02 a
vygenerovat si zdroják pro assembler (parametr S) a budete asi mile překvapeni
kvalitou provedené optimalizace.
Pokud provedete normální kompilaci, výsledný program bude při spuštění
automaticky otevírat ixemul.library a z ní bude používat třeba funkci printf().
Pro některé Amigácké aplikace je ale tato knihovna zbytečná. Proto vznikla
knihovna libnix, díky níž lze v GNU C vytvořit i aplikace, které ixemul.library
nepotřebují. Tato linkovaná knihovna obsahuje ty nejpoužívanější funkce z
ixemul.library a kompilujete-li s parametrem -noixemul, bude přilinkován právě
libnix. Výsledný program je ovšem o trochu delší.
Na závěr bych asi měl napsat, kde to všechno vzít. ADE lze získat ze dvou
zdrojů. Jedním jsou CD-ROM (ADE disky by měly být vydávány co čtvrt roku - viz
recenze v tomto čísle), takže hledejte u prodejců. Cédečko má výhodu, že lze vše
spouštět přímo z něj, takže při troše nepohodlí co do rychlosti můžete dát na
harddisk jiné věci. A vše je pochopitelně také na Internetu. ADE se nachází na Internetu a to na URL adresách:
ftp.ninemoons.com/pub/ade (hlavní server)
ftp.grolier.fr/pub/amíga/ade (kompletní zrcadlo ve Francii)
ftp://bilbo.di.unipi.it/pub/ade (částečné zrcadlo v Itálii )
Na těchto serverech se nenacházejí pouze programy z ADE distribuce, ale i
betaverze nových programů a zálohované konference týkající se ADE projektů; pro
serióznější práci doporučuji si tyto konference stáhnout a pročíst. Celé ADE
(zabalené) má asi 250MB, ale to je včetně zdrojových souborů.
Jako naprosté minimum pro běh GNU C by snad mohlo stačit toto:
ixemul.library 45+, gcc-X.X.X.X-bin.lha, libamiga-bin.lha, os-inc-bin.lha.
Je ovšem doporučeno nainstalovat si na harddisk následující:
ADE-mise-bin.lha
binutils-X.X-bin.lha
bison-X.X-bin.lha
diffutils-X.X-bin.lha
fifo-X.X-bin.lha
fileutils-X.X-bin.lha
findutils-X.X-bin.lha
flex-X.X-bin.lha
gcc-X.X-bin.lha
grep-X.X-bin.lha
gzip-X.X-bin.lha
ixemul-X.X-bin.lha
ixpipe-X.X-bin.lha
libamiga-bin.lha
libg++-X.X-bin.lha
libro-X.X-bin.lha
libnix-X.X-bin.lha
make-X.X-bin.lha
os-inc-bin.lha
patch-X.X-bin.lha
pdksh-X.X-bin.lha
sed-X.X-bin.lha
sh-utils-X.X-bin.lha
tar-X.X-bin.lha
tcrmcap-X.X-bin.lha
textutils-X.X-bin.lha.
Tento komplet vám na systém zavede víceméně kompletní rozhraní UNIXU pro
AmigaOS. Vše co potřebujete skutečně naleznete na Internetu. Vytlačiť článok
Pozn.: články boli naskenované ako text a preto obsahujú aj zopár chýb. Taktiež neručíme za zdrojové kódy (Asm, C, Arexx, AmigaGuide, Html) a odkazy na web. Dúfame, že napriek tomu vám táto databáza dobre poslúži.
Žiadna časť nesmie byť reprodukovaná alebo inak šírená bez písomného povolenia vydavatela © ATLANTIDA Publishing
none
|