Liệu nó có ý nghĩa để viết các tập lệnh xây dựng trong C ++?


15

Tôi đang sử dụng CMake để tạo dự án IDE / makefiles của mình, nhưng tôi vẫn cần gọi "tập lệnh" tùy chỉnh để thao tác các tệp đã biên dịch hoặc thậm chí tạo mã.

Trong các dự án trước đây tôi đã sử dụng Python và nó vẫn ổn, nhưng bây giờ tôi gặp khó khăn nghiêm trọng trong việc quản lý rất nhiều phụ thuộc trong hai dự án rất lớn mà tôi đang làm việc vì vậy tôi muốn giảm thiểu sự phụ thuộc ở mọi nơi.

Ai đó đề nghị tôi sử dụng C ++ để viết các tập lệnh xây dựng của tôi thay vì thêm một phụ thuộc ngôn ngữ chỉ cho điều đó. Các chủ đề của dự án đã sử dụng C ++, vì vậy có một số lợi thế mà tôi có thể thấy:

  • để xây dựng toàn bộ dự án, chỉ cần một trình biên dịch C ++ và CMake, không có gì khác (tất cả các phụ thuộc khác là C hoặc C ++);
  • An toàn loại C ++ (khi sử dụng C ++ hiện đại) giúp mọi thứ dễ dàng hơn để có được "chính xác";
  • đó cũng là ngôn ngữ tôi biết tốt hơn vì vậy tôi sẽ thoải mái hơn với nó ngay cả khi tôi có thể viết một số mã Python tốt;
  • tăng tiềm năng trong tốc độ thực hiện (nhưng tôi không nghĩ rằng nó sẽ thực sự có thể cảm nhận được);

