Khi nào các dự án C mới nên nhắm mục tiêu tiêu chuẩn C rất cũ (> 20 tuổi, tức là C89)?


12

Thỉnh thoảng tôi thấy các dự án C nguồn mở, tương đối mới, nhắm mục tiêu các tiêu chuẩn C rất cũ, điển hình là C89. Một ví dụ là systemd. Những dự án này có những người thông minh nắm quyền, vì vậy họ có thể có một lý do hợp lý đằng sau quyết định này mà tôi không biết. Bỏ qua lợi ích của sự nghi ngờ, có vẻ như lý do là "cũ hơn và tiêu chuẩn hóa luôn dễ mang theo hơn và tốt hơn", thật nực cười vì kết luận hợp lý là FORTRAN tốt hơn C và COBOL thậm chí còn tốt hơn FORTRAN.

Khi nào và tại sao nó hợp lý cho các dự án C mới nhắm mục tiêu các tiêu chuẩn C rất cũ?

Tôi không thể tưởng tượng ra một kịch bản trong đó hệ thống của người dùng tuyệt đối không được cập nhật trình biên dịch C của nó nhưng nếu không thì miễn phí cài đặt phần mềm mới. Ví dụ, phiên bản LTS của Debian có gói gcc 4.6 hỗ trợ C99 và một số C11. Tôi đoán rằng kịch bản lạ phải tồn tại và các chương trình như systemd đang nhắm mục tiêu vào những người dùng đó.

Trường hợp sử dụng hợp lý nhất mà tôi có thể tưởng tượng là nơi người dùng được dự đoán sẽ có các kiến ​​trúc kỳ lạ, trên đó chỉ có trình biên dịch C89 nhưng họ hoàn toàn sẵn sàng cài đặt phần mềm mới. Với sự suy giảm về tính đa dạng của các kiến ​​trúc tập lệnh, đó có vẻ như là một kịch bản giả định quá mức, nhưng tôi không chắc chắn.


10
"Tôi không thể tưởng tượng ra một kịch bản trong đó hệ thống của người dùng tuyệt đối không được cập nhật trình biên dịch C của nó nhưng nếu không thì miễn phí cài đặt phần mềm mới." Bạn chưa thực hiện đủ công việc nhúng ;-)
Philip Kendall

1
@PhilipKendall Tôi chưa thực hiện bất kỳ công việc nhúng nào. Tôi khuyến khích bạn khai sáng cho tôi với một câu trả lời!
Praxeolitic

2
Một khi một tiêu chuẩn được thiết lập, nó sẽ hầu như giữ mãi mãi. Đôi khi dài hơn 2000 năm .
Doc Brown

1
@DocBrown Nhưng lưu ý rằng trang đó giải thích rằng tuyên bố rằng đây là tiêu chuẩn 2000 năm tuổi là sai.
Jesper

1
Khi bạn thấy một cái gì đó như thế này, câu hỏi đầu tiên bạn nên hỏi là "Nền tảng nào được dự định nhắm mục tiêu?", Tiếp theo là, "Phiên bản nào của C có thể được biên dịch trên / cho nền tảng đã nói )? " Rồi đến, "Phiên bản nào của C cung cấp khả năng tương thích cao nhất với yêu cầu của dự án?" Và tiếp theo có lẽ là, "Phiên bản nào của C là phần lớn các dự án dẫn đầu quen thuộc nhất?"
Thời gian của Justin - Tái lập lại

Câu trả lời:


14

... "cũ hơn và tiêu chuẩn hóa luôn luôn di động và tốt hơn" thật là lố bịch ...

Câu nói đó trở nên lố bịch khi nó trở nên tốt hơn , điều này hoàn toàn chủ quan. Bạn không chọn ngôn ngữ và tiêu chuẩn cho một dự án vì một nửa số người trong lần gặp gỡ cuối cùng bạn đã sử dụng nó; bạn chọn nó bởi vì bạn đã nghiên cứu và hiểu vấn đề bạn đang giải quyết và xác định rằng đó là công cụ phù hợp cho công việc.

Đối với các tiêu chuẩn nói chung, có một trường hợp được thực hiện đối với một số dự án về tính di động và đó là việc chọn một dự án cũ hơn có một số lợi ích. Điều này đặc biệt đúng khi bạn đang phát triển thư viện dưới dạng sản phẩm, là phương tiện cho mục đích của người khác. Điều cuối cùng bạn muốn làm là viết một cái gì đó bạn không thể bán vì nó yêu cầu một trình biên dịch mà khách hàng bạn chưa gặp có thể chưa có sẵn. Nhận xét của Philip Kendall về thế giới nhúng là tại chỗ; Có rất nhiều thứ xảy ra, bởi vì mọi người vẫn phải viết mã mới cho các nền tảng cũ, ổn định hoặc những nền tảng không được hưởng lợi từ các tính năng bổ sung và không có trình biên dịch cập nhật. Khi bạn hoàn toàn kiểm soát mọi khía cạnh của dự án của bạn, '

