Apakah masuk akal untuk menulis skrip build di C ++?


15

Saya menggunakan CMake untuk menghasilkan proyek IDE / makefile, tetapi saya masih perlu memanggil "skrip" khusus untuk memanipulasi file yang saya kompilasi atau bahkan menghasilkan kode.

Dalam proyek-proyek sebelumnya saya telah menggunakan Python dan itu OK, tapi sekarang saya mengalami masalah serius mengelola banyak dependensi dalam dua proyek yang sangat besar yang saya kerjakan jadi saya ingin meminimalkan ketergantungan di mana-mana.

Seseorang menyarankan saya untuk menggunakan C ++ untuk menulis skrip build saya alih-alih menambahkan ketergantungan bahasa hanya untuk itu. Proyek-proyek themeelves sudah menggunakan C ++ sehingga ada beberapa keuntungan yang bisa saya lihat:

  • untuk membangun keseluruhan proyek, hanya sebuah kompiler C ++ dan CMake yang diperlukan, tidak ada yang lain (semua dependensi lainnya adalah C atau C ++);
  • Keamanan tipe C ++ (saat menggunakan C ++ modern) membuat segalanya lebih mudah untuk mendapatkan "yang benar";
  • itu juga bahasa yang saya tahu lebih baik sehingga saya lebih nyaman dengan itu bahkan jika saya bisa menulis beberapa kode Python yang baik;
  • potensi keuntungan dalam kecepatan eksekusi (tapi saya pikir itu tidak akan terlihat);

Namun, saya pikir mungkin ada beberapa kekurangan dan saya tidak yakin tentang dampak nyata karena saya belum mencoba:

  • mungkin lebih lama untuk menulis kode (yang mengatakan saya tidak yakin karena saya cukup efisien dalam C ++ untuk menulis sesuatu yang bekerja dengan cepat, jadi mungkin untuk sistem ini tidak akan terlalu lama untuk menulis) (waktu kompilasi tidak boleh t menjadi masalah untuk kasus ini);
  • Saya harus berasumsi bahwa semua file teks yang akan saya baca sebagai input dalam UTF-8, saya tidak yakin itu dapat dengan mudah diperiksa saat runtime di C ++ dan bahasa tidak akan memeriksa untuk Anda;
  • perpustakaan di C ++ lebih sulit untuk dikelola daripada dalam bahasa scripting;

Saya kurang pengalaman dan pandangan jauh ke depan, jadi mungkin saya kehilangan kelebihan dan kekurangan. Jadi pertanyaannya adalah: apakah masuk akal untuk menggunakan C ++ untuk ini? apakah Anda memiliki pengalaman untuk melaporkan dan apakah Anda melihat kelebihan dan kekurangan yang mungkin penting?


1
Tergantung pada penerjemah bahasa tunggal untuk membangun hanya tampaknya tidak terlalu buruk, terutama karena itu Python - sangat portabel, luas di Linux dan mudah tersedia pada Windows. Jika Anda memerlukan pustaka Python tambahan, Anda dapat menggunakan virtualenv dan itu tidak akan menambahkan apa pun kecuali satu file Python (yang bisa Anda kirimkan) koneksi internet dan sedikit pipa ledeng untuk mengatur virtualenv, instal di, dan jalankan aktual Anda buat skrip di lingkungan itu. Anda dapat membuka skrip tambahan dalam versi Anda dan koneksi internet sebagai persyaratan.

Anda dapat memperkirakan nilai penyandian teks dengan keandalan yang cukup baik.
DeadMG

@DeadMG Ya, tetapi melakukannya dengan tangan jika terlalu banyak bekerja (jika Anda ingin menebak dengan baik dan tidak membatasi diri Anda untuk "apakah ini ascii atau unicode, dan jika itu unicode, berapa bit dan berapa byte order?") Dan menambahkan dependensi lain (jika ada perpustakaan yang berdiri bebas dan berdiri sendiri untuk ini) mengalahkan titik menjatuhkan ke C ++ untuk berhenti bergantung pada Python.