Tuy nhiên, tôi nghĩ rằng có thể có một số nhược điểm và tôi không chắc về tác động thực sự khi tôi chưa thử:

  • có thể lâu hơn để viết mã (điều đó nói rằng tôi không chắc vì tôi đủ hiệu quả trong C ++ để viết một cái gì đó hoạt động nhanh chóng, vì vậy có lẽ đối với hệ thống này sẽ không quá lâu để viết) (thời gian biên dịch không nên ' t là một vấn đề cho trường hợp này);
  • Tôi phải giả sử rằng tất cả các tệp văn bản tôi sẽ đọc làm đầu vào đều ở dạng UTF-8, tôi không chắc nó có thể được kiểm tra dễ dàng khi chạy trong C ++ và ngôn ngữ sẽ không kiểm tra nó cho bạn;
  • các thư viện trong C ++ khó quản lý hơn các ngôn ngữ script;

Tôi thiếu kinh nghiệm và tầm nhìn xa nên có lẽ tôi đang thiếu những lợi thế và nhược điểm. Vì vậy, câu hỏi là: nó có ý nghĩa để sử dụng C ++ cho việc này? Bạn có kinh nghiệm để báo cáo và bạn có thấy những lợi thế và bất lợi có thể quan trọng không?


1
Tùy thuộc vào một trình thông dịch ngôn ngữ duy nhất cho bản dựng, dường như không quá tệ, đặc biệt là vì Python - rất dễ mang theo, phổ biến trên Linux và có sẵn trên Windows. Nếu bạn cần thêm thư viện Python, bạn có thể sử dụng virtualenv và nó sẽ không thêm bất cứ thứ gì ngoài một tệp Python (mà bạn có thể gửi) kết nối internet và một chút hệ thống ống nước để thiết lập virtualenv, cài đặt chúng trong và chạy thực tế của bạn xây dựng các kịch bản trong môi trường đó. Bạn có thể nhận được một tập lệnh bổ sung trong bản dựng của mình và kết nối internet theo yêu cầu.

Bạn có thể dự đoán mã hóa văn bản với độ tin cậy khá tốt.
DeadMG

@DeadMG Yeah, nhưng làm như vậy bằng tay nếu quá nhiều công việc (nếu bạn muốn có một tốt đoán và không giới hạn mình "là ascii này hoặc unicode, và nếu nó là unicode, bao nhiêu bit và byte gì trật tự?") Và thêm một phụ thuộc khác (nếu có một thư viện miễn phí và độc lập cho việc này) đánh bại điểm rơi xuống C ++ để dừng tùy thuộc vào Python.

@delnan Có nhưng vẫn cài đặt thêm ngôn ngữ. Từ mô tả của bạn, bất kỳ sự phụ thuộc bổ sung nào sẽ không có vẻ "quá tệ" nhưng tôi đang xem xét nó bởi vì có rất nhiều thứ để quản lý nên có lẽ nó cũng có thể giúp hạn chế các ngôn ngữ được sử dụng. Tôi cũng sử dụng một ngôn ngữ kịch bản nhúng (được triển khai trực tiếp trong C ++ trong dự án), javascript / HTML / CSS, XML và các định dạng khác đã được ghi nhớ rất nhiều.
Klaim

2
Bạn sẽ sử dụng gì để xây dựng tập lệnh xây dựng c ++ của mình?
jk.

Câu trả lời:


24

Chỉ cần sử dụng Python.

Tôi phát triển trong C ++ và thực hiện các tập lệnh xây dựng của mình bằng Python và tôi sẽ thấy khó khăn khi thực hiện các tập lệnh xây dựng trong C ++:

  • Python làm cho việc điều khiển từ điển, danh sách, từ điển lồng nhau của từ điển danh sách trở nên tầm thường, v.v. (Ví dụ: một trong các tập lệnh của tôi sử dụng hệ thống phân cấp đa cấp cho tất cả các đường dẫn của công cụ, phiên bản công cụ và phiên bản công cụ của tôi. ) C ++ có thể làm tương tự với các mẫu và các lớp tùy chỉnh, nhưng nó dài dòng hơn nhiều (nghĩa là dịch nhiều dòng mã hơn, thường chuyển thành năng suất thấp hơn).
  • Python cung cấp các thư viện và các thường trình cấp cao như xử lý XML và JSON, quy trình conos.walk của nó . Một lần nữa, C ++ có thể làm điều này, nhưng công việc tìm thư viện, tìm hiểu API của họ, lắp ráp chính xác các cuộc gọi (thường ở mức thấp hơn), v.v.
  • Xây dựng tập lệnh là một hoạt động không có giá trị gia tăng (để mượn một thuật ngữ từ lean). Tốt hơn là sử dụng ngôn ngữ cấp cao nhất có thể, để hoàn thành chúng nhanh nhất có thể, để quay lại làm việc có lợi cho người dùng của bạn.
  • Theo kinh nghiệm của tôi, xây dựng các kịch bản có xu hướng phát triển theo những cách không lường trước được. Ngay cả khi một nhiệm vụ ban đầu có vẻ đơn giản đối với C ++, nó có thể trở nên phức tạp một cách vội vàng. Khi một yêu cầu mới xuất hiện, việc xử lý trong tập lệnh Python thường đơn giản hơn rất nhiều so với yêu cầu trong C ++ (có thể yêu cầu tìm hoặc đọc API thư viện mới, v.v.).

Về những lợi thế mà bạn liệt kê cho C ++:

  • Thêm một phụ thuộc duy nhất (Python) không nên làm phức tạp đáng kể công trình của bạn. Nó đã là tiêu chuẩn cho hầu hết các cài đặt Linux, ví dụ. Nhờ các thư viện "bao gồm pin" của Python, nó thậm chí có thể dễ quản lý hơn các thư viện C ++ mà các tập lệnh xây dựng của bạn sẽ phụ thuộc vào.
  • Loại an toàn mà C ++ mang lại là hữu ích nhất cho các dự án lớn, không phải các tập lệnh nhỏ.
  • Python bổ sung cho C ++ rất tốt (cấp cao so với cấp thấp hơn, được gõ động so với nhập tĩnh, v.v.) và thậm chí có thể tích hợp với C ++ rất tốt (nhờ SWIG và Boost.Python) nếu sau này bạn muốn làm điều đó, vì vậy nó đáng để học hỏi cho một lập trình viên C ++.
  • Như bạn đã nói, tốc độ thực thi nên là không phát hành.

Chúng tôi đã làm điều này (xây dựng python) sau một năm vật lộn với cmake trên một dự án paltform chéo. Cuối cùng, chúng tôi thậm chí không thèm thử kiểm tra sự phụ thuộc (phần phức tạp nhất của bản dựng). Vì đối với các bản dựng tự động, bạn muốn xây dựng lại mọi thứ bằng mọi cách và trong C ++, có rất nhiều phụ thuộc phức tạp
Martin Beckett

1

Tôi tin rằng đây là câu hỏi cụ thể. Tôi khẳng định không có câu trả lời chính xác cho dù nó có ý nghĩa hay không sử dụng C ++ để xây dựng tập lệnh, cách duy nhất để tìm ra nó là thử nó trong thực tế.

Cá nhân tôi thấy Python vượt trội hơn C ++ vì khả năng biểu đạt ngôn ngữ tốt hơn và dĩ nhiên (ý kiến ​​cá nhân) dễ dàng hơn để quản lý công việc thao tác các tệp nhị phân và tạo mã. Tất nhiên, các thư viện tinh vi được phát triển cho nhiệm vụ có thể có sẵn, nhưng nếu không, thì cá nhân tôi chắc chắn đặt cược cho Python là câu trả lời "thường xuyên hơn" - trong trường hợp chung.


1

Đừng tự viết kịch bản, bạn đang nhân đôi nỗ lực và phát minh lại bánh xe.

Sử dụng một cái gì đó như SCONS hoặc thậm chí Maven 3 có hỗ trợ cho các hệ thống xây dựng C ++ .

Một hệ thống xây dựng tốt, bất kể ngôn ngữ không nên yêu cầu logic tùy chỉnh ở dạng tập lệnh để xây dựng một tạo phẩm thực thi chức năng.

Nếu bạn phải viết các kịch bản cho một hệ thống xây dựng để tùy chỉnh nó, thì đó không phải là một hệ thống xây dựng tốt. Viết một plugin cho một hệ thống xây dựng là một câu chuyện khác, nhưng chủ yếu vẫn rất đặc biệt đối với môi trường / phần cứng, và nên là thứ hiếm khi được sử dụng.


1
Như tôi đã giải thích, tôi đã sử dụng cmake rồi nhưng tôi vẫn cần các tập lệnh tùy chỉnh được thực hiện. Tôi đang nói về những kịch bản tùy chỉnh đó, không phải bản thân quá trình xây dựng.
Klaim

1
Tôi yêu Maven - kịch bản cần thiết để xây dựng chương trình C "Thế giới địa ngục" dài hơn chương trình!
quant_dev

@quant_dev, tôi nhớ lần đầu tiên tôi sử dụng Maven, trên trang web của riêng họ, họ khuyên bạn nên bắt đầu với một người đã biết về maven, vì lần đầu tiên rất khó để thiết lập. Đó là dấu hiệu đầu tiên mà tôi không muốn làm gì với nó!
Brady

Tôi thích SCons, nó hơi chậm nhưng rất dễ sử dụng.
quant_dev

1
@JarrodRoberson Tôi đã sử dụng "script" quá tự do. Tôi có nghĩa là tập tin cấu hình của nó. Tôi không chắc việc khai báo có giúp Maven tự động hơn và dễ bảo trì hơn không. Nó làm cho nó kém linh hoạt hơn, có thể là một nỗi đau trong các dự án lớn.
quant_dev

0

Để tập trung vào câu hỏi:

Liệu nó có ý nghĩa để viết các tập lệnh xây dựng trong C ++?

Câu trả lời là không đơn giản .

Câu trả lời hiện được chấp nhận phóng to python và liệt kê một loạt các mối quan tâm hợp lệ, nhưng tôi muốn thêm một lý do độc lập với ngôn ngữ:

Bạn thực sự không muốn kịch bản bất cứ điều gì trong bất kỳ ngôn ngữ được biên dịch nếu bạn có thể giúp nó:

  • Bạn sẽ cần một kịch bản để khởi động lại kịch bản!
  • Hoặc bạn cần kiểm tra tập lệnh đã biên dịch thành kiểm soát nguồn (và giữ nó đồng bộ với tập lệnh được kiểm tra!)
  • Kịch bản đột nhiên cũng có một cấu hình xây dựng cho kịch bản đính kèm. (Điều đó cần được duy trì!)

Ngoài ra, đi với câu trả lời khác:

Có lẽ bạn cũng không muốn sử dụng ngôn ngữ kịch bản "thô" để tạo ra các tập lệnh xây dựng của mình (tôi hiểu rằng những rắc rối của C ++ sẽ được CMake xử lý).

Những gì bạn có thể nên làm là chọn một trong các bản Build . Hệ thống . ra . . và xem liệu một trong những phù hợp với hóa đơn của bạn. kịch bản / khả năng mở rộng / chơi-đẹp-với-CMake / crosspl platformness.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.