20.5.2004

O DOKUMENTACI, SEMESTRÁLKA Z C++ A NĚCO O MAKEFILE

Filed under: school,SW — nax @ 20:51

O vĂ­kendu jsem se konečně pustil do svojĂ­ semestrĂĄlky na předmět ProgramovacĂ­ jazyk C++. Na začátku semestru jsme dostali relativně volnou ruku co se tĂŠmatu týče (pouze minimĂĄlnĂ­ nĂĄroky na to, jakĂŠ konstrukce se tam musĂ­ objevit – polymorfizmus, vĂ˝jimky…) a tak jsem si v rĂĄmci tĂŠto prĂĄce vytyčil za Ăşkol napsat dĂŠmona, kterĂ˝ bude na pozadĂ­ monitorovat linku běžícĂ­ na Ronje (pomocĂ­ pingu, nejlĂŠpe ronjapingu, kterĂ˝ je obohacen o algoritmus vĂ˝počtu sĂ­ly signĂĄlu) a zĂĄroveň si bude stahovat informace o aktuĂĄlnĂ­m počasĂ­ z internetu, aby ve vĂ˝sledku ĹĄlo z těchto statistik kreslit grafy a to tak aby bylo vidět, při jakĂ˝ch světelnĂ˝ch podmĂ­nkĂĄch ta linka nejela a kdy ano.

V dokumentaci k programu vlna od českĂŠho guru typografickĂŠho systĂŠmu TeX (vlna slouŞí k doplněnĂ­ netisknutelnĂ˝ch mezer do zdrojĂĄku texovĂŠho dokumentu) jsem se dočetl, Ĺže Petr OlĹĄĂĄk vĹždy nejdřív napĂ­ĹĄe dokumentaci k tomu co se chystĂĄ napsat a pak aĹž to mĂĄ řádně promyĹĄleno, tak teprve napĂ­ĹĄe ten program. On vlastně i sĂĄm program TeX je napsĂĄn stejnĂ˝m zpĹŻsobem. KdyĹž ho pan D. Knuth (to jmĂŠno je dost často slyĹĄet v hodinĂĄch teoretickĂŠ informatiky a pak hlavně v teorii jazykĹŻ a překladĹŻ) tvořil, tak si nejdřív vymyslel vlastnĂ­ jazyk zvanĂ˝ web (ve kterĂŠm je napsĂĄna i výťe zmĂ­něnĂĄ vlna) a tam se programuje vlastně tak, Ĺže pĂĄĹĄete dokumentaci i kĂłd zĂĄroveň (tedy kdyĹž na zdrojĂĄk TeXu pustĂ­te tex, tak vĂĄm vypadne kompletnĂ­ dokumentace – specifikace – programu TeX).

Možná i to je důvod, že TeX je téměř dokonalý program a Knuth mohl udělat to, že někdy okolo roku 90 prohlásil TeX za hotový a od té doby tak jednou za 2 roky koukne na bugreporty zjistí, které z nahlášených chování neodpovídají dokumentaci a to a jen to pak začlení jako opravu (tedy nikdy už nebude do TeXu přidána nová funkce). Pro člověka odkojeného komerčními společnostmi, které mu každý půl rok servírují za drahý peníz nejlepší a nejnovější verzi, kterou prostě potřebuje to přijde poněkud divné. Nicméně obrovská výhoda tohoto přístupu je v tom, že pokud jste nějaký dokument napsali v roce 91 v TeXu, tak po přeložení jste dostali naprosto stejný dokument, jaký dostanete dnešní aktuální verzí. Mimochodem, verze TeXu je po zmražení kódu 3 a s každou objevenou chybou pan Knuth přidá za desetinou čárku jednu cifru z ludolfova čísla. Aktuální verze TeXu na mém stable debianu je 3.14159 (tedy zatím 5 zkutečných chyb bylo reportováno a opraveno). A rozhodně to není tím, že by tex byl málo používán.

