Sesiapa yang anda bertanya bagaimana membina perisian dengan betul akan hadir sebagai Make sebagai salah satu jawapan. Pada sistem GNU / Linux, GNU Make [1] adalah versi Open-Source dari Make asli yang dilancarkan lebih dari 40 tahun yang lalu - pada tahun 1976. Membuat karya dengan Makefile - fail teks biasa berstruktur dengan nama itu yang dapat digambarkan sebagai manual pembinaan untuk proses pembinaan perisian. Makefile mengandungi sejumlah label (disebut sasaran) dan arahan khusus yang perlu dilaksanakan untuk membangun setiap sasaran.
Secara ringkas, Make adalah alat binaan. Ia mengikuti resipi tugas dari Makefile. Ini membolehkan anda mengulangi langkah-langkah secara automatik daripada menaipnya di terminal (dan mungkin membuat kesilapan semasa menaip).
Penyenaraian 1 menunjukkan contoh Makefile dengan dua sasaran "e1" dan "e2" serta dua sasaran khas "semua" dan "bersih."Menjalankan" buat e1 "melaksanakan arahan untuk sasaran" e1 "dan membuat satu fail kosong. Menjalankan "make e2" melakukan hal yang sama untuk target "e2" dan membuat fail kosong dua. Panggilan "buat semua" melaksanakan arahan untuk sasaran e1 terlebih dahulu dan e2 seterusnya. Untuk membuang fail satu dan dua yang telah dibuat sebelumnya, cukup jalankan panggilan “make clean."
Penyenaraian 1
semua: e1 e2e1:
sentuh satu
e2:
sentuh dua
bersih:
rm satu dua
Menjalankan Membuat
Kes yang biasa berlaku ialah anda menulis Makefile anda dan kemudian menjalankan perintah "make" atau "make all" untuk membina perisian dan komponennya. Semua sasaran dibina mengikut urutan bersiri dan tanpa selari. Jumlah masa pembinaan adalah jumlah masa yang diperlukan untuk membina setiap sasaran.
Pendekatan ini berfungsi dengan baik untuk projek kecil tetapi memerlukan masa yang lama untuk projek sederhana dan besar. Pendekatan ini tidak lagi terkini kerana kebanyakan cpus semasa dilengkapi dengan lebih daripada satu teras dan memungkinkan pelaksanaan lebih dari satu proses pada satu masa. Dengan idea-idea ini, kita melihat sama ada dan bagaimana proses membina dapat diselaraskan. Tujuannya hanyalah untuk mengurangkan masa pembinaan.
Buat Penambahbaikan
Terdapat beberapa pilihan yang kami ada - 1) mempermudah kod, 2) menyebarkan tugas tunggal ke node pengkomputeran yang berbeza, membina kod di sana, dan mengumpulkan hasil dari sana, 3) membina kod secara selari pada satu mesin, dan 4) gabungkan pilihan 2 dan 3.
Pilihan 1) tidak selalu mudah. Ia memerlukan kehendak untuk menganalisis jangka masa algoritma yang dilaksanakan dan pengetahuan mengenai penyusunnya, i.e., bagaimana penyusun menerjemahkan arahan dalam bahasa pengaturcaraan menjadi arahan pemproses.
Pilihan 2) memerlukan akses ke node pengkomputeran lain, misalnya, node pengkomputeran khusus, mesin yang tidak digunakan atau kurang digunakan, mesin maya dari perkhidmatan awan seperti AWS, atau kuasa pengkomputeran yang disewa dari perkhidmatan seperti LoadTeam [5]. Pada hakikatnya, pendekatan ini digunakan untuk membina pakej perisian. Debian GNU / Linux menggunakan rangkaian Autobuilder yang disebut [17], dan RedHat / Fedors menggunakan Koji [18]. Google memanggil sistemnya BuildRabbit dan dijelaskan dengan sempurna dalam ceramah oleh Aysylu Greenberg [16]. distcc [2] adalah penyusun C yang disebut diedarkan yang membolehkan anda menyusun kod pada nod yang berlainan secara selari dan menyiapkan sistem binaan anda sendiri.
Pilihan 3 menggunakan paralelisasi di peringkat tempatan. Ini mungkin pilihan dengan nisbah kos-manfaat terbaik untuk anda, kerana ia tidak memerlukan perkakasan tambahan seperti dalam pilihan 2. Syarat untuk menjalankan Make secara selari adalah menambah pilihan -j dalam panggilan (pendek untuk-pekerjaan). Ini menentukan jumlah pekerjaan yang dijalankan pada masa yang sama. Senarai di bawah meminta untuk membuat 4 pekerjaan selari:
Penyenaraian 2
$ buat --jobs = 4Menurut undang-undang Amdahl [23], ini akan mengurangkan masa pembinaan hampir 50%. Perlu diingat bahawa pendekatan ini berfungsi dengan baik jika sasaran tunggal tidak bergantung antara satu sama lain; sebagai contoh, output sasaran 5 tidak diperlukan untuk membina sasaran 3.
Namun, ada satu kesan sampingan: output dari pesan status untuk setiap sasaran Buat kelihatan sewenang-wenang, dan ini tidak lagi dapat ditetapkan dengan jelas ke sasaran. Urutan output bergantung pada urutan sebenar pelaksanaan pekerjaan.
Tentukan Membuat Perintah Pelaksanaan
Adakah terdapat pernyataan yang membantu Membuat memahami sasaran yang saling bergantung antara satu sama lain? Ya! Contoh Makefile dalam Penyenaraian 3 mengatakan ini:
* untuk membina sasaran "semua", jalankan arahan untuk e1, e2, dan e3
* target e2 memerlukan sasaran e3 dibina sebelumnya
Ini bermaksud bahawa sasaran e1 dan e3 dapat dibina secara selari, pertama, kemudian e2 mengikuti sebaik sahaja pembinaan e3 selesai, akhirnya.
Penyenaraian 3
semua: e1 e2 e3e1:
sentuh satu
e2: e3
sentuh dua
e3:
sentuh tiga
bersih:
rm satu dua tiga
Bayangkan Membuat Tanggungan
Alat make2graph yang bijak dari projek makefile2graph [19] memvisualisasikan Make dependencies sebagai graf asiklik terarah. Ini membantu memahami bagaimana pelbagai sasaran bergantung antara satu sama lain. Make2graph mengeluarkan deskripsi grafik dalam format titik yang anda boleh ubah menjadi gambar PNG menggunakan arahan titik dari projek Graphviz [22]. Panggilannya adalah seperti berikut:
Penyenaraian 4
$ buat semua -Bnd | buat2graph | dot -Tpng -o grafik.pngPertama, Make dipanggil dengan target "semua" diikuti dengan pilihan "-B" untuk membangun semua target tanpa syarat, "-n" (singkatan dari "-dry-run") untuk berpura-pura menjalankan petunjuk per sasaran, dan " -d "(" -debug ") untuk memaparkan maklumat debug. Output disalurkan untuk membuat2graph yang menyalurkan outputnya ke titik yang menghasilkan grafik fail gambar.png dalam format PNG.
Graf kebergantungan binaan untuk senarai 3
Lebih Banyak Penyusun dan Sistem Binaan
Seperti yang telah dijelaskan di atas, Make dikembangkan lebih dari empat dekad yang lalu. Selama bertahun-tahun, melaksanakan pekerjaan secara selari menjadi semakin penting, dan bilangan penyusun dan sistem binaan yang direka khas untuk mencapai tahap paralelisasi yang lebih tinggi telah meningkat sejak itu. Senarai alat merangkumi:
- Bazel [20]
- CMake [4]: singkatan Buat merentas platform dan membuat fail penerangan yang kemudian digunakan oleh Make
- penyebaran [12]
- Sistem Buat Teragih (DMS) [10] (nampaknya sudah mati)
- buat [13]
- LSF Buat [15]
- Apache Maven
- Meson
- Ninja Build
- NMake [6]: Buat untuk Microsoft Visual Studio
- PyDoit [8]
- Qmake [11]
- buat semula [14]
- SCON [7]
- Waf [9]
Sebilangan besar daripadanya telah dirancang dengan mempertimbangkan paralelisasi dan memberikan hasil yang lebih baik mengenai masa membina daripada Membuat.
Kesimpulannya
Seperti yang anda lihat, perlu difikirkan binaan selari kerana ia mengurangkan masa binaan sehingga tahap tertentu. Namun, tidak mudah dicapai dan dilengkapi dengan perangkap tertentu [3]. Dianjurkan untuk menganalisis kod anda dan jalan binaannya sebelum melangkah ke binaan selari.
Pautan dan Rujukan
- [1] GNU Membuat Manual: Pelaksanaan Selari, https: // www.gnu.org / perisian / buat / manual / html_node / Selari.html
- [2] distcc: https: // github.com / distcc / distcc
- [3] John Graham-Cumming: Perangkap dan Faedah GNU Membuat Paralelisasi, https: // www.cmcrossroads.com / artikel / perangkap-dan-faedah-gnu-buat-selari
- [4] CMake, https: // cmake.org /
- [5] LoadTeam, https: // www.muatan.com /
- [6] NMake, https: // dokumen.microsoft.com / en-us / cpp / build / rujukan / nmake-rujukan?pandangan = msvc-160
- [7] SCON, https: // www.scon.org /
- [8] PyDoit, https: // pydoit.org /
- [9] Waf, https: // gitlab.com / ita1024 / waf /
- [10] Sistem Membuat Teragih (DMS), http: // www.nongnu.org / dms / indeks.html
- [11] Qmake, https: // doc.qt.io / qt-5 / qmake-manual.html
- [12] distmake, https: // sourceforge.bersih / projek / penyebaran /
- [13] buat, https: // dokumen.oracle.com / cd / E19422-01 / 819-3697 / dmake.html
- [14] buat semula, https: // buat semula.readthedocs.io / en / terkini /
- [15] LSF Make, http: // sunray2.mit.edu / kit / platform-lsf / 7.0.6/1 / panduan / kit_lsf_guide_source / print / lsf_make.pdf
- [16] Aysylu Greenberg: Membangun Sistem Binaan Teragih di Skala Google, Persidangan GoTo 2016, https: // gotocon.com / dl / goto-chicago-2016 / slaid / AysyluGreenberg_BuildingADistribusiBuildSystemAtGoogleSkala.pdf
- [17] Debian Build System, Autobuilder network, https: // www.debian.org / devel / buildd / index.en.html
- [18] koji - RPM bangunan dan sistem penjejakan, https: // pagure.io / koji /
- [19] makefile2graph, https: // github.com / lindenb / makefile2graph
- [20] Bazel, https: // bazel.membina /
- [21] Tutorial Makefile, https: // makefiletutorial.com /
- [22] Graphviz, http: // www.grafikviz.org
- [23] Undang-undang Amdahl, Wikipedia, https: // en.wikipedia.org / wiki / Amdahl% 27s_law