пятница, 24 апреля 2015 г.

[prog.thoughts] Пятничное про Rust и C++

В последнее время много разговоров ходит о языке Rust. Чего я во всем этом хайпе не понимаю, так это кому именно нужен Rust? Может быть кто-то из читателей поделится в комментариях, откуда проистекает его личный интерес к Rust, какие проекты он хочет делать на Rust, что в итоге хочет получить и почему этого нельзя достичь уже имеющимися средствами. Я же попробую объяснить то, почему же Rust все-таки удерживается где-то в углу моего зрения, но только в дальнем-дальнем углу.

На мой взгляд, существует три серьезных причины кардинальным образом сменить язык реализации:

  1. Новый язык имеет явные и неоспоримые преимущества по сравнению с текущим. Грубо говоря, для выполнения одних и тех же действий, при соблюдении одних и тех же требований к производительности/ресурсопотреблению/переносимости на другом языке вам нужно писать меньше кода, в нем оказывается меньше ошибок, его легче сопровождать, его легче переиспользовать и т.д. Например, сборка мусора, контроль за доступом к памяти и отсутствие адресной арифметики делает разработку компонентного ПО на Java/C# существенно проще, чем на C++. Поэтому создать комбайн вроде Eclipse Development Platform на Java можно в обозримые сроки и при допустимых затратах. Тогда как на C++ это обойдется существенно дороже. А результатом будет что-то вроде Mozilla-вского браузера, который из-за багов, подвисаний и утечек памяти приходится регулярно рестартовать (во многом по вине не очень качественно реализованных add-on-ов, насколько я слышал).
  2. Вы, сколько бы не пытались, не можете нормально выражать свои мысли на используемом вами языке программирования. Так бывает. Кто-то приходит в бешенство от Pascal-евских begin/end и объявлений всех переменных в начале функции. Кто-то искренне не понимает, как можно структурировать текст пробелами. Кто-то ненавидит разделение кода на hpp/cpp-файлы и готов исходить на говно при необходимости наследования класса от двух предков. Дело житейское, у каждого из нас разные темпераменты, разные взгляды на оптимальный способ фиксации своих идей. И, как замечательно сказал Алан Перлис: "There will always be things we wish to say in our programs that in all known languages can only be said poorly." Ведь иногда нормально высказать свою мысль в конкретном языке мы не имеем возможности не только/столько из-за ограничений языка, сколько из-за нашего незнания языка и/или непонимания заложенных в его основу идей.
  3. Новый язык открывает новые возможности застолбить за собой нишу, которую приходится с большим трудом завоевывать в уже сложившейся экосистеме вашего текущего языка. Представьте себе, что вы хотите продвинуть более мощный аналог Maven-а в мире Java. Или, более интересный, в контексте данного разговора пример: вы разрабатываете еще одну библиотеку для работы с TCP/IP сокетами для C++. Вы искренне считаете, что в каких-то моментах она будет удобнее и производительнее, чем Asio, libuv, libev/libevent, ACE и, тем более, POCO. Проблема в том, что потенциальных пользователей среди сотен тысяч (если не миллионов) C++ программистов по всему миру у вас будет всего ничего: большинство C++ников уже используют тот или иной готовый инструмент. И только очень небольшому проценту будет интересна ваша разработка -- в их числе окажутся и патологические искатели всего нового, для которых новизна намного важнее всего остального, и совсем зеленые новички, которые еще не в курсе того, что уже есть, и, наконец, те редкие люди, которые перепробовали разные инструменты, осознали что их не устраивает, и целенаправлено ищут ту библиотеку, которая лучше всего решает их очень специфические проблемы.

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

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

Так вот, если говорить о противопоставлении Rust и C++, то первая причина вряд ли может иметь место здесь и сейчас. Хотя бы просто потому, что даже официального релиза Rust 1.0 еще не было. А уж про зрелость и размер инфраструктуры и экосистем вообще не приходится говорить.

Кроме того, есть у меня подозрение, что язык C++ уже давно был вытеснен из неуютных для него ниш. Началось это в конце 90-х, когда JVM стала серьезно улучшаться в производительности, а использование Java сместилось из никому не нужных Java-апплетов в разработку сервер-сайда. Это вытеснение C++ усилилось с появлением C# и все большим и большим проникновением в мейнстрим динамически типизированных языков. Сначала тех, которые было принято называть скриптовыми, вроде Python и Ruby, а затем и более специализированных, в первую очередь -- JavaScript. Ну и Erlang нельзя не вспомнить.

Все это наложилось на такие факторы, как активное и повсеместное проникновение Web-а, а так же застой в развитии самого языка C++. Массовый отток C++ников на другие языки и другие прикладные направления состоялся в начале-середине 2000-х, а сейчас, спустя десять лет, полагаю, все уже устаканилось. Кто хотел сменить C++ на более удобный для своих задач инструмент, тот уже это сделал. Даже я сам восемь лет назад активно искал адекватную замену C++. Но уже тогда оказалось, что это не так-то и просто. А уж сейчас, когда более-менее нормальная поддержка C++11 есть сразу во всех основных компиляторах, а GCC и clang уже поддерживают C++14 (и это в начале 2015-го, т.е. через год после принятия C++14)... Сейчас и подавно.

Так что у меня нет оснований рассматривать первую причину в качестве основной для C++ников, которые хотят сменить язык на Rust.

Вторая причина...

Имхо, всегда есть небольшой процент маргинальных личностей, у которых небо недостаточно голубое, трава недостаточно зеленая, а масло -- недостаточно масляное. Если одному из таких приходится писать на C++ и он от этого настолько сильно страдает, что постоянно изливает потоки желчи на всех доступных ему профильных форумах, то может быть смена C++ на Rust позволит ему обрести душевный покой. Однако, суть не в конкретном C++ненавистнике. А в их общем количестве и в том, делают ли они погоду или нет. Как по мне, так не делают. Да, набросов на вентилятор в форумных священных войнах много. Реальных проектов, приносящих хоть кому-то какую-то пользу -- пшик.

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

И вот тут-то для меня главная загадка, ответа на которую я не знаю, если противопоставлять Rust современной версии языка C++. Нынешний Rust и C++03 -- там, полагаю, вопрос был бы более интересным. Но вот Rust и C++11...

Причем C++11 не стал принципиально безопаснее, чем C++03. Голые указатели, адресная арифметика, возможность вернуть ссылку на временный объект из метода, возможность дважды удалить один и тот же объект, возможность обращения к неинициализированной переменной и т.д. -- все это осталось в языке. Так что граблей меньше не стало. Другое дело, что использовать язык сейчас настолько проще и удобнее, что допустить подобную грубую ошибку уже сложнее.

Вот поэтому-то и нахожусь в некотором недоумении. Кому и зачем Rust сейчас нужен? Ну кроме Mozilla-овцев. В какого рода проектах от него рассчитывают получить бенефиты и почему этих бенефитов нельзя получить здесь и сейчас (а то и вчера) от C++?

Ну а уж какой интерес к Rust-у у Java/C#/Erlang/JavaScript/Ruby/Python/Haskell/etc разработчиков, я вообще теряюсь в догадках...

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