@delnan Ya tapi masih menggunakan bahasa lain untuk diinstal. Dari uraian Anda, setiap ketergantungan tambahan tidak akan tampak "terlalu buruk" tapi saya sedang mempertimbangkannya karena sudah banyak yang harus dikelola sehingga mungkin dapat membantu membatasi bahasa yang digunakan juga. Saya juga menggunakan bahasa skrip tertanam (diimplementasikan dalam C ++ langsung di proyek), javascript / HTML / CSS, XML dan format lain yang sudah banyak yang perlu diingat.
Klaim

2
apa yang akan Anda gunakan untuk membangun skrip c ++ build Anda?
jk.

Jawaban:


24

Cukup gunakan Python.

Saya mengembangkan C ++ dan membuat skrip build saya dengan Python, dan saya merasa sulit untuk membuat skrip build di C ++:

  • Python membuatnya sepele untuk memanipulasi kamus, daftar, kamus tersarang dari kamus daftar, dll. (Misalnya, salah satu skrip saya menggunakan hierarki multi-level dari semua alat, versi alat, dan jalur 'versi' alat saya. ) C ++ dapat melakukan hal yang sama dengan templat dan kelas kustom, tetapi jauh lebih verbose (yang diterjemahkan ke lebih banyak baris kode, yang umumnya diterjemahkan ke produktivitas yang lebih rendah).
  • Python menyediakan pustaka dan rutin tingkat tinggi seperti penanganan, subproses , dan os.walk XML dan JSON . Sekali lagi, C ++ dapat melakukan ini, tetapi jauh lebih banyak pekerjaan untuk menemukan perpustakaan, mempelajari API mereka, merakit panggilan dengan benar (yang seringkali tingkat lebih rendah), dll.
  • Skrip build adalah aktivitas yang tidak bernilai tambah (meminjam istilah dari lean). Lebih baik menggunakan bahasa tingkat tinggi sebanyak mungkin, menyelesaikannya secepat mungkin, untuk kembali bekerja yang bermanfaat bagi pengguna Anda.
  • Dalam pengalaman saya, membangun skrip cenderung tumbuh dengan cara yang tidak terduga. Bahkan jika suatu tugas awalnya tampak sederhana untuk C ++, itu bisa menjadi rumit dengan cepat. Ketika persyaratan baru muncul, seringkali jauh lebih mudah untuk menangani penanganan dalam skrip Python daripada melakukannya di C ++ (yang mungkin memerlukan menemukan atau membaca tentang API perpustakaan baru, dll.).

Mengenai keuntungan yang Anda daftarkan untuk C ++:

  • Menambahkan ketergantungan tunggal (Python) tidak akan menyulitkan pembangunan Anda secara signifikan. Ini sudah standar pada sebagian besar instalasi Linux, misalnya. Berkat pustaka "termasuk baterai" Python, bahkan mungkin lebih mudah dikelola daripada pustaka C ++ yang bergantung pada skrip pembuatan Anda.
  • Jenis keamanan yang diberikan C ++ paling berguna untuk proyek besar, bukan skrip kecil.
  • Python melengkapi C ++ dengan sangat baik (level tinggi versus level lebih rendah, diketik secara dinamis versus diketik secara statis, dll.) Dan bahkan dapat berintegrasi dengan C ++ dengan sangat baik (terima kasih kepada SWIG dan Boost.Python) jika nanti Anda ingin melakukannya, jadi layak dipelajari untuk seorang programmer C ++.
  • Seperti yang Anda katakan, kecepatan eksekusi seharusnya bukan masalah.

Kami melakukan ini (membangun python) setelah satu tahun berjuang dengan cmake pada proyek paltform silang. Pada akhirnya kami bahkan tidak repot-repot mencoba memeriksa ketergantungan (bagian paling kompleks dari bangunan). Karena untuk bangunan otomatis, Anda ingin membangun kembali semuanya dan di C ++ ada begitu banyak ketergantungan kompleks
Martin Beckett

1

