tgoop.com/gdb_dbg/378
Last Update:
Наткнулся тут на статью с провокационным названием "C is NOT a Low-level language". Она простая и научно-популярная, заканчивается откровенно политическими лозунгами, прославляющими Erlang, но в целом декларирует интересную мысль.
Мысль, что зачастую C, как язык, восхваляют за "близость к железу", дескать системный программист, глядя на свой код на С, легко поймет в какие ассемблерные инструкции этот код будет превращен. И так оно и было лет 50 назад, когда таргетом был PDP-11, а компиляторы были значительно проще
Часть аргументов в статье кивает на сложность современного железа (instruction-level parallelism, который делает идею последовательного исполнения абстрактной; иерархию кэшей, про которую ничего не говорит язык, декларирующий flat memory model, и знание про которую разработчику приходится держать в голове). В принципе справедливо, но не сказать, что у вас есть полный контроль над этими вещами, когда вы пишите на асме (хотя, на x86, например, есть movntdq
и прочие non-temporal hint инструкции).
Другая же часть статьи поинтереснее: она про то, насколько оптимизации в современных компиляторах могут поменять ожидаемый разработчиком сгенерированный код. Среди примеров там довольно вольное обращение с паддингами при scalar replacement структур; замена мертвого кода на явное UB при loop unswitching (хе-хе, это прикольно), и удаление налчека после безусловного разыменования (компилятор может себе это позволить, т.к. если это таки был NULL
, то мы уже на территории UB, а значит может произойти все, что угодно). Почти все примеры корректны с точки зрения С, что-то неожиданное может произойти только тогда, когда в коде уже и так UB, а на что тогда пенять? Ведь это одна из причин существования UB - дать простор оптимизациям.
—
И вот дальше авторы статьи начинают резко хвалить Erlang и мечтать об альтернативном будущем, где люди пишут код в другой парадигме, а я вместо этого хочу вставить свои 5 копеек.
Во-первых, как системный программист, я довольно хорошо понимаю авторов на уровне эмоций. Мне тоже часто хочется сказать: "что этот компилятор себе позволяет, прикрываясь UB?". Ну т.е. если я хочу разыменовать в коде указатель, полученный из литеральной константы, значит мне это зачем-то нужно. Значит я реально хочу исполнить mov rax, [rax]
, когда в rax
физически лежит 42
, вот я его только что туда и положил. Не хочу я слушать про UB, я хочу получить трап, который потом будет обработан в рантайме. Но головой я понимаю, почему в язык введено UB, и что без него половина оптимизаций бы не работала, а перфоманс был бы как в 70-ые. ↓
#дух_машины
BY Алло, это отладочная?
Share with your friend now:
tgoop.com/gdb_dbg/378