TeX je tedy nádherný příklad jak důležité je nejdřív přemýšlet a potom programovat. Mimochodem to co se celý tento semestr učím v předmětu softwarové inženýrství, je vlastně přesně tohle. Nejdřív je potřeba udělat analytickou dokumentaci projektu a pak na základě těchto dokumentů se to implementuje do kódu. No a tak když jsem chtěl začít s programováním, tak jsem si vzpomněl na tu větu od Olšáka a začal jsem přemýšlet nad datovým modelem. Vlastně když už jsem se tu zmínil o SI, tak tam jsme se učili UML neboli Unified Modeling Language, což je mimo jiné jazyk, kterým se dají popsat i v diagramu závislosti mezi objekty. No a když mluvíme o diagramu, tak na to použiji program dia o které jsem tady na blogu už psal.

No lopotil jsem se s tĂ­m celĂ˝ vĂ­kend. Abych byl upřímnĂ˝, tak dia nenĂ­ zrovna program se kterĂ˝m by se člověku pracovalo hodně jednoduĹĄe, ale umĂ­ to to UML a po chvĂ­li uĹž jsem ty objekty zvlĂĄdal dělat a dědit. Jen mne docela iritovalo, Ĺže default velikost vklĂĄdanĂ˝ch symbolĹŻ je děsně velkĂĄ a nenaĹĄel jsem kde by se to dalo nějak ovlivnit (kromě při kaĹždĂŠm vklĂĄdĂĄnĂ­ změnit velikosti vĹĄech pĂ­sem pro danĂ˝ objekt). No a kdyĹž jsem měl zĂĄkladnĂ­ náčrt hotovĂ˝ tak jsem pouĹžil program Dia2Code, kterĂ˝ z uloĹženĂŠho XML souboru vygeneruje cpp a h soubory (samozřejmě jen vloĹženĂŠ deklarace – zĂĄzraky zase nečekejte). AkorĂĄt jsem nepochopil proč tam nevloĹžil i ty komentáře kterĂŠ jsem tam k tomu tak pracně vklĂĄdal.

No a teď jsem ve fázi implementace. A řekl jsem si, že by nebylo špatné využít síly programu make. V jednom cvičení z předmětu OSY jsou hezky jeho výhody popsané. Ve zkratce jsem potřeboval takový Makefile, aby se vždy překládaly jen soubory, které jsem od minulého překladu změnil. Napsal jsem si tedy Makefile, kde je vždy popsán zvlášť překlad skupiny souborů, které implementují vždy jeden cpp soubor.

Měl jsem ale problém při překladu. Hlásilo to tohle:

g++ -Wall -g -o wd runcommand.o
/usr/lib/crt1.o: In function `_start’:
/usr/lib/crt1.o(.text+0x18): undefined reference to `main’
collect2: ld returned 1 exit status
make: *** [all] Error 1

Myslel jsem si, Ĺže jsem něco ĹĄpatně udělal v tom Makefilu a tak jsem zjistil třeba to, Ĺže parametr -c u g++ (gcc) znamenĂĄ aby to jen zkompiloval a uĹž to nelinkoval, ale tĂ­m se jen problĂŠm přesunul do chvĂ­le kde se v části all sestavovala kompletnĂ­ binĂĄrka. Ale nakonec byl problĂŠm přesně v tom, co to hlĂĄsilo – totiĹž v tom, Ĺže při pokusu sestavit tu konečnou binĂĄrku nemĂĄ k dispozici Şådnou funkci main a tedy by program neměl kde začít.

Sakra to sem se zase děsně rozkecal. UĹž bych měl začít konečně implementovat. Od příště bych ty posty měl psĂĄt o hodně kratĹĄĂ­. Třeba vĹždy jen odstaveček nebo tak. Tohle stejně asi nikdo číst nebude 😉

Comments are closed.

Powered by WordPress