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