Rust, или дожить бы до зрелости

| рубрика: Заметки | автор: st
Метки: , ,

Разработка ядра Линукса понемногу переходит с Си на Раст (Rust).

Попытки стандартизации начиная с С++11, разумные по замыслу, привели к копированию кода из Boost в стандартную библиотеку и рождению новых монстров в виде рекомендаций "современного" стиля "а-ля Александреску". Активное следование такому подходу легко и непринужденно превращает 50К строк исходников в исполняемый модуль "весом" в 300-500 мегабайт -- запредельная масса кода, многократно перекопированного шаблонами.

Да, многие из нас еще с первого курса вуза помнят, что цикл из 100 итераций с одним вызовом функции внутри выполнится медленнее, чем 100 строк подряд из вызовов той же функции. Но мы также помним, что такой код может в 100 раз может увеличить размер данного модуля.

Люди всерьёз пишут про RAAI в Си++, зная что уже 30 лет не могут решить проблему исключений в деструкторах!

Введение к необходимым всем unique pointers еще и shared вносит в код автоматическую сборку мусора без каких-либо гарантий "зависания" зацикленных на себя через цепочки объектов, разрешаемых в других языках сборщиком этого самого мусора. Кроме того, для оптимальной работы с такими структурами, как кэш, к ним требуются еще и weak pointers. Это лишь один пример из многих.

Скотт Мейерс в "Effective Modern С++" тратит десятки страниц просто для того, что понять "как это вообще работает" и как не выстрелить себе в ногу.

Спецификация новых стандартов 14 и 17 занимает две тысячи страниц! Но в этом "талмуде", нет даже намёка на сетевые коммуникации и работу с базами данных в стандартной библиотеке. Как такое может быть в двадцать первом веке после 35 лет развития?

Торвальдс изначально отказался переводить разработку с Си на Си++ и оказался в итоге прав. Rust -- видимо, единственный наследник ветки языков Си/Си++, в котором многие проблемы Си++ решены, при этом качество и размер генерируемого кода находятся примерно на том же уровне, пригодные для использования даже во встроенных системах.

Динозавры системного программирования тоже не остаются в стороне

Однако, не всё так радужно, как хотелось бы, и для каждой бочки мёда найдётся своя ложка дёгтя.

Первое, что сразу напрягает в Расте -- отсутствие стандарта (language specification). Есть описание языка (language reference), ребята даже начали писать RFC. Но до стандарта в первой версии ещё далеко, и непонятно, будет ли он вообще.

Религиозно настроенные адепты Раста вместо осмысления ситуации часто начинают спекулировать на тему "Зачем вам стандарт, если есть описание?"

Действительно, пока язык и базовая библиотека находятся в развитии, их описание меняется, а сами изменения не всегда обратно совместимы, то нет и необходимости закреплять и детализировать описание на уровне стандарта. Жил ведь Си++ до 1998 года без стандарта, а проблемы привязки к компиляторам разных поставщиков пусть решают сами пользователи.

Второй не менее досадный момент -- длинный список зависимостей с номерами версий, начинающимися на ноль. Религиозный и наивный подходы уповают на бесплатность и открытость таких библиотек. Действительно, забросили авторы свою работу, возьми исходники, сам разбирайся и исправляй критичные для тебя ошибки. Ведь у тебя полно свободного и оплачиваемого времени.

Конечно, есть шанс, что полезную библиотеку не забросят. Но для этого желательно иметь версию 2.х и выше, то есть дорасти до зрелости и подтвержденной полезности. Как правило, с переходом из рук в руки зрелых библиотек проблем не возникает, зато заброшенных поделок с номерами 0.х на гитхабе, как желудей под дубом осенью.

Третье, что стандартные приёмы и шаблоны из Си++ не годятся, надо переучиваться. Не доучиваться, а именно переучиваться, "отряхнув прах с наших ног". При переходе с Си на Си++ наследуемый код компилировался корректно, что послужило громадным подспорьем для многочисленных программистов. С Растом так не получается, совместимости нет никакой: ни концептуальной, ни на уровне кода.

Немного лучше с совместимостью бинарной, однако, итоговый совет: используйте Раст-библиотеки из Си++ как временную меру для постепенного переписывании всей кодовой базы на Расте.

Выводов не воспоследует. Отмечу только, что общение с ребятами из Раст-сообщества отложило впечатление налета религиозности и сектантства. Надеюсь, что ошибочное.