AMIGA REVIEW online
  Uvodná stránka     Software     Hry     Obaly     Download     Kniha návštev     Amiga na PC     Amiga Forever  

ADE: GNU C/C++ ObjectiveC 2.7.2.1

Jan 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


© ATLANTIDA Publishing Všechna práva vyhrazena.
Žádna část nesmí být reprodukována nebo jinak šířena bez písemného svolení vydavatele.



Amiga na Vašem PC rychle, snadno a zdarma!


none

AMIGA REVIEW

57 ( 11-12 / 2000 )
56 ( 9-10 / 2000 )
55 ( 7-8 / 2000 )
54 ( 5-6 / 2000 )
53 ( 3-4 / 2000 )
52 ( 1-2 / 2000 )
 
51 ( 12 / 1999 )
50 ( 11 / 1999 )
49 ( 10 / 1999 )
48 ( 9 / 1999 )
46-47 ( 7-8 / 1999 )
45 ( 6 / 1999 )
44 ( 5 / 1999 )
43 ( 4 / 1999 )
42 ( 3 / 1999 )
41 ( 2 / 1999 )
40 ( 1 / 1999 )
 
39 ( 12 / 1998 )
38 ( 11 / 1998 )
37 ( 10 / 1998 )
36 ( 9 / 1998 )
35 ( x / 1998 )
34 ( x / 1998 )
33 ( 1-2 / 1998 )
 
32 ( 11-12 / 1997 )
31 ( 9-10 / 1997 )
30 ( 7-8 / 1997 )
29 ( 6 / 1997 )
28 ( 5 / 1997 )
27 ( 4 / 1997 )
26 ( 3 / 1997 )
25 ( 2 / 1997 )
24 ( 1 / 1997 )
 
23 ( 12 / 1996 )
22 ( 11 / 1996 )
21 ( 10 / 1996 )
20 ( 9 / 1996 )
18-19 ( 7-8 / 1996 )
17 ( 6 / 1996 )
16 ( 5 / 1996 )
15 ( 4 / 1996 )
14 ( 3 / 1996 )
13 ( 2 / 1996 )
12 ( 1 / 1996 )
 
11 ( 12 / 1995 )
10 ( 11 / 1995 )
9 ( 10 / 1995 )
8 ( 9 / 1995 )
7 ( 7 / 1995 )
6 ( 5 / 1995 )

ATLANTIDA NEWS

5 ( 3 / 1995 )
4 ( 1 / 1995 )
 
3 ( 11 / 1994 )
2 ( 9 / 1994 )
1 ( 7 / 1994 )
0 ( 5 / 1994 )