Đối với C cụ thể, có câu hỏi về những gì bạn nhận được để đổi lấy việc tuân thủ tiêu chuẩn mới nhất. Quá trình chuyển đổi K & R-to-C89 là một thay đổi lớn đòi hỏi nhiều nỗ lực để làm sạch mã cũ nhưng cuối cùng đã làm rất nhiều việc tốt. Những thay đổi trong C99C11là nhỏ so với, và hầu hết các cuộc gặp gỡ CI được phát triển gần đây vẫn sẽ vượt qua C89 vì nó không sử dụng các tính năng mới. Thật khó để tranh luận rằng việc bắt buộc C99 trên C89 sẽ là điều nên làm bởi vì nó hỗ trợ các nhận xét một dòng, có kiểu dữ liệu Boolean riêng và có thể thực hiện các mảng có độ dài thay đổi. Các bình luận và Booleans có cách giải quyết không xấu và các VLA có thể được xử lý theo các cách khác, hơi kém hiệu quả. C11 hạ cấp các VLA thành tùy chọn và đó có thể là lý do để chọn C99 cũ hơn nếu chúng nổi bật trong quá trình triển khai của bạn.


3
Vâng, pha trộn các khai báo và báo cáo biến là khá tốt cho tính dễ hiểu. Các chức năng nội tuyến, hỗ trợ unicode hạn chế và long longcũng rất tốt để có.
Ded repeatator

Ngoài ra, đa luồng đôi khi rất tốt để có ...
Ded repeatator

@Ded repeatator Tôi không đồng ý rằng những gì trong C99 và C11 là những cải tiến. Bạn có thể viết tất cả C11 bạn muốn nếu bạn có thể tạo ra một trường hợp kinh doanh cho giá trị của những người tốt bụng vượt quá giá trị tính di động đối với các môi trường cũ. Tập tin dưới "nghiên cứu vấn đề và tìm công cụ phù hợp cho công việc."
Blrfl

2
Chà, vấn đề là bạn đã không đề cập chính xác những cải tiến quan trọng .
Ded repeatator

@Ded repeatator: Tôi đã viết mã đa luồng vào những năm 1990. Mã dựa trên các tính năng phân luồng dựa trên ngôn ngữ có thể không sử dụng được cho các triển khai tự do không thể hỗ trợ mọi thứ mà Tiêu chuẩn yêu cầu, trong khi các thư viện sử dụng các chức năng nền tảng hỗ trợ chức năng mà chúng cần sẽ có thể thích ứng với mọi nền tảng hỗ trợ các chức năng đó .
supercat

10

Khi tính di động trên một loạt các nền tảng là quan trọng. Điều đó có thể bao gồm các nền tảng lỗi thời và nhiều bộ xử lý nhúng chỉ có trình biên dịch tối giản.

Cũng có một ý nghĩa trong đó C89 là "mẫu số chung thấp nhất". Đây là phiên bản được chuẩn hóa đúng đầu tiên và gần như mọi trình biên dịch đang sử dụng ngày nay đều có thể được giả định để thực hiện một số siêu bộ của C89.

Cũng có vấn đề là Microsoft Visual C ++, trong khi nó tương đối tốt để theo kịp các tiêu chuẩn C ++, bị kẹt ở C89 trong một thời gian dài khi ở chế độ C. Vì vậy, bất kỳ ai không sử dụng Visual Studio mới nhất có thể bị giới hạn ở C89.


Đúng, đối số có lợi là tính di động nhưng câu hỏi đặt ra là nếu thực sự có các hệ thống phi giả thuyết chỉ có thể sử dụng trình biên dịch C89 nhưng đang biên dịch các bản phân phối phần mềm mới. tức là nếu tôi đang bắt đầu một dự án C mới, tôi sẽ quyết định như thế nào nếu tuân thủ C89 có thể tăng số lượng người dùng tiềm năng? Điểm MSVC là tốt.
Praxeolitic

1
@Praxeolitic Đó thực sự là một câu hỏi về việc liệu bạn đang tạo mã mà nhiều người khác nhau sẽ sử dụng. Bởi vì sẽ có rất nhiều người sử dụng các trình biên dịch cũ, vì họ không thể nâng cấp, hoặc vì họ cho rằng quá nhiều rủi ro và nỗ lực để nâng cấp.
Simon B

3

Tôi phải thừa nhận rằng tôi vẫn viết mã giả C89 (không hoàn toàn tuân thủ C99) chủ yếu vì Microsoft. Tôi dựa rất nhiều vào MSVC cho phía Windows và họ vẫn chưa hoàn toàn tuân thủ C99, thay vào đó, họ tập trung phần lớn vào C ++ 17 trở đi.

