Kapan proyek C baru harus menargetkan standar C yang sangat lama (> 20 tahun, yaitu C89)?

12

Kadang-kadang saya melihat proyek-proyek C open source besar, relatif baru, menargetkan standar C yang sangat lama, biasanya C89. Contohnya adalah systemd. Proyek-proyek ini memiliki orang-orang cerdas di pucuk pimpinan sehingga mereka mungkin memiliki alasan yang bagus di balik keputusan ini yang tidak saya ketahui. Selain manfaat keraguan itu, tampaknya alasannya adalah "lebih tua dan standar selalu lebih portabel dan lebih baik" yang konyol karena kesimpulan logisnya adalah bahwa FORTRAN lebih baik daripada C dan COBOL bahkan lebih baik daripada FORTRAN.

Kapan dan mengapa dibenarkan untuk proyek C baru untuk menargetkan standar C yang sangat lama?

Saya tidak bisa membayangkan skenario di mana sistem pengguna sama sekali tidak boleh memperbarui kompiler C-nya tetapi sebaliknya bebas untuk menginstal perangkat lunak baru. Debian versi LTS, misalnya, memiliki paket gcc 4.6 yang mendukung C99 dan sebagian C11. Saya kira itu skenario aneh harus ada dan program seperti systemd menargetkan pengguna tersebut.

Kasus penggunaan yang paling masuk akal yang dapat saya bayangkan adalah di mana pengguna diharapkan memiliki arsitektur eksotis di mana hanya ada kompiler C89 yang tersedia tetapi mereka sepenuhnya bersedia untuk menginstal perangkat lunak baru. Mengingat penurunan keragaman arsitektur set instruksi, yang sepertinya seperti skenario hipotetis berlebihan, tapi saya tidak yakin.

Praxeolitic
sumber
10
"Saya tidak bisa membayangkan skenario di mana sistem pengguna sama sekali tidak harus memperbarui kompiler C-nya tetapi sebaliknya bebas untuk menginstal perangkat lunak baru." Anda belum melakukan cukup pekerjaan yang disematkan ;-)
Philip Kendall
2
@ PhilipKendall Saya belum melakukan pekerjaan tertanam. Saya mendorong Anda untuk mencerahkan saya dengan sebuah jawaban!
Praxeolitic
2
Begitu sebuah standar ditetapkan, standar itu akan berlaku selamanya. Terkadang lebih dari 2000 tahun .
Doc Brown
1
@DocBrown Tetapi perhatikan bahwa halaman itu menjelaskan bahwa klaim bahwa ini adalah standar berusia 2000 tahun adalah salah.
Jesper
1
Ketika Anda melihat sesuatu seperti ini, pertanyaan pertama yang harus Anda tanyakan adalah, "Platform apa yang dimaksudkan untuk ditargetkan?", Diikuti oleh, "Versi C apa yang dapat dikompilasi pada / untuk platform tersebut )? " Kemudian muncul, "Versi C mana yang paling cocok dengan persyaratan proyek?" Dan yang berikutnya mungkin adalah, "Versi C apa yang merupakan mayoritas dari proyek yang paling dikenal?"
Justin Time - Pasang kembali Monica

Jawaban:

14

... "yang lebih tua dan terstandarisasi selalu lebih portabel dan lebih baik" yang konyol ...

Pernyataan itu mencapai konyol ketika menjadi lebih baik , yang sepenuhnya subjektif. Anda tidak memilih bahasa dan standar untuk suatu proyek karena setengah dari orang pada pertemuan terakhir yang Anda gunakan menggunakannya; Anda mengambilnya karena Anda telah mempelajari dan memahami masalah yang Anda selesaikan dan memutuskan bahwa itu adalah alat yang tepat untuk pekerjaan itu.

Untuk standar secara umum, ada kasus yang dibuat pada beberapa proyek untuk portabilitas, dan di situlah memilih yang lebih tua memiliki beberapa manfaat. Ini terutama benar ketika Anda mengembangkan perpustakaan sebagai produk, yang merupakan sarana untuk tujuan orang lain. Hal terakhir yang ingin Anda lakukan adalah menulis sesuatu yang tidak bisa Anda jual karena membutuhkan kompiler yang belum pernah Anda temui pelanggan mungkin belum tersedia. Komentar Philip Kendall tentang dunia yang tertanam sangat tepat; ada banyak hal yang terjadi, baik karena orang masih harus menulis kode baru untuk platform lama yang stabil atau yang tidak mendapat manfaat dari fitur tambahan dan tidak mendapatkan kompiler yang terbaru. Ketika Anda memegang kendali penuh atas setiap aspek proyek Anda, ada '

