Коли нові проекти C повинні націлюватись на дуже старі стандарти C (> 20 років, тобто C89)?


12

Інколи я бачу великі, відносно нові проекти з відкритим кодом з відкритим кодом, орієнтовані на дуже старі стандарти С, як правило, C89. Приклад - системний. Ці проекти мають кмітливих людей на чолі, тому вони, ймовірно, мають гарне обгрунтування цього рішення, про яке я не знаю. Отримавши користь від сумнівів убік, це майже здається, що обґрунтування "старше і стандартизоване завжди більш портативне і краще", що смішно, оскільки логічним висновком було б, що FORTRAN кращий за C, а COBOL - навіть кращий за FORTRAN.

Коли і чому виправдано, щоб нові проекти С були орієнтовані на дуже старі стандарти С?

Я не уявляю сценарій, коли система користувача абсолютно не повинна оновлювати свій компілятор C, але в іншому випадку вільна для встановлення нового програмного забезпечення. Наприклад, версія LTS Debian має пакет gcc 4.6, який підтримує C99 та частину C11. Я думаю, що дивний сценарій повинен існувати, хоча такі програми, як systemd, націлені на цих користувачів.

Найбільш розумний випадок використання, який я можу собі уявити, - це те, коли очікується, що користувачі мають екзотичні архітектури, на яких є лише компілятор C89, але вони готові встановити нове програмне забезпечення. Зважаючи на зменшення різноманітності архітектурних наборів інструкцій, це здається надмірно гіпотетичним сценарієм, але я не впевнений.


10
"Я не уявляю сценарій, коли система користувача абсолютно не повинна оновлювати свій компілятор C, але в іншому випадку вільна для встановлення нового програмного забезпечення." Ви не зробили достатньо вбудованих робіт ;-)
Філіп Кендалл,

2
@PhilipKendall Я не робив жодної вбудованої роботи. Я закликаю вас освітити мене відповіддю!
Праксеоліт

2
Після того, як стандарт буде встановлений, він практично буде вічним. Іноді довше 2000 років .
Док Браун

1
@DocBrown Але зауважте, що на цій сторінці пояснюється, що твердження, що це стандарт 2000 років, помилкове.
Jesper

1
Коли ви бачите щось подібне, першим питанням, яке ви повинні задати, є: "На яку платформу (-и) вона призначена для націлювання?", А потім: "Яку (-ю) версію (-ів) C можна скласти на / для вказаної платформи (-ів) )? " Потім виходить: "Яка версія (и) С забезпечують найбільшу сумісність із вимогами проекту?" І наступним, мабуть, буде наступне: "Яку (-ю) версію (-ів) С більшість представників проекту найбільше знайомі?"
Час Джастіна -

Відповіді:


14

... "старші та стандартизовані завжди більш портативні та кращі", що смішно ...

Це твердження дійшло до смішного, коли воно покращилося , що є абсолютно суб'єктивним. Ви не обираєте мову та стандарт для проекту, тому що половина людей під час останньої зустрічі, на яку ви пішли, використовувала його; Ви вибираєте її, тому що вивчали та розуміли проблему, яку ви вирішуєте, і визначили, що це правильний інструмент для роботи.

Що стосується стандартів взагалі, то для деяких проектів для переносимості слід зробити справу, і саме тут вибір старішого має певну користь. Це особливо актуально, коли ви розробляєте бібліотеки як продукти, які є засобом для досягнення чужої мети. Останнє, що ви хочете зробити, - це написати те, що ви не можете продати, оскільки для цього потрібен компілятор, якого клієнти, яких ви ще не зустріли, можуть не мати. Коментар Філіпа Кендала про вбудований світ помітний; багато чого відбувається, тому що людям все одно доводиться писати новий код для старих, стабільних платформ або тих, які не користуються додатковими функціями і не отримують сучасного компілятора. Коли ви повністю контролюєте кожен аспект свого проекту,

Зокрема, для C є питання, що ви отримуєте в обмін на дотримання останнього стандарту. Перехід від K & R до C89 був великою зміною, яка потребувала великих зусиль для очищення старого коду, але в кінцевому рахунку принесла багато корисного. Ці зміни в C99 і C11порівняно незначні, і більшість нещодавно розроблених зустрічей CI все-таки передаватимуть C89, оскільки він не використовує нові функції. Важко заперечити, що мандатування C99 над C89 було б правильним рішенням, оскільки він підтримує однорядкові коментарі, має вроджений тип даних Boolean і може робити масиви змінної довжини. Зауваження та булеви мають некрасиві способи вирішення, і VLA можна обробляти іншими, менш менш ефективними способами. C11 знизив VLAs на необов'язкові, і це може бути виправданням для вибору старого C99, якщо вони помітно помітні у вашій реалізації.


3
Добре, змішування декларацій змінних та тверджень є досить хорошим для зрозумілості. Вбудовані функції, обмежена підтримка unicode і long longїх також приємно мати.
Дедуплікатор

Крім того, багатопоточне редагування іноді приємно мати ...
Deduplicator

@Deduplicator Я не погоджуюся, що те, що в C99 і C11 - це вдосконалення. Ви можете записати всі потрібні C11, якщо зможете зробити бізнес-випадок для того, щоб вартість приємних для відвідувачів перевищує значення переносимості для старих середовищ. Подайте файл у розділі "вивчіть проблему та знайдіть потрібний інструмент для роботи".
Blrfl

2
Ну, справа в тому, що ви точно не згадали про важливі вдосконалення.
Дедуплікатор

