--
Azért kapta ezt az üzenetet, mert feliratkozott a Google Csoportok „compiler-seminar-budapest” csoportjára.
Az erről a csoportról és az ahhoz kapcsolódó e-mailekről való leiratkozáshoz küldjön egy e-amailt a(z) compiler-seminar-b...@googlegroups.com címre.
Ha szeretné megtekinteni ezt a beszélgetést az interneten, látogasson el ide: https://groups.google.com/d/msgid/compiler-seminar-budapest/gVZO8_GijEcZ5Ar1lJykRR-sJ2jTOZOok_n7UMh-QbEKkkN05R0HhM5s5VDhJIPSo895Hu6fF9h22p9o-dkFqs8QAh_eGS9pcmAmOzUqkoM%3D%40lendvai.name.
Ha szeretné megtekinteni ezt a beszélgetést az interneten, látogasson el ide: https://groups.google.com/d/msgid/compiler-seminar-budapest/CABmfui1T0X%3DuOhiUXF_qS6j_OaYn9JPWNaV-%3D-YznRvrm2oiWA%40mail.gmail.com.
Ha szeretné megtekinteni ezt a beszélgetést az interneten, látogasson el ide: https://groups.google.com/d/msgid/compiler-seminar-budapest/CAPRL4a3j_3SNXcb2GK4ZGjn%3DFCGZwObfjdB8j3mLdMd-37YxRw%40mail.gmail.com.
A dependency-s dolgot nem értem pontosan, hogy miért bonyolult.
Ha szeretné megtekinteni ezt a beszélgetést az interneten, látogasson el ide: https://groups.google.com/d/msgid/compiler-seminar-budapest/CAFHTskh%3DSX3tDXOsDrDwtRffyC6MnnuhAfaoJAqi7MH6aovVWw%40mail.gmail.com.
Na, nagy nehezen eljutottam oda, hogy az igen hosszú blog bejegyzést és a teljes beszélgetést (kivéve Lehel Gábor utolsó MS Research anyagát) elolvassam. Mivel a téma közel áll a szívemhez és állatira szeretnék írni valamit ebben a témában, szerettem volna hozzászólni.
A blog bejegyzés egész jól körbejárja a témát, de az alatta lévő Disqus diskurzus egy olvasó és a szerző közt is informatív. Magába a nyelvbe integrálni a build systemet szerintem sem éri meg. A turing teljesség (ahogy Meson dícséretesen tartózkodik tőle) kerülése segít abban, hogy a build definition (lettlégyen az bármilyen nyelvben) kizárólag a buildre szorítkozzon. Valóban elveszítünk sok mindent azzal, ha nem a nyelvünkbe integrálva, vagy azzal 100% kölcsönhatni képesen kapjuk meg a build systemet, de rengeteg problémától mentesítjük magunkat. Ahogy Horváth Gábor is mondta, production rendszerek több nyelvet használnak és ezeket valahogy közös nevezőre kell tudni hozni.
A blog szerzője szerintem pár dolgot nem vett figyelembe, amit Dani is érintett. Nekem nagyon úgy tűnt, mintha kizárólag disken lévő inputokban és outputokban gondolkozna. (Amikor a Gitet behozza, és a repo fájlnevei és a forrásban hivatkozott „#include”-ok közti megfeleltetésről beszél, ott is a fájlokat valószínűleg végsősoron diskről szedné, ami a később említett „cache”-eléssel érne el.) A tavaly előtti Lambda Days alkalmával volt egy elgondolkodtató előadás a build system vs. build server közti különbségekről. Az óriási előnye a build server megközelítésnek (amit Bazel is képvisel), hogy folyamatosan fut és tud state-et őrizni. Nem kell mindent diskről timestamp-eken alapján betölteni. Egy IDE vonatkozásában főleg óriási előnye van. Gondolok itt arra, ha a build definícióm le van írva, akkor az IDE hozzá tud fűzni taskokat ehhez a taskokból álló aciklikus gráfhoz, például IntelliSense taskokat. Ha megnyitok egy forrásfájlt, akkor hozzáfűzi az ahhoz tartozó IntelliSense feladatokat magas prioritással, elvégre az egy felhasználói kérés, egy exe linkelése várhat. A háttérben futhat statikus analízis és cachelődhet, de ha a felhasználó megnyomja a hozzá tartozó gombot, hogy most érdekli az eredmény, akkor prioritást vált. Mobilokon, Apple M1-en vagy új Intel procikon ahol Big.Little magok vannak a háttér feladatok priorizálhatók a kis magokra, GUI-ról kért feladatok a nagy magokra kerülnének, ilyesmi.
A build szerver előnye még, hogy memóriában meg tud tartani olyan adatokat, amiket így nem kell diskről töltögetni folyton. C++ esetében elég bonyolult és erőforrás igényes a preprocess, de akár már a parse-olás is. (Kedvenc adalékom C++ parse-olás szörnyűségeihez az a szörnyű tény, hogy C++ parse-olásához ki kell értékelni / futtatni kell a kódot magát, sokszor akár back-track jelleggel.) A fordításhoz, az IntelliSense-hez, a statikus kód analízishez, Clang tidyhoz, code coverage-hez, stb. mind-mind el kell végezni bizonyos lépéseket, amit ezer és egyszer elvégez minden tool, mert minden két hívás között elfelejt mindent. De mekkora lenne már, ha van egy toolchain-em, amiknek a darabjai beszélik egymás nyelvét, akkor tetszőleges köztes adatstruktúrát meg tudna jegyezni, hogy a többi eszköz újrahasználja. Ez MSVC esetében IPR/XPR lenne (Internal Program Representation a fordító belső állapota, XPR a szerializált formája), Clang esetében nem tudom mi a belső és a szerializált eredménye a parse-nak... De mondhatnám ugyanezt XML-re, ahol EXI a szerializált eredménye a parse-nak, stb.
Végső soron a Mesonhoz hasonló, nem-Turing teljes megközelítést kéne követni, Bazel-szerűen nem szigorúan szétválasztva a configure és fordítás lépéseit (egy taskról végrehajtás nélkül nem feltétlen derül ki hány child taskja van), build2-höz hasonlóan a fordításon túlmutatóan tesztelésre és CI-ra is kiterjedően, értelmes IDE integrációt lehetővé tevő módon, MSBuild-hez hasonlóan programmatikusan/CLI/GUI front-enddel egyaránt kellene egy normális build system. Nem lehetetlen (nem is könnyű), csak össze kellene ollózni mindenhonnan a jó dolgokat. Pár momentumot felvillantottam az okfejtésben, és a téma indító blog bejegyzés jó gondolatébresztő a témához és lesz is amit meg kell rágni belőle. (Bár szerintem 1:1-ben gyakorlatban nem használható.)
Elég sokat agyaltam már rajta, hogyan kellene nekiállni egy ilyen dolognak, milyen technológiákat lehetne használni útközben (bár a requirementek fontosabbak, mint a megvalósításhoz használt konkrét eszközök) és végső soron mit kéne tudnia. A legeslegfontosabb a bővíthetőség, hogy a build system csak az építőköveket definiálja, amivel aztán belátható munkával lehessen fordítási modellt definiálni és hozzá toolchaineket, akár olyan bonyolultakat is mint az LLVM eszközcsalád. Egy faék egyszerű .plt fájlból .svg/.png/.jpg/… be GnuPlottal fordító egy lépcsős toolchaint viszont egy majom is össze tudjon rakni. Productionben tényleg nagyon sok technológia kavarodik: C/C++, Doxygen, Sphinx, LaTeX, CUDA/HIP, GLSL (glslang), Python, GI typelib, stb. a lista végtelen és kimeríthetetlen. Toolchain definíciónál le kellene szokni a mindent process isolationben futtatásról, mert úgy tényleg csak disken keresztül lehet kommunikálni, ami halál fölösleges. Kényelmes, de erőforrás pazarló.
Feladó: Gábor Lehel
Elküldve: 2021. március 2., kedd 11:28
Címzett: Kéri Kálmán
Másolatot kap: Daniel Berenyi; Gábor Horváth; Attila Lendvai; compiler-seminar-budapest
Tárgy: Re: build systems
Ha szeretné megtekinteni ezt a beszélgetést az interneten, látogasson el ide: https://groups.google.com/d/msgid/compiler-seminar-budapest/CAFCmug_aDbAhoZD1yaFsOPopw6fMJiE3yiW19pQHz5Y1sdmMqA%40mail.gmail.com.