Глобальна редакція: вибачте, хлопці, я все звільнив і написав багато дурниць. Просто старий мотоцикл.
Я хотів би повірити, що С був пошкоджений, але на жаль, оскільки C11 його прирівнювали до C ++. Мабуть, знаючи, що компілятор буде робити з побічними ефектами в виразах, зараз потрібно вирішити невелику загадку математики, що включає часткове впорядкування послідовностей коду на основі "розташована перед точкою синхронізації".
Я, здається, розробив і впровадив кілька критичних вбудованих систем у реальному часі ще за дні K&R (включаючи контролер електричного автомобіля, який міг би відправити людей, що врізалися в найближчу стіну, якщо двигун не перевіряли, 10 тонн промислового робот, який міг би притиснути людей до целюлози, якщо це не було належним чином, і системний рівень, який, хоч і нешкідливий, мав би кілька десятків процесорів, які висмоктують шину даних із сухою системою менше ніж на 1%.
Я можу бути занадто старечим або дурним, щоб зрозуміти різницю між невизначеним та не визначеним, але я думаю, що все ще маю досить гарне уявлення про те, що означають паралельне виконання та доступ до даних. На мою, напевно, поінформовану думку, ця одержимість C ++ і тепер хлопці C зі своїми домашніми улюбленцями, що займаються питаннями синхронізації, - це дорога мрія. Або ви знаєте, що таке одночасне виконання, і вам не потрібна жодна з цих штучок, або ви цього не робите, і ви зробили б світові в цілому послугу, не намагаючись з цим возитися.
Весь цей навантажувач абстракцій бар'єрної пам’яті, що викликає очей, просто пов'язаний з тимчасовим набором обмежень кеш-систем багатопроцесорного процесора, всі вони можуть бути безпечно інкапсульовані в загальні об'єкти синхронізації ОС, наприклад, мутекси та змінні умови C ++ пропозиції.
Вартість цієї інкапсуляції - це лише хвилинне падіння продуктивності порівняно з тим, чого можна досягти за допомогою дрібнозернистих конкретних інструкцій процесора - це деякі випадки.
Thevolatile
Ключове слово (або#pragma dont-mess-with-that-variable
для всіх я, як системний програміст, дбаю) було б цілком достатньо, щоб сказати компілятору припинити переупорядкування доступу до пам'яті. Оптимальний код може бути легко створений за допомогою директив прямих asm для посилення драйвера низького рівня та коду ОС за допомогою спеціальних інструкцій CPU. Без глибокого знання про те, як працює базове обладнання (кеш-система чи інтерфейс шини), ви все одно зобов’язані писати марний, неефективний чи несправний код.
Хвилинне коригування volatile
ключового слова та Боб було б всім, окрім дядька найсміливіших програмістів низького рівня. Замість цього звичайна банда вивідок математики C ++ мала день польового проектування ще однієї незрозумілої абстракції, поступаючись їх типовій тенденції до розробки рішень, які шукають неіснуючі проблеми та помиляються на визначенні мови програмування із специфікаціями компілятора.
Тільки цього разу зміна вимагає також обмеження фундаментального аспекту С, оскільки ці "бар'єри" повинні були бути створені навіть у коді низького рівня, щоб нормально працювати. Це, крім усього іншого, спричинило хаос у визначенні виразів, без жодних пояснень чи обґрунтування.
Як висновок, той факт, що компілятор міг створити послідовний машинний код з цього абсурдного фрагмента C, є лише віддаленим наслідком того, як хлопці C ++ впоралися з потенційними невідповідностями кеш-систем кінця 2000-х.
Це зробило жахливий безлад одним із фундаментальних аспектів C (визначення виразу), так що переважна більшість програмістів на C - які не гребують кеш-системами, і це справедливо - тепер змушені розраховувати на гуру, щоб пояснити різниця між a = b() + c()
і a = b + c
.
Спроба здогадатися, що станеться з цього нещасного масиву, це все одно чиста втрата часу та зусиль. Незалежно від того, що з цього зробить компілятор, цей код є патологічно неправильним. Єдине відповідальне, що з цим потрібно зробити, - це відправити його у смітник.
Концептуально побічні ефекти завжди можуть бути витіснені з виразів, при цьому банальні зусилля явно дозволяють модифікації відбуватися до або після оцінки, в окремому висловлюванні.
Цей вид лайного коду, можливо, був виправданий у 80-х, коли ви не могли очікувати, що компілятор щось оптимізує. Але тепер, коли компілятори вже давно стали розумнішими, ніж більшість програмістів, все, що залишилося, - це фрагмент лайного коду.
Я також не розумію важливості цієї невизначеної / не визначеної дискусії. Або ви можете покластися на компілятор для створення коду з послідовною поведінкою, або ви не можете. Незалежно від того, чи називаєте ви це невизначеним чи невизначеним, схоже на суперечку.
На мій, напевно, поінформований погляд, C вже достатньо небезпечний у своєму стані K&R. Корисною подією було б додати заходи безпеки здорового глузду. Наприклад, використовуючи цей просунутий інструмент аналізу коду, технічні характеристики змушують компілятор впроваджувати принаймні генерувати попередження про код коробки, замість того, щоб мовчки генерувати код, потенційно ненадійний до крайності.
Але замість цього хлопці вирішили, наприклад, визначити фіксований порядок оцінювання в C ++ 17. Тепер кожен програмний імбецил активно спонукає спеціально застосовувати побічні ефекти у своєму коді, ґрунтуючись на впевненості, що нові компілятори охоче поводяться з обтурацією детерміновано.
K&R була однією з справжніх дивовижних ситуацій у світі. За двадцять баксів ви отримали вичерпну специфікацію мови (я бачив, як окремі люди пишуть повні компілятори лише за допомогою цієї книги), чудовий довідник посібника (зміст, як правило, вказує вам на пару сторінок відповіді на ваш питання) та підручник, який би навчив вас розумно користуватися мовою. Доповніть обґрунтуваннями, прикладами та мудрими словами попередження про численні способи зловживання мовою, щоб робити дуже-дуже дурні речі.
Знищення цієї спадщини за такий невеликий прибуток для мене здається жорстоким марнотратством. Але знову ж таки я, можливо, не зможу повністю зрозуміти сенс. Можливо, якась душа могла б вказати мені на приклад нового коду С, який суттєво перевага цих побічних ефектів?