Saya yakin ini pertanyaan khusus. Saya akan mengklaim tidak ada jawaban yang benar apakah masuk akal atau tidak menggunakan C ++ untuk membangun skrip, satu-satunya cara untuk mengetahuinya adalah dengan mencobanya dalam praktik.

Secara pribadi saya akan melihat Python lebih unggul daripada C ++ karena ekspresi bahasa yang lebih baik dan alat perpustakaan standar yang lebih mudah (pendapat pribadi, tentu saja) untuk mengelola tugas memanipulasi file biner dan menghasilkan kode. Tentu saja, perpustakaan canggih yang dikembangkan untuk tugas itu mungkin tersedia, tetapi jika tidak, maka saya pribadi akan bertaruh untuk Python sebagai jawaban "lebih sering benar" - dalam kasus umum.


1

Jangan menulis skrip sendiri, Anda menduplikasi upaya dan menemukan kembali roda.

Gunakan sesuatu seperti SCONS atau bahkan Maven 3 yang memiliki dukungan untuk sistem C ++ build .

Sistem build yang baik, apa pun bahasanya tidak perlu memerlukan logika khusus dalam bentuk skrip untuk membangun artifak yang dapat dieksekusi yang berfungsi

Jika Anda harus menulis skrip untuk sistem build untuk menyesuaikannya, itu bukan sistem build yang baik. Menulis sebuah plugin untuk sistem build adalah cerita yang berbeda, tetapi tetap yang harus sangat khusus untuk lingkungan / perangkat keras kebanyakan, dan harus menjadi sesuatu yang jarang terpaksa.


1
Seperti yang saya jelaskan, saya sudah menggunakan cmake tetapi saya masih perlu skrip khusus untuk dikerjakan. Saya berbicara tentang skrip khusus itu, bukan proses pembuatannya sendiri.
Klaim

1
Saya suka Maven - skrip yang dibutuhkan untuk membangun program "Hell World" C lebih panjang dari program!
quant_dev

@quant_dev, saya ingat pertama kali saya melihat ke dalam menggunakan Maven, di halaman web mereka sendiri, mereka merekomendasikan untuk memulai dengan seseorang yang sudah mengenal maven, karena sulit untuk mengatur pertama kali. Itu adalah tanda pertama bahwa saya tidak ingin ada hubungannya sama sekali dengan itu!
Brady

Saya suka SCons, ini agak lambat tapi sangat mudah digunakan.
quant_dev

1
@JarrodRoberson Saya menggunakan "skrip" terlalu bebas. Maksud saya file konfigurasinya. Saya tidak yakin apakah menjadi deklaratif membuat Maven otomatis lebih portabel dan mudah dirawat. Itu membuatnya kurang fleksibel, yang dapat menyulitkan dalam proyek besar.
quant_dev

0

Untuk fokus pada pertanyaan:

Apakah masuk akal untuk menulis skrip build di C ++?

Jawabannya adalah tidak .

Jawaban yang saat ini diterima memperbesar ke python, dan daftar sejumlah masalah yang valid, tapi saya ingin menambahkan alasan independen bahasa:

Anda benar-benar tidak ingin apa-apa skrip di setiap bahasa dikompilasi jika Anda dapat membantu:

  • Anda memerlukan skrip untuk mem-bootstrap skrip!
  • Atau Anda perlu memeriksa skrip yang dikompilasi ke dalam kontrol sumber (dan tetap sinkronkan dengan sumber-sumber yang dicentang!)
  • Script tiba-tiba juga memiliki konfigurasi build untuk script yang dilampirkan. (Itu perlu dipertahankan!)

Selain itu, pergi dengan jawaban lain:

Mungkin Anda juga tidak ingin menggunakan bahasa skrip "mentah" untuk membuat skrip build Anda (saya mengerti bahwa seluk-beluk C ++ akan ditangani oleh CMake).

Yang mungkin harus Anda lakukan adalah memilih salah satu Build . Sistem . keluar . ada . dan lihat apakah ada yang sesuai dengan tagihan Anda. scriptability / extability / play-nice-with-CMake / crossplatformness.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.