OT Samomodifikujuci sa make

Jan Waclawek konfera@efton.sk
Úterý Prosinec 16 23:21:50 CET 2008


> K cemu je vubec takova vopicarna jako samomodifikujici se make dobra? 
> make popisuje zavislosti mezi zdrojaky a objekty apod. Nejak nevidim 
> nutnost modifikace make?

Kratka odpoved je, ze sa to hodi vtedy, ak sa ta zavislost medzi zdrojakmi a objektami meni (napr. pribudaju zdrojaky), a tu zmenu je schopny nejaky automatizovany proces postrehnut a patricne zmodifikovat makefile. 

Ale to su len slova, a bez nejakeho prikladu je to asi tazke pochopit. Tak ja radsej napisem cely ten pribeh, aj ked je dlhy - ak chcete, precitajte si ho a sudte, ci to ma hlavu alebo patu, oboje, ci nic z toho... ;-)

Zacnem tym, ze starnem. Jednoducho si uz nepamatam, co bolo vcera. Ak sa ma niekto spyta, ako funguje v mojom programe toto a toto, alebo treba zmenit hento a tamto, no tak to musim pohladat v zdrojakoch. A obvykle mi tie zdrojaky nic nehovoria - je to tak trocha ako sa hrabat v cudzich zdrojakoch. Nie celkom, lebo matne si predsalen nieco pamatam, ale velakrat je to o tom hladani.

No a na tom hladani ma - rovnako ako na hrabani sa v cudzich zdrojakoch - stve najviac to, ze veci obvykle nie su pekne pohromade, a nato aby som zistil, ako funguje toto a toto, musim vliezt do xxx.c, xxx.h, yyy.c, yyy.h, zzz.c, zzz.h atd., a po urcitom case uz nerobim nic ine iba zurivo prepinam medzi poltuctom zdrojakov a zufalo sa snazim zapamatat si, v ktorom prave som a naco je dobry. Napriklad, vymyslim si, po stlaceni tlacitka A sa rozsvieti LEDka B na urcitu dobu, potom zhasne. No, stlacenie tlacitka sa detekuje v nejakom timeri, ale tam sa cita cely port naraz do premennej, ktora je unionom (definovanym v nejakom headeri) "skonvertovana" do bitoveho pola. Prislusny bit pre toto tlacitko je testovany v hlavnej slucke, a nastavi sa bit v inom bitovom poli, ktore je nasledne v inej funkcii tiez volanej z hlavnej slucky vyslany na port s LEDkou. Zhasanie sa vsak robi tak, ze sa pri rozsvieteni LEDky nastavi nejake pocitadlo a ulozi na nejake miesto adresa portu, ktory sa ma zhasnut, a samotne zhasnutie sa urobi priamo v timeri kde sa aj dekrementuje pocitadlo. Toto co som popisal sa da vcelku dost neprehladne rozsypat do toho poltucta zdrojakov.

A nejde len o to, ze to niekto zamerne rozsypal. Maloktory programator ma taketo sadomasochisticke sklony. Skor ide o nasledok mnozstva zmien v netrivialnom projekte dlhsieho trvania - poznate to, zaplata na zaplate, "toto sme povodne neplanovali a pozadovana zmena ide uplne proti nasej povodnej filozofii". Po tych rokoch uz neverim, ze sa tomuto javu da v comkolvek, co trva roky, vyhnut.

Takze som hladal nastroj, ktorym veci udrzim akosi pohromade, aj ked v skutocnosti su nevyhnutne rozsypane. (Neskor som sa dozvedel, ze odborny nazov je "code reordering"). Nieco podobne sa v C da robit makrami, ale ma to rozne obmedzenia, a clovek sa do toho lahko zamota.