@Deduplicator: Я писав багатопотоковий код у 1990-х. Код, який спирається на мовні функції нанизування різьби, може бути непридатним для незалежних реалізацій, які не можуть підтримувати все, що вимагає Стандарт, в той час як ті, що використовують бібліотеки для перенесення функцій платформи, що підтримують необхідні їм функції, будуть пристосовані до будь-якої платформи, яка підтримує такі функції .
supercat

10

Коли портативність на широкому спектрі платформ важлива. Це може включати застарілі платформи та багато вбудованих процесорів, для яких доступний лише мінімалістичний компілятор.

Існує також сенс, у якому C89 є "найнижчим загальним знаменником". Це була перша належним чином стандартизована версія, і майже будь-який компілятор, який використовується сьогодні, може вважати реалізованим деякий суперсет C89.

Існує також проблема, що Microsoft Visual C ++, хоча він був досить добре в ногу зі стандартами C ++, довгий час затримувався на C89, перебуваючи в режимі С. Тому будь-хто, хто не використовує останню Visual Studio, може бути обмежений C89.


Так, аргумент на користь - це портативність, але питання полягає в тому, чи існують насправді негіпотетичні системи, які можуть використовувати лише компілятор C89, але збирають нові дистрибутиви програмного забезпечення. тобто якби я починав новий проект C, як би я вирішив, чи може прихильність до C89 збільшити кількість потенційних користувачів? Точка MSVC хороша.
Праксеоліт

1
@Praxeolitic Це справді питання про те, чи ви робите код, який використовуватиме широкий спектр різних людей. Тому що там буде багато людей, які використовують старі компілятори, або тому, що вони не можуть оновити, або тому, що вважають це занадто великим ризиком і зусиллями для оновлення.
Саймон Б

3

Треба визнати, що я все ще пишу код псевдо-C89 (не повністю сумісний з C99), головним чином завдяки Microsoft. Я сильно сперся на MSVC для Windows, і вони все ще не повністю сумісні з C99, замість цього основну увагу зосереджую на C ++ 17 і далі.

Крім того, я працюю над C SDK, проти яких багато розробників плагінів використовують MSVC для розробки плагінів, а деякі все ще MSVC 2010. Отже, все ще є популярні компілятори, які широко використовуються на платформах не настільки екзотично (якщо ви не враховуєте Windows екзотика), які ще не повністю реалізують C99. Якщо ви орієнтуєтесь на широку сумісність із найбільшим колом компіляторів (що є однією з головних причин, за якими SDK пишеться на C, а не на C ++), все ще є низка їх широкого використання (принаймні MSVC), які відстають від часу коли мова йде про підтримку C. З моменту C99 пройшло майже пару десятиліть, і у нас все ще немає VLA, наприклад, в MSVC AFAIK (ще не перевіряли на MSVC 2017, але, враховуючи позицію Microsoft щодо C, я сумніваюся, що він набагато більше відповідає C99) .

І тому є, на жаль, нові компілятори, які насправді непогані з хорошими оптимізаторами та налагоджувачами, які ще не повністю сумісні з C99. Звичайно, якби не це, я б стрибав по всьому C11.

Окрім сумісності джерел із плагінами та MSVC, існує також взаємодія з іншими мовами. Деякі інші мови використовують SDK через FFI, а деякі з цих FFI розуміють лише C89. Вони не могли зрозуміти , boolчи в _Boolякості простого прикладу при імпорті функцій з dylib і зрозуміти тільки, скажімо, int.

Так, аргумент на користь - це портативність, але питання полягає в тому, чи існують насправді негіпотетичні системи, які можуть використовувати лише компілятор C89, але збирають нові дистрибутиви програмного забезпечення. тобто якби я починав новий проект C, як би я вирішив, чи може прихильність до C89 збільшити кількість потенційних користувачів?

Щойно зауважив це, але такий собі лунає Blrfl, підвищення продуктивності за допомогою C99 та C11 не є настільки величезним у моєму випадку, тоді як втрата можливості дозволити людям писати свої плагіни в MSVC може бути величезною вартістю (тим більше, що продукт, над яким я працюю на сьогодні має найбільшу частку ринку на стороні Windows, і середній користувач часто купує та завантажує багато плагінів сторонніх розробників). Продукт, над яким я працюю, знаходиться майже на півдорозі між середовищем розробки для програмістів / скриптерів та продуктом для художників, що користується кінцем, оскільки так багато людей хочуть розробляти нові речі, щоб забезпечити нові можливості та досягти особливих ефектів добрих людей ще не бачили. Тож у моєму випадку це було насправді досить просте рішення віддати перевагу C89 принаймні для SDK.

Я припускаю, що вам слід поглянути на компілятори навколо вас і спробувати визначити вашу цільову демографічну. Якщо ви не розробляєте архітектуру плагінів для Windows або займаєтесь вбудованим програмуванням або намагаєтесь створити комплект для розробки програмного забезпечення, який може використовуватися найширшим набором компіляторів та мов там, то це, безумовно, полегшує пошук C99 + правильно геть. Крім того, можливо, врахуйте, який приріст продуктивності ви отримуєте від форми C99 і далі. Мені не так багато користі від речей, як VLA, оскільки я покладаюсь на досить прості способи використання стека, коли дані підходять і збираються в іншому випадку.

Але є багато всього, що там відстає від популярних компіляторів, таких як MSVC до FFI, іншими мовами, які круті в тому сенсі, що вони можуть імпортувати та викликати функції C безпосередньо з дилібу, але може також трохи відставати на разів. Таким чином, залежно від вашого домену, слід розглянути набагато більше практичних речей, ніж просто віддавати перевагу старшим та стандартизованим для певного естетичного.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.