Khusus untuk C, ada pertanyaan tentang apa yang Anda dapatkan sebagai imbalan kepatuhan terhadap standar terbaru. Transisi K & R-ke-C89 adalah perubahan besar yang membutuhkan banyak upaya untuk membersihkan kode lama tetapi pada akhirnya melakukan banyak hal baik. The perubahan C99 dan C11kecil dibandingkan, dan sebagian besar pertemuan CI yang baru dikembangkan masih akan melewati C89 karena tidak menggunakan fitur baru. Sulit untuk berpendapat bahwa mengamanatkan C99 lebih dari C89 akan menjadi hal yang benar untuk dilakukan karena mendukung komentar satu baris, memiliki tipe data Boolean asli dan dapat melakukan array panjang variabel. Komentar dan Boolean memiliki solusi yang tidak jelek dan VLA dapat ditangani dengan cara lain yang sedikit kurang efisien. C11 mendemosikan VLA menjadi opsional, dan itu mungkin menjadi alasan untuk memilih C99 lama jika mereka menonjol dalam implementasi Anda.

Blrfl
sumber
3
Nah, menggabungkan deklarasi dan pernyataan variabel cukup baik untuk kelengkapan. Inline-fungsi, dukungan unicode terbatas dan long longjuga bagus untuk dimiliki.
Deduplicator
Juga, multithreading terkadang menyenangkan ...
Deduplicator
@Dupuplikator Saya tidak setuju bahwa apa yang ada di C99 dan C11 adalah peningkatan. Anda dapat menulis semua C11 yang Anda inginkan jika Anda dapat membuat kasus bisnis dengan nilai bagus untuk dimiliki melebihi nilai portabilitas ke lingkungan yang lebih tua. Tuliskan di bawah "pelajari masalahnya dan temukan alat yang tepat untuk pekerjaan itu."
Blrfl
2
Nah, intinya adalah Anda tidak benar-benar menyebutkan peningkatan penting .
Deduplicator
@Deduplicator: Saya sedang menulis kode multi-threaded pada 1990-an. Kode yang bergantung pada fitur threading berbasis bahasa mungkin tidak dapat digunakan pada implementasi berdiri bebas yang tidak dapat mendukung semua yang dibutuhkan Standar, sementara kode yang menggunakan pustaka untuk membungkus fungsi platform yang mendukung fungsionalitas yang mereka butuhkan akan dapat diadaptasi ke platform apa pun yang mendukung fungsi tersebut .
supercat
10

Ketika portabilitas di berbagai platform sangat penting. Itu mungkin termasuk platform usang, dan banyak prosesor tertanam yang hanya tersedia kompiler minimalis.

Ada juga arti di mana C89 adalah "penyebut umum terendah". Itu adalah versi standar pertama yang benar, dan cukup banyak kompiler yang digunakan saat ini dapat diasumsikan mengimplementasikan beberapa superset dari C89.

Ada juga masalah bahwa Microsoft Visual C ++, sementara itu relatif baik dalam menjaga dengan standar C ++, terjebak di C89 untuk waktu yang lama ketika dalam mode C. Jadi siapa pun yang tidak menggunakan Visual Studio terbaru mungkin terbatas pada C89.

Simon B
sumber
Ya, argumen yang mendukung adalah portabilitas tetapi pertanyaannya adalah apakah sebenarnya ada sistem non-hipotetis yang hanya dapat menggunakan kompiler C89 tetapi sedang menyusun distribusi perangkat lunak baru. mis. Jika saya memulai proyek C baru, bagaimana saya memutuskan apakah mematuhi C89 dapat meningkatkan jumlah pengguna potensial? Titik MSVC baik.
Praxeolitic
1
@Praxeolitic Ini benar-benar pertanyaan apakah Anda membuat kode yang akan digunakan oleh berbagai orang. Karena akan ada banyak orang di luar sana menggunakan kompiler lama, baik karena mereka tidak dapat memutakhirkan, atau karena mereka menganggapnya terlalu banyak risiko dan upaya untuk memutakhirkan.
Simon B
3

Saya harus mengakui bahwa saya masih menulis kode pseudo-C89 (tidak sepenuhnya memenuhi persyaratan C99) terutama karena Microsoft. Saya sangat mengandalkan MSVC untuk sisi Windows dan mereka masih belum sepenuhnya memenuhi persyaratan C99, alih-alih menempatkan sebagian besar fokus mereka pada C ++ 17 dan seterusnya.

