Kuka tahansa, jolta kysyt, miten ohjelmisto rakennetaan oikein, tulee olemaan yksi vastauksista Make. GNU / Linux-järjestelmissä GNU Make [1] on avoimen lähdekoodin versio alkuperäisestä Makeista, joka julkaistiin yli 40 vuotta sitten - vuonna 1976. Tee töitä Makefile-tiedostolla - tällä nimellä strukturoidulla tekstitiedostolla, joka voidaan parhaiten kuvata ohjelmiston rakennusprosessin rakennusoppaaksi. Makefile sisältää useita tarroja (kutsutaan kohteiksi) ja erityiset ohjeet, jotka on suoritettava kunkin kohteen rakentamiseksi.
Yksinkertaisesti sanottuna Make on rakennustyökalu. Se noudattaa Makefile-tehtävien reseptiä. Sen avulla voit toistaa vaiheet automatisoidusti sen sijaan, että kirjoittaisit ne päätelaitteeseen (ja todennäköisesti tekisit virheitä kirjoittaessasi).
Luettelossa 1 on esimerkki Makefilesta, jossa on kaksi kohdetta "e1" ja "e2" sekä kaksi erityistavoitetta "kaikki" ja "puhdas".”Make e1: n suorittaminen suorittaa kohteen” e1 ”ohjeet ja luo tyhjän tiedoston. Make e2: n suorittaminen tekee saman kohdealueelle e2 ja luo kaksi tyhjää tiedostoa. Kutsu "tee kaikki" suorittaa ohjeet kohteelle e1 ensin ja e2 seuraavaksi. Jos haluat poistaa aiemmin luodut tiedostot yksi ja kaksi, suorita puhelu "puhdista.”
Listaus 1
kaikki: e1 e2e1:
kosketa yhtä
e2:
kosketa kahta
puhdas:
rm yksi kaksi
Juokseva merkki
Yleinen tapaus on, että kirjoitat Makefileesi ja suoritat sitten komennon "make" tai "make all" rakentaaksesi ohjelmiston ja sen komponentit. Kaikki kohteet on rakennettu sarjajärjestyksessä ilman rinnakkaistamista. Kokonaisrakennusaika on summa, joka tarvitaan jokaisen kohteen rakentamiseen.
Tämä lähestymistapa toimii hyvin pienissä projekteissa, mutta kestää melko kauan keskisuurissa ja suurissa projekteissa. Tämä lähestymistapa ei ole enää ajan tasalla, koska suurin osa nykyisistä prosessoreista on varustettu useammalla kuin yhdellä ytimellä ja mahdollistaa useamman kuin yhden prosessin suorittamisen kerrallaan. Nämä ajatukset mielessä tarkastelemme, voidaanko rakennusprosessia rinnastaa. Tavoitteena on yksinkertaisesti lyhentää rakennusaikaa.
Tee parannuksia
Meillä on muutama vaihtoehto - 1) yksinkertaistamme koodia, 2) jaamme yksittäiset tehtävät eri laskennan solmuihin, rakennamme koodin sinne ja kerätään tulos sieltä, 3) rakennetaan koodi rinnakkain yhteen koneeseen 4) yhdistää vaihtoehdot 2 ja 3.
Vaihtoehto 1) ei ole aina helppoa. Se vaatii tahtoa analysoida toteutetun algoritmin ajonaikaa ja tietoa kääntäjästä, ts.e., kuinka kääntäjä kääntää ohjelmointikielen ohjeet prosessorin ohjeiksi.
Vaihtoehto 2) vaatii pääsyn muihin laskennasolmuihin, esimerkiksi omistettuihin tietokonesolmuihin, käyttämättömiin tai vähemmän käytettyihin koneisiin, virtuaalikoneisiin pilvipalveluista, kuten AWS, tai vuokrattuun laskentatehoon palveluista, kuten LoadTeam [5]. Todellisuudessa tätä lähestymistapaa käytetään ohjelmistopakettien rakentamiseen. Debian GNU / Linux käyttää ns. Autobuilder-verkkoa [17] ja RedHat / Fedors Kojia [18]. Google kutsuu järjestelmäänsä BuildRabbitiksi, ja Aysylu Greenberg selittää sen puheessa täydellisesti [16]. distcc [2] on ns. hajautettu C-kääntäjä, jonka avulla voit kääntää koodia eri solmuihin rinnakkain ja luoda oman koontijärjestelmän.
Vaihtoehto 3 käyttää rinnakkaistamista paikallistasolla. Tämä voi olla vaihtoehto, jolla on paras kustannus-hyötysuhde sinulle, koska se ei vaadi lisälaitteita, kuten vaihtoehdossa 2. Vaatimus suorittaa Make rinnakkain on lisätä -j-vaihtoehto puheluun (lyhenne sanoista -jobs). Tämä määrittää samanaikaisesti suoritettavien töiden määrän. Alla olevassa luettelossa pyydetään Make suorittamaan 4 työpaikkaa samanaikaisesti:
Listaus 2
$ make --jobs = 4Amdahlin lain [23] mukaan tämä lyhentää rakennusaikaa lähes 50%. Muista, että tämä lähestymistapa toimii hyvin, jos yksittäiset tavoitteet eivät ole riippuvaisia toisistaan; esimerkiksi tavoitteen 5 lähtöä ei vaadita kohteen 3 rakentamiseen.
On kuitenkin yksi sivuvaikutus: jokaisen Make-kohteen tilaviestien lähtö näyttää mielivaltaiselta, eikä niitä voida enää osoittaa selvästi kohteelle. Lähtötilaus riippuu työn suorittamisen todellisesta järjestyksestä.
Määritä Suorita suoritusjärjestys
Onko olemassa lausuntoja, jotka auttavat tekemään ymmärtämään, mitkä kohteet riippuvat toisistaan? Joo! Listan 3 Makefile-esimerkki sanoo tämän:
* rakentaaksesi kohteen "kaikki", suorita ohjeet malleille e1, e2 ja e3
* kohde e2 edellyttää, että kohde e3 on rakennettu aiemmin
Tämä tarkoittaa, että kohteet e1 ja e3 voidaan rakentaa rinnan ensin, sitten e2 seuraa heti kun e3: n rakennus on valmis.
Listaus 3
kaikki: e1 e2 e3e1:
kosketa yhtä
e2: e3
kosketa kahta
e3:
kosketa kolmea
puhdas:
rm yksi kaksi kolme
Visualisoi Tee riippuvuuksia
Makefile2graph [19] -projektin fiksu työkalu make2graph visualisoi Make-riippuvuudet suuntautuneena asyklisenä kaaviona. Tämä auttaa ymmärtämään, miten eri kohteet riippuvat toisistaan. Make2graph antaa pisteformaatissa kuvaajan kuvaukset, jotka voit muuntaa PNG-kuviksi käyttämällä Graphviz-projektin pistekomentoa [22]. Puhelu on seuraava:
Listaus 4
$ tee kaikki -Bnd | make2graph | piste -Tpng -o-kaavio.pngEnsinnäkin Makea kutsutaan kohteella "kaikki", jota seuraa vaihtoehdot "-B" kaikkien tavoitteiden rakentamiseksi ehdoitta, "-n" (lyhenne sanoista "-dry-run") teeskentelemään ohjeiden suorittamista kohdekohtaisesti ja " -d ”(“ -debug ”) näyttää virheenkorjaustiedot. Lähtö johdetaan malliin make2graph, joka johtaa tuotoksen pisteeseen, joka luo kuvatiedostokaavion.png PNG-muodossa.
Luettelon 3 rakennusriippuvuuskaavio
Lisää kääntäjiä ja koontijärjestelmiä
Kuten jo edellä selitettiin, Make kehitettiin yli neljä vuosikymmentä sitten. Vuosien mittaan työpaikkojen suorittaminen rinnakkain on tullut yhä tärkeämmäksi, ja korkeamman rinnakkaisuuden saavuttamiseksi erityisesti suunniteltujen kääntäjien ja rakennusjärjestelmien määrä on kasvanut siitä lähtien. Työkalujen luettelo sisältää nämä:
- Bazel [20]
- CMake [4]: lyhentää alustojen välistä merkkiä ja luo kuvaustiedostot, joita Mak käyttää myöhemmin
- valmistaa [12]
- Hajautettu merkkijärjestelmä (DMS) [10] (näyttää olevan kuollut)
- dmake [13]
- LSF-merkki [15]
- Apache Maven
- Meson
- Ninja-rakennus
- NMake [6]: Tee Microsoft Visual Studiolle
- PyDoit [8]
- Qmake [11]
- tee uudelleen [14]
- SCONit [7]
- Waf [9]
Suurin osa niistä on suunniteltu rinnakkaistamista silmällä pitäen ja tarjoavat paremman tuloksen rakennusajan suhteen kuin Make.
Johtopäätös
Kuten olet nähnyt, kannattaa miettiä rinnakkaisia koontiversioita, koska se vähentää rakennusaikaa merkittävästi tietylle tasolle. Silti sitä ei ole helppo saavuttaa, ja siihen liittyy tiettyjä karhuja [3]. On suositeltavaa analysoida sekä koodi että sen koontirata ennen siirtymistä rinnakkaisiin koontiversioihin.
Linkit ja viitteet
- [1] GNU Make Manual: Suorituskyky, https: // www.gnu.org / software / make / manual / html_node / Rinnakkainen.html
- [2] distcc: https: // github.com / distcc / distcc
- [3] John Graham-Cumming: GNU: n sudenkuopat ja edut tekevät rinnakkaisuudesta, https: // www.cmcrossroads.com / article / sudenkuoppia ja hyötyjä-gnu-make-rinnakkaistaminen
- [4] CMake, https: // cmake.org /
- [5] LoadTeam, https: // www.loadteam.fi /
- [6] NMake, https: // docs.Microsoft.fi / fi-us / cpp / build / reference / nmake-reference?näkymä = msvc-160
- [7] SCons, https: // www.scons.org /
- [8] PyDoit, https: // pydoit.org /
- [9] Waf, https: // gitlab.fi / ita1024 / waf /
- [10] Hajautettu merkkijärjestelmä (DMS), http: // www.nongnu.org / dms / index.html
- [11] Qmake, https: // asiak.qt.io / qt-5 / qmake-manual.html
- [12] distmake, https: // sourceforge.net / projektit / distmake /
- [13] dmake, https: // docs.oraakkeli.fi / cd / E19422-01 / 819-3697 / dmake.html
- [14] tee uudelleen, https: // tee uudelleen.readthedocs.io / fi / uusin /
- [15] LSF-merkki, http: // sunray2.mit.edu / kits / platform-lsf / 7.0.6/1 / oppaat / kit_lsf_guide_source / print / lsf_make.pdf
- [16] Aysylu Greenberg: Hajautetun koontijärjestelmän rakentaminen Google Scalessa, GoTo Conference 2016, https: // gotocon.fi / dl / goto-chicago-2016 / diat / AysyluGreenberg_BuildingADistributedBuildSystemAtGoogleScale.pdf
- [17] Debianin rakennusjärjestelmä, Autobuilder-verkko, https: // www.debian.org / devel / buildd / index.en.html
- [18] koji - RPM-rakennus- ja seurantajärjestelmä, https: // pagure.io / koji /
- [19] makefile2graph, https: // github.fi / lindenb / makefile2graph
- [20] Bazel, https: // bazel.rakentaa/
- [21] Makefile-opetusohjelma, https: // makefiletutorial.fi /
- [22] Graphviz, http: // www.graphviz.org
- [23] Amdahlin laki, Wikipedia, https: // en.wikipedia.org / wiki / Amdahl% 27s_law