Kiekvienas, kurio paklausite, kaip tinkamai sukurti programinę įrangą, pateiks „Make“ kaip vieną iš atsakymų. GNU / Linux sistemose „GNU Make“ [1] yra originalaus „Make“, kuris buvo išleistas daugiau nei prieš 40 metų - 1976 m., Atvirojo kodo versija. Kurkite darbus naudodami „Makefile“ - struktūrizuotą paprasto teksto failą tokiu pavadinimu, kurį geriausiai galima apibūdinti kaip programinės įrangos kūrimo proceso statybos vadovą. „Makefile“ yra daugybė etikečių (vadinamų taikiniais) ir konkrečios instrukcijos, kurias reikia atlikti kuriant kiekvieną tikslą.
Paprasčiau tariant, „Make“ yra kūrimo įrankis. Tai seka „Makefile“ užduočių receptu. Tai leidžia pakartoti veiksmus automatizuotai, o ne įvesti juos į terminalą (ir tikriausiai suklysti rašant).
1 sąraše pateikiamas „Makefile“ pavyzdys su dviem tikslais „e1“ ir „e2“, taip pat dviem specialiaisiais tikslais „visi“ ir „švarus“.„Vykdydami„ make e1 “, įvykdomos„ e1 “tikslo instrukcijos ir sukuriamas tuščias failas. Paleidus „make e2“, tas pats padaromas tikslui „e2“ ir sukuriant tuščią failą du. Skambučiu „padaryti viską“ vykdomos instrukcijos, skirtos tikslui e1 pirmiausia ir paskui e2. Norėdami pašalinti anksčiau sukurtus pirmąjį ir antrąjį failus, tiesiog atlikite skambutį „make clean.“
1 sąrašas
visi: e1 e2e1:
palieskite vieną
e2:
palieskite du
švarus:
rm vienas du
Bėgantis „Make“
Dažnas atvejis yra tas, kad jūs parašote savo „Makefile“ ir tada tiesiog paleiskite komandą „make“ arba „make all“, kad sukurtumėte programinę įrangą ir jos komponentus. Visi taikiniai yra pastatyti eilės tvarka ir be jokių lygiagrečių. Bendras kūrimo laikas yra laiko suma, reikalinga kiekvienam tikslui sukurti.
Šis metodas tinka mažiems projektams, tačiau vidutinių ir didesnių projektų atveju jis trunka gana ilgai. Šis metodas nebėra atnaujintas, nes daugumoje dabartinių procesorių yra daugiau nei vienas branduolys ir leidžia vienu metu vykdyti daugiau nei vieną procesą. Atsižvelgdami į šias idėjas, mes žvelgiame į tai, ar ir kaip galima sukonstruoti kūrimo procesą. Tikslas yra tiesiog sutrumpinti kūrimo laiką.
Padarykite patobulinimus
Yra keletas variantų, kuriuos mes turime: 1) supaprastinti kodą, 2) paskirstyti atskiras užduotis į skirtingus skaičiavimo mazgus, sukurti kodą ten ir surinkti rezultatą iš ten, 3) lygiagrečiai kurti kodą vienoje mašinoje ir 4) sujungti 2 ir 3 variantus.
1 variantas) ne visada lengva. Tam reikia valios išanalizuoti įdiegto algoritmo vykdymo laiką ir žinių apie kompiliatorių, t.e., kaip kompiliatorius programavimo kalba paverčia instrukcijas procesoriaus instrukcijomis.
2 variantas) reikalinga prieiga prie kitų skaičiavimo mazgų, pavyzdžiui, paskirtų skaičiavimo mazgų, nenaudojamų ar mažiau naudotų mašinų, virtualių mašinų iš debesijos paslaugų, pvz., AWS, arba nuomojamos skaičiavimo galios iš tokių paslaugų kaip „LoadTeam“ [5]. Iš tikrųjų šis metodas naudojamas kuriant programinės įrangos paketus. „Debian GNU / Linux“ naudoja vadinamąjį „Autobuilder“ tinklą [17], o „RedHat“ / „Fedors“ - „Koji“ [18]. „Google“ vadina savo sistemą „BuildRabbit“ ir tai puikiai paaiškina Aysylu Greenberg pokalbyje [16]. distcc [2] yra vadinamasis paskirstytasis C kompiliatorius, leidžiantis lygiagrečiai sukompiliuoti kodą įvairiuose mazguose ir sukurti savo sukūrimo sistemą.
3 variante lygiagretinimas naudojamas vietiniu lygiu. Tai gali būti variantas, kurio kainos ir naudos santykis yra geriausias, nes tam nereikia papildomos aparatūros, kaip nurodyta 2 variante. Reikalavimas paleisti „Make“ lygiagrečiai yra skambučio pridėjimas -j (trumpinys -jobs). Tai nurodo vienu metu vykdomų darbų skaičių. Žemiau pateiktame sąraše prašoma „Make“ atlikti lygiagrečiai 4 darbus:
2 sąrašas
$ make --jobs = 4Pagal Amdahlio įstatymą [23] tai sutrumpins kūrimo laiką beveik 50%. Atminkite, kad šis metodas veikia gerai, jei pavieniai tikslai nepriklauso vienas nuo kito; pavyzdžiui, 5 tikslo išvesties nereikia norint sukurti 3 tikslą.
Tačiau yra vienas šalutinis poveikis: kiekvieno „Make“ taikinio būsenos pranešimų išvestis atrodo savavališkai ir jų nebegalima aiškiai priskirti taikiniui. Išvesties tvarka priklauso nuo faktinės darbo vykdymo tvarkos.
Apibrėžkite „Make Execution Order“
Ar yra teiginių, padedančių suprasti, kurie taikiniai priklauso vienas nuo kito? Taip! 3 sąrašo „Makefile“ pavyzdys sako:
* norėdami sukurti tikslą „visi“, vykdykite e1, e2 ir e3 instrukcijas
* Tikslas e2 reikalauja, kad tikslas e3 būtų sukurtas anksčiau
Tai reiškia, kad tikslai e1 ir e3 gali būti pastatyti lygiagrečiai, pirmiausia, tada e2 seka, kai tik baigiama statyti e3, galiausiai.
3 sąrašas
visi: e1 e2 e3e1:
palieskite vieną
e2: e3
palieskite du
e3:
palieskite tris
švarus:
rm vienas du trys
Vizualizuokite „Make Dependencies“
Protingas įrankis „make2graph“ iš „makefile2graph“ [19] projekto vizualizuoja „Make“ priklausomybes kaip nukreiptą aciklinį grafiką. Tai padeda suprasti, kaip skirtingi taikiniai priklauso vienas nuo kito. „Make2graph“ pateikia taškų formato grafiko aprašymus, kuriuos galite transformuoti į PNG vaizdą naudodami taško komandą iš „Graphviz“ projekto [22]. Skambinama taip:
4 sąrašas
$ padaryti viską -Bnd | make2graph | taškas -Tpng -o grafikas.pngPirma, „Make“ iškviečiamas su tikslu „visi“, po kurio pateikiamos parinktys „-B“, kad būtų galima besąlygiškai pastatyti visus taikinius, „-n“ (sutrumpintai reiškia „-dry-run“) apsimetinėti vykdančiu nurodymus pagal tikslą ir „ -d “(„ -debug “), kad būtų rodoma derinimo informacija. Išvestis perduodama į „make2graph“, kuri išvestį į tašką paverčia vaizdo failo grafiku.png PNG formatu.
3 sąrašo sukūrimo priklausomybės grafikas
Daugiau kompiliatorių ir komponavimo sistemų
Kaip jau paaiškinta aukščiau, „Make“ buvo sukurta daugiau nei prieš keturis dešimtmečius. Bėgant metams, lygiagrečiai atlikti darbus tapo vis svarbiau, o nuo to laiko specialiai sukurtų kompiliatorių ir sukurtų sistemų skaičius siekiant aukštesnio lygiagretumo lygio. Įrankių sąraše yra šie:
- Bazelis [20]
- CMake [4]: sutrumpina „cross-platform Make“ ir sukuria aprašymo failus, kuriuos vėliau naudoja „Make“
- distmake [12]
- Paskirstyta gamintojo sistema (DMS) [10] (atrodo, kad negyva)
- dmake [13]
- LSF gamintojas [15]
- Apache Mavenas
- Mesonas
- „Ninja Build“
- „NMake“ [6]: sukurkite „Microsoft Visual Studio“
- PyDoit [8]
- Qmake [11]
- perdaryti [14]
- Taškai [7]
- Vafas [9]
Dauguma jų buvo suprojektuoti atsižvelgiant į lygiagretumą ir siūlo geresnį rezultatą atsižvelgiant į sukūrimo laiką nei „Make“.
Išvada
Kaip matėte, verta pagalvoti apie lygiagretus kūrimus, nes tai žymiai sumažina kūrimo laiką iki tam tikro lygio. Vis dėlto tai pasiekti nėra lengva ir kyla tam tikrų spąstų [3]. Prieš pereinant prie lygiagrečių versijų, rekomenduojama išanalizuoti kodą ir jo sukūrimo kelią.
Nuorodos ir nuorodos
- [1] GNU „Make Manual“: lygiagretus vykdymas, https: // www.gnu.org / software / make / manual / html_node / Parallel.HTML
- [2] distcc: https: // github.com / distcc / distcc
- [3] Johnas Grahamas-Cummingas: GNU spąstai ir pranašumai daro lygiagretumą, https: // www.cmcrossroads.com / article / spąstai-ir-naudos-gnu-make-lygiagretinimas
- [4] CMake, https: // cmake.org /
- [5] „LoadTeam“, https: // www.„loadteam“.com /
- [6] NMake, https: // docs.„Microsoft“.com / lt-us / cpp / build / reference / nmake-reference?rodinys = msvc-160
- [7] Piktogramos, https: // www.scons.org /
- [8] PyDoit, https: // pydoit.org /
- [9] Waf, https: // gitlab.com / ita1024 / waf /
- [10] Distributed Make System (DMS), http: // www.nongnu.org / dms / index.HTML
- [11] Qmake, https: // doc.qt.io / qt-5 / qmake-manual.HTML
- [12] distmake, https: // sourceforge.net / projektai / distmake /
- [13] dmake, https: // docs.orakulas.com / cd / E19422-01 / 819-3697 / dmake.HTML
- [14] perdaryti, https: // perdaryti.skaityti dokumentai.io / lt / naujausias /
- [15] LSF gamintojas, http: // sunray2.mit.edu / kits / platform-lsf / 7.0.6/1 / guides / kit_lsf_guide_source / print / lsf_make.pdf
- [16] Aysylu Greenberg: „Distributed Build“ sistemos kūrimas „Google Scale“, „GoTo Conference 2016“, https: // gotocon.com / dl / goto-chicago-2016 / slides / AysyluGreenberg_BuildingADistributedBuildSystemAtGoogleScale.pdf
- [17] „Debian Build“ sistema, „Autobuilder“ tinklas, https: // www.debianas.org / devel / buildd / index.lt.HTML
- [18] koji - RPM kūrimo ir stebėjimo sistema, https: // pagure.io / koji /
- [19] makefile2graph, https: // github.com / lindenb / makefile2graph
- [20] Bazelis, https: // bazel.statyti /
- [21] „Makefile“ mokymo programa, https: // makefiletutorial.com /
- [22] „Graphviz“, http: // www.graphviz.org
- [23] Amdahlio įstatymas, Vikipedija, https: // en.vikipedija.org / wiki / Amdahl% 27s_law