OT Samomodifikujuci sa make

Tomas Dresler dresler@hw.cz
Středa Prosinec 17 01:50:43 CET 2008


Desim se toho starnuti, jak ho popisujes... Zatim me louskani cizich
zdrojaku zivi, s tuzkou a funkci Total Commanderu Alt-F7 :-)

--
S pozdravem/with best regards

	Ing. Tomas Dresler

mailto:dresler@hw.cz


-----Original Message-----
From: hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] On
Behalf Of Jan Waclawek
Sent: Tuesday, December 16, 2008 11:22 PM
To: HW-news
Subject: Re: OT Samomodifikujuci sa make

> 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
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list@list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list