10. Jul 2007 18:01 L3 kompilators - no pilnīgi manuālas darbošanās līdz pilnīgai automatizācijai Mana saimniecība sastāv pamatā no 9 programmām, no kurām viena ir galvenā visaptverošā programma - pilnais kompilators no valodas L3 uz valodu L0, bet pārējās - kaut kādas šī pilnā kompilatora apakškopas (pie kam tās savā starpā šķeļas..), kas reprezentē kaut kādas loģiskas kompilācijas procesa apakš-darbības. Lai tiktu galā ar šo saimniecību, pašos pirmssākumos biju spiests pielikt ārkārtīgi lielas pūles, paturēt galvā daudz informācijas un bieži veikt ārkārtīgi daudz mehāniskas monotonas darbības.
Ko tad īsti nozīmē uzturēt šo saimniecību? Tas nozīmē uzturēt jaunākās versijas visām šīm 9 programmām - gan programmu kodam, gan arī (un tas galvenais) šīm programmām izpildāmā formātā - .dll datņu veidā.
Varbūt nedaudz pastāstīšu par procesu, kādā notika šo programmu labošana/papildināšana/testēšana utt. Kā jau minēju, dažas no šīm programmas savā starpā šķeļas, kas faktiski nozīmē to, ka vairākas funkcijas un procedūras sastopamas vairākās no manām programmām. Tā kā tās rakstītas assembler līmeņa modeļu transformāciju valodā L0, tad nebija iespējams atdalīt šīs vairākkārt izmantojamās funkcijas un procedūras kā atsevišķu bibliotēku, bet nācās tās rakstīt pilnā kodā katrā no programmām (katra programma - tas ir viena teksta datne). Līdz ar to saprotams, ka izmaiņas, ko es veicu kādā no šīm programmām, bija nepieciešams manuāli ielikt arī visās citās programmās, kurās tas nepieciešams. Tas, kā jau Jūs varat iedomāties, manu dārgo lasītāj, bija Ārkārtīgi (ar lielo `Ā`) ķēpīgi. Parasti labojumus izdarīju pilnajā kompilatora variantā un pēc to notestēšanas veicu manuālu sinhronizāciju arī pārējās programmās. Ja izmaiņas bija nelielas (burtiski pamainītas dažas koda rindiņas), tad šī manuālā sinhronizācija nozīmēja pārkopēt šīs rindiņas visās citās programmās npieciešamajās vietās (protams, pēc testēšanas atceroties no galvas, ko tieši esmu palabojis..). Taču tipiskajā gadījumā, protams, izmaiņas bija lielākas, kas skāra vairākas procedūras un/vai funkcijas vairākās vietās un tādā gadījumā galvā to visu paturēt būtu neiespējami. Šādos gadījumos rīkojos pavisam pragmātiski - pierakstīju, kurās procedūrās/funkcijās esmu kaut ko darījis (jebko) un pēc tam pārkopēju pilnībā šīs procedūras/funkcijas attiecīgajās programmās.
Nākamais stāsts ir par to, ko man nācās darīt ar izlabotajām programmām. Tātad - katru programmu, kuru izlaboju, bija nepieciešams arī pārvērst par .dll datni (kā jau augstāk izskaidrots). Kā to izdarīt? Programmas, kā jau minēts, tiek rakstītas valodā L0, tātad vispirms jāizmanto L0 kompilators, kas no dotā programmas teksta iegūs programmas kodu valodā C++, un pēc tam jāizmanto C++ kompilators, ar kura palīdzību iegūt .dll datni. Izklausās vienkārši? Teiksiet - protams, shēma vienkārša.. Nekā nebija.. Tehniski sīkumi dara savu.. Faktiski darbošanās notika šādā veidā: 1) L0 programmas datne tiek pārsaukta par `transprg.txt` un iekopēta vajadzīgajā mapē; 2) tiek palaists L0 kompilators, tādējādi iegūstot C++ kodu; 3) tiek palaists C++ kompilators, tādējādi iegūstot .dll datni ar fiksētu vārdu un atrašanās vietu; 4) .dll datne tiek pārsaukta vajadzīgajā vārdā un novietota vajadzīgajā vietā Papildus tam divām no manām 9 programmām (galvenajai programmai un vēl vienai) starp punktiem 2) un 3) vēl papildus nācās papildināt iegūto C++ kodu ar lietu, kuru tā īsti nevarēja uzprogrammēt L0.. Lai arī tās bija tikai 2 koda rindiņas, tas tomēr bija ķēpīgs darbs (pat, ja atcerējos to izdarīt).
Tātad, ja vēlamies pēc kārtas kompilēt vairākas programmas, tās vienu pēc otras nepieciešams pārsaukt minētajā vārdā, tad kompilēt uz C++, tad (iespējams) palabot C++ kodu, tad kompilēt uz .dll, tad atkal pārsaukt, tad pārsaukt sākotnējo programmu sākotnējā vārdā, tad pārsaukt nākamo kompilējamo programmu vajadzīgajā vārdā, atkārtojot visu procesu utt.. Varat iedomāties manu sajūsmu to katru reizi darīt..
Kļūstot vecākam un neiecietīgākam, reiz pienāca diena, kad manai pacietībai pienāca gals un es izlēmu darīt galu arī savām mocībām.. Tā kā vislielākā ķēpa bija ar visu programmu sinhronu izmaiņu ieviešanu kodā, tad izdomāju sākt tieši ar to.
Uzlabojums nr. 1 Izveidoju C++ programmiņu, kas, īsumā runājot, dara to, ka no mana pilnā kompilatora izveido visas pārējās 8 vajadzīgās programmas.. Pie kam gadījumā, kad pilnajā kompilatorā (un līdz ar to arī kādā no pārējām programmām) nāk klāt vai tiek dzēsta kāda procedūra vai funkcija, mana C++ programmiņa nav jālabo, jo datus par to, kādām procedūrām/funkcijām kurā programmā jābūt, tā iegūst no ārējas teksta datnes.. Problēma palika tikai ar to, kā automātiski izveidot arī katras programmas procedūru `main`, kas nav atrodama pilnajā kompilatorā, bet tā ātri vien tika atrisināta, izveidojot katrai programmai savu statisku teksta datni ar `main` procedūru tajā. Šobrīd tātad viss, kas ir jādara pēc labojumu veikšanas pilnajā kompilatorā, ir jāpalaiž viena .exe datne, kas izveido visas pārējās programmas. Taisnības labad gan jāpiemin, ka divās no šīm 8 izveidojamamām programmām pēc tam vēl ir manuāli jāaizkomentē dažas rindiņas, taču arī šī problēma ir novēršana un ieliekama tajā pat C++ programmā (tas tiks izdarīts, kolīdz atradīšu tam laiku). Sapriecājot tiktāl par savu radījumu, ka lēkāju uz augšu un leju apmēram 2 dienas!
Uzlabojums nr. 2 Nākamā ķēpīgākā lieta bija saistīta ar C++ koda labošanu pēc tā iegūšanas ar L0 kompilatora palīdzību. Lai no tā tiktu vaļā, bija nepieciešams kārtīgi izpētīt lietas, kas šādi tiek pieliktas klāt, un iespējas šīs lietas paveikt jau L0 līmenī. Pēc izpētes secināju, ka 2/3 no šīm lietām patiesībā varētu izdarīt arī L0, ja vien labi gribētu, bet atlikušo 1/3 varētu izdarīt L0, ja to gribētu ļoti labi.. Tā kā es to patiesībā gribēju izdarīt ļoti, ļoti, tad ķēros tam klāt.. Nācās izveidot vienu papildus funkciju C++ bibliotēkā, kas pārtrauc esošo transakciju, izsauc citu funkciju un pēc tam rada jaunu transakciju, un pēc tam izsaukt šo funkciju no L0. Pēc dažiem eksperimentiem viss aizgāja un nu vairs līst iekšā C++ nokompilētajā kodā nav nepieciešams :)
Uzlabojums nr. 3 Vēl joprojām palika lielā ņemšanās ar kompilācijas procesu - tas, ka jāveic daudz pārsaukšanas un kopēšanas, nebija uz labu. Izveidoju izsaucošajā vidē 9 izvēlnes punktus, katram no kuriem piesaistīju citu C++ funkciju. Katru no šīm funkcijām izveidoju tādu, lai tā, pirmkārt, izsauktu L0 kompilatoru, bet, otrkārt, izsauktu manis izveidotu jaunu .bat datni, kura izsauktu C++ kompilatoru un pēc tam pārsauktu rezultātā izveidoto .dll datni vajadzīgajā vārdā. Tātad katram izvēlnes punktam tagad bija sava C++ kompilācijas .bat datne, bet visiem viena L0 kompilācijas funkcija (jo šis kompilators nav manā pārziņā un tajā veikt labojumus nav man pa spēkam..). Rezultātā ieguvu situāciju, kad man abu kopilāciju rezultātā (tas ir - noklikšķinot uz viena izvēlnes punkta) izveidojas tieši tāda .dll datne, kāda nepieciešama.. Tiesa gan - vēl joprojām izejas L0 kodam jāatrodas fiksētajā teksta datnē, jo L0 kompilatoru es labot nespēju..
Uzlabojums nr. 4 Lai arī L0 kompilatoru labot nespēju, man nebija prātā vēl ienākusi doma par to, ka pie 3. uzlabojuma es varētu arī apstāties.. Nekā, tā vietā vērsos pie L0 kompilatora autora un pastāstīju viņam par sāvām problēmām. Rezultātā L0 kompilatorā tika iestrādātas papildus funkcijas, kuras tagad no savām C++ funkcijām varēju izsaukt - katram izvēlnes punktam savu. Un šobrīd ar vienu peles klikšķi uz viena izvēlnes punkta esmu spējīgs no vajadzīgās L0 programmas iegūt vajadzīgo .dll datni, kas manas ikdienas darbības atvieglo vismaz par kārtu..
Uzlabojums nr. 5 (plānots) Patiesībā, manu lasītāj, es Tevi visu laiku esmu maldinājis - manā pārraudzībā īstenībā ir nevis 9, bet gan 18 programmas.. Jā gan! Mums ir divi repozitoriji un katram no tiem ir vajadzīga katra no augstāk minētajām 9 programmām.. Tiesa gan, pa pāriem šīs programmas atšķiras tik vien kā ar divām koda rindiņām pašā sākumā.. Lai arī tik vien, tomēr reāli tas nozīmē, ka izmaiņu gadījumos man ir jāpārkompilē viena repozitorija 9 programmas, tad visās programmās jānomaina minētās 2 rindiņas un jāpārkompilē visas programmas otram repozitorijam. Tas tomēr ir kaitinoši, lai arī tehniski visās programmās atrodamas visas 4 rindiņas, tikai katrā gadījumā 2 no tām ir aizkomentētas.. Šajā sakarā arī plānots izdomāt kādu automatizācijas variantu..
Tā, lūk! Tā kā visu vairāk vai mazāk tagad jau esmu automatizējis, tad man atlika laika uzrakstīt šo teksta gabalu.. :)
P.S. Brīdinājums - teksts ir tikai uzrakstīts, nav vēl pārlasīts, tādējādi var saturēt kļūdas! Tiks pārlasīts brīvā brīdī! ir doma |