Trên hết, tôi đang làm việc trên SDK C mà rất nhiều nhà phát triển plugin sử dụng MSVC để phát triển plugin của họ và một số vẫn là MSVC 2010. Vì vậy, vẫn có các trình biên dịch phổ biến được sử dụng rộng rãi trên các nền tảng không quá kỳ lạ (trừ khi bạn xem xét Windows kỳ lạ) thậm chí chưa thực hiện đầy đủ C99. Khi bạn nhắm mục tiêu khả năng tương thích rộng với phạm vi trình biên dịch lớn nhất (đó là một trong những lý do chính khiến SDK được viết bằng C chứ không phải C ++), vẫn còn một số trong số chúng được sử dụng rộng rãi (ít nhất là MSVC). khi nói đến hỗ trợ C. Đã gần một vài thập kỷ kể từ C99 và chúng tôi vẫn không có VLAs, ví dụ, trong MSVC AFAIK (chưa kiểm tra MSVC 2017 nhưng đã đưa ra lập trường của Microsoft về C, tôi nghi ngờ rằng nó phù hợp hơn với C99) .

Và vì vậy, vẫn không may là các trình biên dịch mới thực sự khá tốt với các trình tối ưu hóa và trình gỡ lỗi tốt mà thậm chí còn không hoàn toàn tuân thủ C99. Tất nhiên, nếu không phải như vậy, tôi sẽ nhảy qua C11.

Bên cạnh khả năng tương thích nguồn với plugin và MSVC, còn có sự tương tác với các ngôn ngữ khác. Một số ngôn ngữ khác sử dụng SDK thông qua FFI và một số ngôn ngữ FFI đó chỉ hiểu C89. Họ có thể không hiểu boolhoặc _Boollà một ví dụ đơn giản khi nhập các hàm từ dylib và chỉ hiểu, nói , int.

Đúng, đối số có lợi là tính di động nhưng câu hỏi đặt ra là nếu thực sự có các hệ thống phi giả thuyết chỉ có thể sử dụng trình biên dịch C89 nhưng đang biên dịch các bản phân phối phần mềm mới. tức là nếu tôi đang bắt đầu một dự án C mới, tôi sẽ quyết định như thế nào nếu tuân thủ C89 có thể tăng số lượng người dùng tiềm năng?

Chỉ cần chú ý điều này nhưng loại tiếng vang Blrfl, việc tăng năng suất bằng cách sử dụng C99 và C11 không quá lớn trong trường hợp của tôi trong khi mất khả năng cho phép mọi người viết plugin của họ trong MSVC có thể là một chi phí rất lớn (đặc biệt là từ sản phẩm tôi làm việc trên có thị phần lớn nhất, cho đến nay, về phía Windows và người dùng trung bình thường mua và tải xuống nhiều plugin của bên thứ ba). Loại sản phẩm tôi làm việc gần như là một nửa giữa môi trường phát triển dành cho lập trình viên / người viết kịch bản và sản phẩm dành cho người dùng dành cho nghệ sĩ, vì rất nhiều người muốn phát triển những thứ mới trên đầu trang để cho phép các khả năng mới và đạt được hiệu ứng đặc biệt của những người tử tế chưa nhìn thấy. Vì vậy, trong trường hợp của tôi, đó thực sự là một quyết định khá đơn giản để ủng hộ C89 ít nhất là cho SDK.

Tôi cho rằng bạn phải nhìn vào các trình biên dịch xung quanh bạn và cố gắng tìm ra nhân khẩu học mục tiêu của bạn. Nếu bạn không phát triển kiến ​​trúc plugin cho Windows hoặc thực hiện bất kỳ chương trình nhúng nào hoặc cố gắng xây dựng bộ công cụ phát triển phần mềm có thể được sử dụng bởi phạm vi trình biên dịch và ngôn ngữ rộng nhất ngoài đó, thì chắc chắn sẽ giúp mọi thứ dễ dàng hơn với C99 + xa. Cũng có thể xem xét mức tăng năng suất mà bạn có được từ mẫu C99 trở đi. Tôi không được hưởng lợi nhiều từ những thứ như VLAs vì tôi dựa vào những cách đơn giản để sử dụng ngăn xếp khi dữ liệu phù hợp và heap khác.

Nhưng có rất nhiều thứ bị tụt hậu so với các trình biên dịch phổ biến như MSVC sang FFI trong các ngôn ngữ khác, theo nghĩa là chúng có thể nhập và gọi các hàm C trực tiếp từ một dylib, nhưng cũng có thể bị chậm một chút so với lần Vì vậy, có rất nhiều điều kinh doanh thực tế để xem xét, tùy thuộc vào tên miền của bạn, thay vì chỉ đơn giản là ưu tiên cũ hơn và tiêu chuẩn hóa cho một số loại thẩm mỹ.

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.