GDB_DBG Telegram 378
Наткнулся тут на статью с провокационным названием "C is NOT a Low-level language". Она простая и научно-популярная, заканчивается откровенно политическими лозунгами, прославляющими Erlang, но в целом декларирует интересную мысль.

Мысль, что зачастую C, как язык, восхваляют за "близость к железу", дескать системный программист, глядя на свой код на С, легко поймет в какие ассемблерные инструкции этот код будет превращен. И так оно и было лет 50 назад, когда таргетом был PDP-11, а компиляторы были значительно проще (лет так на 50 непрерывной разработки многими поколениями писателей компиляторов), а оптимизаций было не так много. А вот в современном мире есть множество факторов, которые делают C куда более абстрактным и на самом деле далеким от железа.

Часть аргументов в статье кивает на сложность современного железа (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-ые. ↓

#дух_машины
👍7🔥4🆒3👎1



tgoop.com/gdb_dbg/378
Create:
Last Update:

Наткнулся тут на статью с провокационным названием "C is NOT a Low-level language". Она простая и научно-популярная, заканчивается откровенно политическими лозунгами, прославляющими Erlang, но в целом декларирует интересную мысль.

Мысль, что зачастую C, как язык, восхваляют за "близость к железу", дескать системный программист, глядя на свой код на С, легко поймет в какие ассемблерные инструкции этот код будет превращен. И так оно и было лет 50 назад, когда таргетом был PDP-11, а компиляторы были значительно проще (лет так на 50 непрерывной разработки многими поколениями писателей компиляторов), а оптимизаций было не так много. А вот в современном мире есть множество факторов, которые делают C куда более абстрактным и на самом деле далеким от железа.

Часть аргументов в статье кивает на сложность современного железа (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

View MORE
Open in Telegram


Telegram News

Date: |

Write your hashtags in the language of your target audience. Administrators How to Create a Private or Public Channel on Telegram? During the meeting with TSE Minister Edson Fachin, Perekopsky also mentioned the TSE channel on the platform as one of the firm's key success stories. Launched as part of the company's commitments to tackle the spread of fake news in Brazil, the verified channel has attracted more than 184,000 members in less than a month. Concise
from us


Telegram Алло, это отладочная?
FROM American