вторник, 8 января 2019 г.

[prog.flame] Управление памятью в Rust: придумалась хорошая аналогия

Угораздило меня вляпаться на Хабре в комментарии к статье про Rust. Попытки общения с упоротыми растоманами, принципиально не умеющими воспринимать какую-то другую точку зрения, оставляют специфические ощущения. Но больше всего доставило то, что люди всерьез считают, что в Rust-е какой-то другой механизм управления памятью, не такой, как в C и C++.

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

Итак, давайте посмотрим, как эволюционировали носители для письменности. Грубо, не вдаваясь в дебри истории, просто на уровне банальной бытовой эрудиции.

Сперва были глиняные таблички, папирусы. Где-то береста. Потом уже появилась бумага и бумажные свитки.

И все это похоже на то, как мы управляем памятью программируя на ассемблере.

А потом появилась привычная нам книга. Со обложками, страницами и переплетом. Переход от бумажных свитков к бумажным же переплетенным книгам -- это принципиальное изменение. В дальнейшем бумажная книга так же эволюционировала, и современные печатные книги сильно отличаются от старых рукописных, но принципиально они точно такие же. И, что важно, принцип их использования все еще такой же.

Бумажная книга как раз и будет аналогией к управлению памятью в языках вроде C, C++, Ada, Pascal/Modula-2 и Rust.

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

А электронные книги -- это уже аналогия на языки со сборкой мусора.

Так вот, разница между подходами к управлению памяти в языках без сборки мусора и в языках со сборкой мусора -- это как разница между бумажными и электронными книгами.

Т.е., что в C, что в C++, что в Rust мы используем одинаковые подходы и приемы. Вот точно так же, как мы читаем бумажные книги: переворачивая вручную одну страницу за другой, расставляя закладки, оставляя заметки на полях, иногда вырывая нужные странички и вклеивая их обратно (в том числе и забывая это делать).

Разница состоит в том, насколько надежна конкретная книга и насколько она защищена от нашего вандализма.

Вот чистый C -- это как общая тетрадь или дешевая книга в бумажном переплете. Можно творить все, что захочется. При этом книга запросто может рассыпаться прямо у нас в руках.

Тогда как книга на C++ -- это уже более солидное издание, с хорошим переплетом. Книга может выдержать больше издевательств с нашей стороны. Но ничто не запрещает нам вырывать из нее листы, разодрать ее на части или же пролить на нее чашку кофе.

А вот Rust -- это бумажная книга, обложка, переплет и страницы которой облачены в специальный антивандальный пластик. Мы уже не можем просто так взять и вырвать страницу из книги. Мы не можем даже запись на полях оставить -- на этом хитром пластике обычные карандаши и ручки не оставляют следов. Более того, мы даже не можем раскрыть книгу на 180 градусов (не говоря уже про то, чтобы перегнуть ее пополам, как мы привыкли делать в C/C++): специальная конструкция обложки жестко ограничивает максимальный угол раскрытия.

Понятно, что для такой защищенности пришлось чем-то пожертвовать. Чтобы текст был лучше виден сквозь пластик, пришлось печатать текст шрифтом большего размера, а какие-то слова урезать до двух-трехбуквенных сокращений. Пришлось отказаться от механизма сносок внизу страницы. Книгу можно раскрыть только в одном месте. И т.д., и т.п. В общем-то, ничего критичного, нужно просто приспособиться.

Возможности добраться до бумаги все-таки остались. Для этого пластик в специальных местах можно вскрыть. Но, во-первых, такие действия оставляют хорошо заметные следы. И, во-вторых, вы теряете гарантии, которые дает вам издатель. Книга стала сама по себе закрываться через минуту после открытия? Сами виноваты, пройдитесь по местам, в которых вы вскрывали защитный пластик

Это, собственно и есть та простая мысль, которую я пытался донести в комментариях на Хабре: в Rust-е используется тот же самый механизм управления памятью (т.к. принцип бумажной книги), но ваши возможности угробить книгу неправильно с ней обращаясь резко уменьшены. Так что свою бумажную книгу вы уже просто так на куски не порвете, даже если захотите. Но и никуда от бумажной книги не уйдете.


А теперь можно продолжить эту же аналогию, но уже на востребованность языков без GC в современном мире.

Да, бумажная книга в каких-то областях все еще сохраняет свои преимущества. Скажем, для серьезной работы с несколькими источниками: можно обложиться десятком раскрытых на нужных страницах книг и держать перед глазами сразу несколько нужных нам фрагментов. Бумажная книга не требует подзарядки. В конце-концов бумажную книгу можно использовать и не по назначению :)

Нет, серьезно, в каких-то областях у бумажной книги есть серьезные преимущества. Например, хорошие обучающие книги по фотографии или живописи, большого формата, с иллюстрациями... В электронном виде ты такого ощущения не получишь. Хотя даже в области учебников у электронных книг могут быть серьезные преимущества. Скажем, в электронном самоучителе по игре на пианино ноты можно сопровождать аудиофрагментами-иллюстрациями. А главы про правильную посадку и постановку рук -- видеофрагментами.

Но при этом всем для огромного количества издаваемой сейчас литературы электронный формат -- это то, что нужно. Залил книгу в читалку, просмотрел, понял, что бесполезный шлак, -- удалил и залил другую. Причем это касается не только художественной литературы, но и, например, специализированной. Книги по программированию, в большинстве своем, устаревают за три-четыре года. Нет смысла хранить изданный 15 лет назад толмуд объемом 900 страниц, если за это время он уже несколько раз переиздавался и сейчас актуальное издание содержит 1200 страниц. А грядущее через год обновленное издание будет содержать уже 1400.

Так что, объективно, для каких-то целей бумажные книги хороши. Но это уже не массовый рынок. В массе как раз электронные книги и нужны.

Вот тоже самое происходит и языками программирования. Языки без GC, пусть даже такие безопасные, как Rust, нужны лишь в отдельных нишах. И когда растоманы начинают вещать о том, что Rust хорош и для прикладного программирования, то остается лишь пожать плечами. 30 лет назад, когда компьютеры были гораздо слабее, чем сейчас, и то не было понятно, зачем на C++ или Modula-2 писать расчет зарплат или учет движения остатков по складам. А уж зачем это делать сегодня на Rust-е... Понять решительно невозможно.

Комментариев нет: