Назревает большая революция
May. 30th, 2021 11:14 amМногие вещи в шелле хороши и создают ощущение, что в этой области всё хорошо и правильно. Условный binutils. Маленькие программы с простыми ясными идеями, которыми удобно пользоваться.
Но... Стоит только на секунду задуматься об их изменении, как архаичный autotools ждёт вас. Причём, он ждёт вас почти всюду. От binutils до cpython.
Моё чувство прекрасного страдает при виде m4. При виде поддержки достандартного С (и макросов вокруг этого). При виде невероятного объёма хаков, написанных с софте, у которого модель garbage in - garbage out, и поверх которого пытаются "сохранить инварианты" в более приличном софте.
У меня ощущение, что это революционная ситуация.
Если раньше у нас не было критической массы софта, который бы решал те, низкоуровневые проблемы, которые раньше решал C (т.е. хочешь системно - вот тебе, падаван, m4, automake, и шуруй воевать с ./configure), и особо вариантов не было, то теперь я вижу альтернативы с более адекватным lore. Это и go, и rust, и (может быть?) swift. Хотя ладно, кого я обманываю. Rust. Его красота - не в "borrow-checker'е", как любят описывать неофиты. Его красота в разумности базовых предположений до самого низа. Спускаясь с красот "асинхронного веб-сервера с job-stealing многозадачностью" до скучных вопросов "каким образом бинарник знает какой номер у сисколла для записи в fd" (если вы этот путь проделаете на условной node, вам будет очень печально), так вот, проделав этот путь, не ощущаешь острого диссонанса от "ненадлежащих средств". (Если что, там снизу libc, так что финальный слой у Rust такой же как у всех, но всё над ним - весьма добротно).
Так вот, революция начнёт происходить из-за awk-дисфории при соприкосновении с внутренностями существующих программ.
Я не знаю, сможет ли сообщество выдержать высочайший уровень инженерной продуманности Rust, но пока что от знакомства с его потрошками (и потрошками всего, что рядом) нет того же ощущения, как от доисторического Си.
Но... Стоит только на секунду задуматься об их изменении, как архаичный autotools ждёт вас. Причём, он ждёт вас почти всюду. От binutils до cpython.
Моё чувство прекрасного страдает при виде m4. При виде поддержки достандартного С (и макросов вокруг этого). При виде невероятного объёма хаков, написанных с софте, у которого модель garbage in - garbage out, и поверх которого пытаются "сохранить инварианты" в более приличном софте.
У меня ощущение, что это революционная ситуация.
Если раньше у нас не было критической массы софта, который бы решал те, низкоуровневые проблемы, которые раньше решал C (т.е. хочешь системно - вот тебе, падаван, m4, automake, и шуруй воевать с ./configure), и особо вариантов не было, то теперь я вижу альтернативы с более адекватным lore. Это и go, и rust, и (может быть?) swift. Хотя ладно, кого я обманываю. Rust. Его красота - не в "borrow-checker'е", как любят описывать неофиты. Его красота в разумности базовых предположений до самого низа. Спускаясь с красот "асинхронного веб-сервера с job-stealing многозадачностью" до скучных вопросов "каким образом бинарник знает какой номер у сисколла для записи в fd" (если вы этот путь проделаете на условной node, вам будет очень печально), так вот, проделав этот путь, не ощущаешь острого диссонанса от "ненадлежащих средств". (Если что, там снизу libc, так что финальный слой у Rust такой же как у всех, но всё над ним - весьма добротно).
Так вот, революция начнёт происходить из-за awk-дисфории при соприкосновении с внутренностями существующих программ.
Я не знаю, сможет ли сообщество выдержать высочайший уровень инженерной продуманности Rust, но пока что от знакомства с его потрошками (и потрошками всего, что рядом) нет того же ощущения, как от доисторического Си.
no subject
Date: 2021-05-31 02:25 pm (UTC)green threads внутри языка - это главная причина, почему они быстрее, чем у ОС.
Основная причина в том, что green threads используют тонкий стек (на стек кладётся/вынимается только то, что нужно для async-переключения). ОС не может делать предположения о формате вызова, используемых регистрах и т.д., так что ОС-поддерживаемые тредовые стеки больше и тяжелее. Я не помню откуда я это знаю, кажется, из презенташки про async'овый rust.
Если библиотека ядра (Rust-библиотека) будет в себя вбирать разницу между версиями ядра, то мы можем получить более-менее стабильное compile-time API, базирующееся на макросах и абстракциях (может быть, даже zero cost abstractions).
На самом деле, даже при полностью нестабильном интерфейсе, Rust приносит много здравого (за счёт разумных дефолтов, ownership, marker threads и т.д.) и упрощает процесс программирования (т.к. меньше вещей о которых нужно беспокоиться). Ну и всякая лингвистическая вкусность, типа выразительных типажей, match, lf let и т.д.
no subject
Date: 2021-05-31 03:27 pm (UTC)ОС может (должно) _назначить_ формат вызова, используемые регистры и всё остальное просто как API.
P.S. Как по мне - ponylang и то интереснее чем rust. Но это так, вкусовщина.
no subject
Date: 2021-05-31 06:02 pm (UTC)Как ОС может назначать формат вызова? Вызова чего? Если компилятор решил, что tail recursion - это jmp, то при чём тут ОС?
Ты с сисколами не путаешь?
no subject
Date: 2021-05-31 06:35 pm (UTC)убогийобычный async/await.Просто я человек испорченный Go/Erlang и привык что оно как минимум M:N и мне не надо руками расставлять yeld() (за исключением случаев, когдя я точно знаю что оно тут нужно и явно принесёт пользу).
И разговор про вызовы/API я вел именно со стороны зелёных тредов.
no subject
Date: 2021-06-01 02:15 pm (UTC)Я не понимаю о чём ты говоришь.
Зелёные треды "зелёные" потому, что у них тонкий стек. Стек тонкий, потому что компилятор точно знает, какие переменные сохранять, какие нет, и о чём идёт речь, вплоть до jmp без сохранения регистров.
Притаскивание сюда ОС (а, на самом деле, аппаратного переключения контекстов в процессоре) всё замедлит, потому что процесс должен быть достаточно устойчивым, чтобы ничего не ронять за пределами процесса вне зависимости от усилий процесса.
При чём тут эрланг - я вообще не понимаю. Эрланг - интерпретируемый язык, который исполняется интерпретатором байт-кодов (beam.smp). Сравнивать реальный код и волшебный мир в котором кто-то за тебя всё сделал - ну, можно.
Я вот в питоне могу сделать eval. А Rust - не могу. Какой плохой раст, да.