Selain itu saya sedang mengerjakan C SDK yang banyak pengembang plugin menggunakan MSVC untuk pengembangan plugin mereka, dan beberapa masih MSVC 2010. Jadi masih ada kompiler populer yang banyak digunakan pada platform yang tidak begitu eksotis (kecuali Anda pertimbangkan Windows eksotis) yang bahkan belum sepenuhnya mengimplementasikan C99. Ketika Anda menargetkan kompatibilitas luas dengan rentang kompiler terbesar (yang merupakan salah satu alasan utama SDK ditulis dalam C dan bukan C ++), masih ada beberapa dari mereka yang banyak digunakan (setidaknya MSVC) yang ketinggalan zaman ketika datang ke dukungan C. Sudah hampir beberapa dekade sejak C99 dan kami masih belum memiliki VLA, misalnya, di MSVC AFAIK (belum memeriksa MSVC 2017, tetapi mengingat sikap Microsoft pada C, saya ragu itu jauh lebih sesuai dengan C99) .

Dan sayangnya masih ada kompiler baru yang sebenarnya cukup bagus dengan pengoptimal yang baik dan debugger yang bahkan masih belum sepenuhnya memenuhi persyaratan C99. Tentu saja jika bukan karena ini, saya akan melompati C11.

Selain kompatibilitas sumber dengan plugin dan MSVC, ada juga interop dengan bahasa lain. Beberapa bahasa lain menggunakan SDK melalui FFI, dan beberapa FFI hanya mengerti C89. Mereka mungkin tidak mengerti boolatau _Boolsebagai contoh sederhana ketika mengimpor fungsi dari dylib dan hanya mengerti, katakanlah int,.

Ya, argumen yang mendukung adalah portabilitas tetapi pertanyaannya adalah apakah sebenarnya ada sistem non-hipotetis yang hanya dapat menggunakan kompiler C89 tetapi sedang menyusun distribusi perangkat lunak baru. mis. Jika saya memulai proyek C baru, bagaimana saya memutuskan apakah mematuhi C89 dapat meningkatkan jumlah pengguna potensial?

Hanya memperhatikan yang satu ini tapi agak menggemakan Blrfl, peningkatan produktivitas dengan menggunakan C99 dan C11 tidak begitu besar dalam kasus saya sementara kehilangan kemampuan untuk memungkinkan orang menulis plugin mereka di MSVC bisa menjadi biaya yang sangat besar (terutama karena produk saya bekerja On memiliki pangsa pasar terbesar, sejauh ini, di sisi Windows dan rata-rata pengguna sering membeli dan mengunduh banyak plugin pihak ketiga). Jenis produk yang saya kerjakan hampir setengah jalan antara lingkungan pengembangan untuk programmer / skrip dan produk pengguna akhir untuk seniman, karena begitu banyak orang ingin mengembangkan hal-hal baru di atasnya untuk memungkinkan kemampuan baru dan mencapai efek khusus dari suatu orang baik belum melihat. Jadi dalam kasus saya itu sebenarnya keputusan yang cukup sederhana untuk mendukung C89 setidaknya untuk SDK.

Saya kira Anda harus melihat kompiler di sekitar Anda dan mencoba mencari tahu target demografis Anda. Jika Anda tidak mengembangkan arsitektur plugin untuk Windows atau melakukan pemrograman tertanam apa pun atau mencoba membangun kit pengembangan perangkat lunak yang dapat digunakan oleh berbagai kompiler dan bahasa terluas di luar sana, maka hal itu tentu membuat hal-hal lebih mudah dijangkau untuk C99 + benar jauh. Juga pertimbangkan berapa banyak peningkatan produktivitas yang Anda dapatkan dari formulir C99 dan seterusnya. Saya tidak mendapatkan banyak manfaat dari hal-hal seperti VLA karena saya mengandalkan cara yang cukup sederhana untuk menggunakan stack ketika data cocok dan menumpuk sebaliknya.

Tetapi ada banyak hal di luar sana tertinggal dari kompiler populer seperti MSVC ke FFI dalam bahasa lain yang keren dalam arti bahwa mereka dapat mengimpor dan memanggil fungsi C langsung dari sebuah dylib, tetapi mungkin juga sedikit tertinggal di belakang pada waktu. Jadi ada banyak hal bisnis yang lebih praktis untuk dipertimbangkan, tergantung pada domain Anda, daripada hanya memilih yang lebih tua dan terstandarisasi untuk beberapa jenis estetika.


sumber