Saya baru-baru ini menggunakan beberapa alat bangun untuk proyek Nodejs di tempat kerja ketika saya menyadari bahwa alat / sistem bangunan utama kebanyakan bahasa menggunakan bahasa yang berbeda dari bahasa pemrograman yang mendasarinya sendiri.
Misalnya, make tidak menggunakan C atau C ++ untuk menulis skrip dan semut (atau Maven) tidak menggunakan Java sebagai bahasa mereka untuk skrip.
Bahasa yang lebih baru seperti Ruby memang menggunakan bahasa yang sama untuk membuat alat seperti rake , yang masuk akal bagi saya. Tetapi mengapa tidak selalu demikian? Apa keuntungan memiliki alat bangun yang menggunakan bahasa berbeda dari bahasa yang mendasarinya?
programming-languages
history
build-system
joshin4colours
sumber
sumber
make
lagi (yang tetap diterapkan dalam C)?Jawaban:
Pilihan bahasa pemrograman apa yang akan digunakan untuk menyelesaikan sesuatu harus bergantung pada fitur spesifik dari tujuan itu dan bukan pada tugas-tugas lain yang terkait dengan proyek itu.
Alat bangun melakukan pekerjaan yang sangat spesifik, dan tidak peduli bahasa apa yang Anda gunakan untuk proyek utama, alat bangun adalah perangkat lunak dengan sendirinya.
Mencoba mengikat proyek utama dan alat pembangunannya bisa menjadi keputusan yang sangat buruk. Apa yang seharusnya Anda butuhkan dengan alat bantu bangunan adalah proses cepat dari aturan sederhana, dengan manajemen file dan IO yang cepat.
Jika bahasa seperti ruby menggunakan diri mereka sendiri untuk mengimplementasikan alat bangun mereka, lebih terkait pada fitur-fitur bahasa itu daripada pada kebutuhan diasumsikan untuk menjaga semua yang ditulis dengan bahasa yang sama.
sumber
Bukan tidak mungkin untuk menulis alat build yang menggunakan bahasa seperti C atau Java sebagai bahasa scripting mereka. Namun, alat bantu membangun manfaat dari menggunakan bahasa skrip deklaratif yang lebih banyak . Bayangkan rasa sakit dan semangat menulis makefile (atau build.xml, atau apa pun) di C.
Alat Bangun diuntungkan dari penggunaan DSL, tugas yang C bukan pilihan yang sangat baik. C terlalu umum untuk alat bangun, dan terlalu mementingkan rincian tingkat kesalahan & rendah. Misalnya, Anda tidak ingin peduli dengan manajemen memori eksplisit dalam alat build! Jadi, bahkan jika menggunakan sintaks mirip C, Anda mungkin akan menggunakan pengumpulan sampah di alat skrip Anda, pada saat itu mengapa tidak menggunakan DSL khusus?
Masuk akal bahwa Ruby dapat digunakan untuk ini, karena ini adalah bahasa tingkat tinggi, lebih deklaratif daripada C atau Java. Lihat juga: Gradle, sbt.
sumber
Imagine the pain and boilerplate of writing a makefile (or build.xml, or whatever) in C.
Bayangkan rasa sakit dan kekacauan dari mencoba untuk mengekspresikan logika kondisional non-sepele (Anda tahu, hal-hal penting standar) dalam skrip XML deklaratif. Oh, tunggu, Anda tidak perlu membayangkan; Anda mungkin harus menghadapinya, dan itu mungkin berantakan setengah, bukan? Build adalah salah satu pilihan terburuk untuk bahasa scripting deklaratif, karena masalah serius dengan cepat berakhir melawan batas-batas deklaratif-ness, dan yang tidak cukup sederhana untuk tidak memerlukan alat build.Mari kita beri contoh dunia nyata.
Sekitar 15 tahun yang lalu saya bekerja pada porting sistem besar yang ditulis dalam C dari Unix ke Windows, itu sekitar 3 juta baris kode. Untuk memberi Anda gambaran skala, butuh waktu 24 jam untuk mengkompilasi pada beberapa sistem unix kami (RS6000), windows dapat mengkompilasi sistem dalam waktu sekitar 4 jam.
(Kami juga memiliki 2 juta baris kode dalam bahasa yang kami interpretasikan sendiri, tetapi memutuskan untuk tidak menggunakan bahasa kami untuk sistem build karena tidak pernah dirancang untuk pemrosesan file. Juga kami membutuhkan sistem build untuk mengkompilasi kode C yang mengimplementasikan bahasa kami. .)
Pada saat sistem build ditulis dalam campuran skrip shell dan membuat file, ini tidak portabel untuk windows - oleh karena itu kami memutuskan untuk menulis sistem build kami sendiri.
Kami bisa menggunakan C, namun kami memutuskan untuk menggunakan python, ada beberapa alasan. (Kami juga menulis ulang sistem kontrol kode sumber kami di python pada saat yang sama, ini sangat terintegrasi dengan sistem build, sehingga file objek untuk diperiksa dalam modul dapat dibagikan oleh pengembang.)
Sebagian besar kode kami dapat dibangun dengan beberapa aturan sederhana (hanya beberapa ribu baris python untuk semua platform, Windows, VMS, dan 6 versi Unix) yang digerakkan dari konvensi penamaan file.
Pada saat itu RegEx tidak terlalu standar antara sistem C pada platform yang berbeda, Python telah membangun di RegEx.
Beberapa modul membutuhkan langkah-langkah membangun kustom, Python memungkinkan file kelas dimuat secara dinamis. Kami mengizinkan kelas khusus untuk digunakan untuk membangun modul (lib), berdasarkan memiliki file python dengan nama ajaib di folder. Ini adalah alasan pembunuh untuk menggunakan python.
Kami mempertimbangkan Java, tetapi tidak mengirim pada semua platform pada saat itu.
(UI untuk sistem kontrol kode sumber kami menggunakan browser web karena itu portabel di semua platform. Ini adalah 6 bulan sebelum kami memiliki koneksi internet. Kami harus mengunduh browser melalui X25!)
sumber
Jawaban singkat untuk pertanyaan ini adalah bahwa ini adalah alat build . Alat yang mengotomatiskan penggunaan alat lain, dengan tujuan membangun produk akhir dari beberapa file sumber. Jika kami menulis skrip build dalam bahasa yang sama dengan produk itu sendiri, kami masuk ke ranah alat khusus bahasa, yang tidak akan dianggap sebagai alat build dengan cara yang sama.
Ini menimbulkan pertanyaan - mengapa kompiler tidak menyediakan otomatisasi build seperti yang kami gunakan dari alat seperti make? Yang jawabannya adalah karena ada . Filosofi Unix tentang "lakukan satu hal, dan lakukan dengan baik" menunjukkan bahwa bukan tanggung jawab kompiler untuk menyediakan * ini. Yang mengatakan, saya secara pribadi telah melalui bagian saya dari membuat sakit kepala, dan akan tertarik untuk mencoba kompiler yang menyediakan itu sendiri kutipan-tanda kutip membangun sistem "asli".
Untuk contoh kompiler yang dirancang dengan cara ini, lihat Jai Jon Blow (yang belum dirilis), bahasa yang dimaksudkan sebagai pengganti C ++. Tautan ke pembicaraan dan demo pengumpul dikumpulkan di sini . Bahasa ini mengkompilasi ke kode byte yang berjalan di dalam kompiler, dengan kompilasi ke biner menjadi fungsi perpustakaan standar yang disediakan, dapat diakses dari kode byte. Tujuannya adalah untuk memungkinkan otomatisasi pembuatan dan meta-pemrograman dalam sintaksis asli bahasa.
* Pandangan di Visual Studio Microsoft akan menunjukkan kepada Anda contoh filosofi yang berlawanan. :)
sumber
Tool build adalah alat yang pertama dan terutama, seperti 'gcc', 'ls', 'awk' atau 'git'. Anda memberi makan alat input (nama file, parameter, dll) dan itu akan melakukan beberapa hal yang sesuai.
Semua alat ini memungkinkan Anda memberikan masukan dengan cara yang seharusnya cukup sederhana untuk ditulis dan dipahami. Dalam kasus khusus alat pembuatan, input adalah file resep, file yang menjelaskan bagaimana proyek Anda beralih dari file sumber ke produk jadi.
Jika resep Anda sesederhana melewati folder yang berisi proyek dan kompiler untuk digunakan, maka "bahasa" deklaratif sudah cukup. Setelah resep menjadi lebih dan lebih rumit, dengan lebih banyak logika, menjadi sulit untuk menanganinya dengan bahasa deklaratif dan bahasa tujuan yang lebih umum digunakan.
Seharusnya sekarang menjadi jelas bahwa tidak ada hubungan antara bahasa yang digunakan untuk menulis resep bangunan Anda dan bahasa yang digunakan untuk menulis kode produk Anda hanya karena mereka memiliki tujuan dan persyaratan yang berbeda. Tidak ada hubungan bahkan di antara bahasa alat bangun ditulis dan "bahasa" resep membangun harus ditulis. Selalu gunakan alat terbaik untuk pekerjaan itu!
sumber