Глобальное редактирование: извините, ребята, я разозлился и написал много глупостей. Просто старый чудак.
Я хотел верить, что C пощадили, но, увы, начиная с C11, он был приведен в соответствие с C ++. Очевидно, что знание того, что компилятор будет делать с побочными эффектами в выражениях, теперь требует разгадать небольшую математическую загадку, включающую частичное упорядочение последовательностей кода на основе «находится перед точкой синхронизации».
Мне довелось спроектировать и внедрить несколько критически важных встроенных систем реального времени еще в дни K & R (включая контроллер электромобиля, который мог отправить людей врезаться в ближайшую стену, если двигатель не контролировался, 10-тонный промышленный робота, который мог бы раздавить людей до полусмерти, если им не командовали должным образом, и системного уровня, который, хотя и был бы безвреден, имел бы несколько десятков процессоров, высасывающих их шину данных без нагрузки с нагрузкой системы менее 1%).
Возможно, я слишком стар или глуп, чтобы понять разницу между неопределенным и неопределенным, но я думаю, что у меня все еще есть достаточно хорошее представление о том, что означает параллельное выполнение и доступ к данным. По моему, возможно, осознанному мнению, эта одержимость C ++, а теперь и парней C с их любимыми языками, которые берут на себя вопросы синхронизации, является дорогой несбыточной мечтой. Либо вы знаете, что такое одновременное выполнение, и вам не нужны эти штуковины, либо нет, и вы сделаете весь мир одолжением, не пытаясь с ним связываться.
Вся эта куча отвратительных абстракций барьера памяти происходит просто из-за временного набора ограничений многопроцессорных систем кэширования, которые можно безопасно инкапсулировать в общие объекты синхронизации ОС, такие как, например, мьютексы и переменные состояния C ++. предложения.
Стоимость такой инкапсуляции всего лишь незначительное снижение производительности по сравнению с тем, чего в некоторых случаях может достичь использование мелкозернистых специфических инструкций процессора. Ключевое слово (или
volatile
#pragma dont-mess-with-that-variable
для меня, как системного программиста, было бы достаточно заботы, чтобы сказать компилятору прекратить переупорядочивать доступ к памяти. Оптимальный код может быть легко получен с помощью прямых asm-директив для посыпания низкоуровневого драйвера и кода ОС специальными инструкциями для процессора. Без глубоких знаний о том, как работает базовое оборудование (кеш-система или интерфейс шины), вы все равно будете писать бесполезный, неэффективный или неисправный код.
Минутная корректировка volatile
ключевого слова, и Боб был бы всем, кроме самого крутого дядюшки программистов низкого уровня. Вместо этого у обычной банды математиков в С ++ был полевой день, который разрабатывал еще одну непостижимую абстракцию, уступая их типичной тенденции разрабатывать решения, ища несуществующие проблемы и ошибочно определяя определение языка программирования со спецификациями компилятора.
Только на этот раз изменение потребовало также ослабить фундаментальный аспект C, поскольку эти «барьеры» должны были генерироваться даже в низкоуровневом коде C, чтобы работать должным образом. Это, помимо всего прочего, нанесло ущерб определению выражений без каких-либо объяснений или оправданий.
В заключение следует отметить, что тот факт, что компилятор может генерировать согласованный машинный код из этого абсурдного фрагмента C, является лишь отдаленным следствием того, как ребята из C ++ справлялись с потенциальными несоответствиями систем кэширования в конце 2000-х годов.
Это привело к ужасной путанице в одном фундаментальном аспекте C (определение выражений), так что подавляющее большинство программистов на C - которым наплевать на системы кэширования, и это правильно - теперь вынуждены полагаться на гуру для объяснения Разница между a = b() + c()
и a = b + c
.
Попытка угадать, что будет с этим неудачным массивом, в любом случае будет чистой потерей времени и усилий. Независимо от того, что компилятор сделает из этого, этот код патологически неверен. Единственная ответственная вещь, которую нужно сделать, это отправить ее в мусорное ведро.
Концептуально, побочные эффекты всегда могут быть исключены из выражений, с тривиальной попыткой явно разрешить изменение до или после оценки в отдельном утверждении.
Этот дерьмовый код мог быть оправдан в 80-х годах, когда нельзя было ожидать, что компилятор что-то оптимизирует. Но теперь, когда компиляторы давно стали более умными, чем большинство программистов, все, что остается, - это кусок дерьмового кода.
Я также не понимаю важность этой неопределенной / неопределенной дискуссии. Либо вы можете положиться на компилятор для генерации кода с единообразным поведением, либо вы не можете. Называете ли вы это неопределенным или неопределенным, кажется спорным вопросом.
По моему, возможно, обоснованному мнению, C уже достаточно опасен в своем состоянии K & R. Полезной эволюцией будет добавление мер безопасности на основе здравого смысла. Например, используя этот усовершенствованный инструмент анализа кода, спецификации заставляют компилятор, по крайней мере, генерировать предупреждения о беккерах, вместо того, чтобы молча генерировать код, потенциально ненадежный до крайности.
Но вместо этого ребята решили, например, определить фиксированный порядок оценки в C ++ 17. Теперь каждый программный дурак активно настроен на то, чтобы целенаправленно добавлять побочные эффекты в свой код, греясь в уверенности, что новые компиляторы будут охотно обрабатывать обфускацию детерминистическим способом.
K & R была одним из настоящих чудес компьютерного мира. За двадцать баксов вы получили исчерпывающую спецификацию языка (я видел, как отдельные люди пишут полные компиляторы, просто используя эту книгу), отличное справочное руководство (оглавление обычно указывает вам на пару страниц ответа на ваш вопрос). вопрос), и учебник, который научит вас разумно использовать язык. В комплекте с обоснованиями, примерами и мудрыми словами предупреждения о многочисленных способах злоупотребления языком, чтобы делать очень, очень глупые вещи.
Уничтожение этого наследия ради такой маленькой выгоды кажется мне жестокой тратой. Но, опять же, я вполне могу не понять суть полностью. Может быть, какая-то добрая душа могла бы указать мне на пример нового кода на С, который бы получил значительное преимущество от этих побочных эффектов?