Nastroj som nasiel inde nez som ho hladal a pri hladani niecoho ineho - hladal som metodu dokumentacie projektu, ktora je menej "automaticka" nez doxygen - a nasiel som WEB (nie world-wide-web, ale WEB Donalda Knutha; bohuzial ten nazov je v dnesnej dobe uz matuci). Islo o metodu pisania zdrojaku v kombinacii TeX-u (co je tiez Knuthov vynalez) a Pascalu (neskor bol upraveny aj pre C), z ktoreho sa pomocou dvoch nastrojov - nazvanych Knuthom "tangle" a "weave", cize sukanie a tkanie - vytvoria samostatne Pascalovske zdrojaky a samostatnu dokumentaciu. Pod dokumentaciou si treba predstavit okomentovane a sformatovane ("pretty-printed") zdrojaky - toto sa mi po prvych pokusoch javilo ako uplne nepouzitelne, presne kvoli tomu preco sa mi ako pre prax nepouzitelny zda aj doxygen. Je to totiz dobre len pre vyvojara; lenze vyvojarovi v skutocnosti staci, ak su bohato komentovane skutocne zdrojaky, ktore su tak ci tak textom ktory dnesne editory vedia pekne farebne highlightnut; pekny font, poodsadzovanie, klikatelne linky a automaticky vytvorene indexy su pekne, ale malokedy skutocne uzitocne.

Lenze ten WEB pritom robil aj ten code reordering. Pravdu povediac, ja som originalny WEB ani CWEB nikdy nepoouzil; pouzil som uz dost silne odvodenu a minoritnu variantu menom nuweb. Ta sice este bola zalozena na TeXe a robila nejaky druh pretty-printingu, ale inak bola nezavisla na programovacom jazyku. To bol zamer: predpokladal som, ze bude treba pouzit viac jazykov, resp. som sa tym nechcel obmedzit.

Ten TeX mi vsak nijako nesiel (to je svet sam osebe nie prilis vzdialeny *nixovskemu svetu, ktory ma za priatela nepoklada). A ani som ho pre tu "dokumentaciu" vlastne nepotreboval.

Tak som si vymyslel svoj vlastny druh WEBu, ktory som nazval nyweb (uz som tu o nom pisal a mam nieco aj na mojich www strankach). Je zalozeny na XML (resp. na mojej okresanej implementacii) a je spartansky minimalisticky; na druhej strane nie je nijako jazykovo zavisly. Tudiz mozem do jedneho weboveho zdrojaku dat hned vedla seba (samozrejme kazdy schovany do svojho XML tagu) kus asembleru (povedzme z toho prikladu hore tu cast v timeri kde sa citaju porty), nejaky kus z nejakeho C-ckovskeho headeru (napr s definiciou toho unionu), a potom nejake kusy v C. Su to akesi kusy "definicie" kodu, ci akesi makra, ktore potom niekde inde, kde sa tie zdrojove subory skutocne vytvaraju, jednoducho "pouziju". Nie vzdy sa mi to dari urobit logicky a niekedy je z toho dobry gulas, inokedy ked som unaveny (t.j. sa mi nechce rozmyslat nad "ulahcovanim si buducnosti") a ponahlam sa, tak zase napisem obrovsky kusisko v C bez akehokolvek delenia a reorderingu, ale zhruba tie principy dodrziavam. 

No, a takto vytvaram aj makefile. Ak sa rozhodnem, ze ten a ten modul si zasluzi samostatnu existenciu vo forme .c/.h suboru, tak nielenze vytvorim prikazy pre "tvorenie" tychto suborov a presuniem do nich klauzuly "pouzitia" prislusnych "makier"; ale rovno pridam aj do makra, ktore sa "pouzije" pri tvorbe makefile (lebo aj ten tvorim z webovskeho zdrojaku - "vsetko na jednom mieste"), aj meno tohoto noveho suboru. No a kedze sa ten interpreter toho webovskeho zdrojaku spusat pochopitelne v make, tak sa vtedy zmeni aj makefile, a treba ho znova spustit... Dodnes som to robil tak, ze som o tom vedel, ze v pripade zmeny "makra" pouziteho v makefile treba make pustit dvakrat... oddnes to uz nemusim robit ;-)

Tak co, ma to hlavu a patu?

wek



Další informace o konferenci Hw-list