Раст не решает каких-либо реальных, практических задач. Цель его существования - это попил бабла и поднятие собственного ЧСВ, путём агрессивного маркетинга с формированием секты и поддержкой правительства. Все заявленные достоинства - это высосанные из задниц эффективных менеджеров мозиллы лозунги, которые не имеют отношения к реальности. В лучшем случае они чрезвычайно преувеличены (и ложны, поскольку подаются в абсолютном ключе, например, "rust guarantee memory safety"), в худшем - контрпруфаются поверхостным анализом за пару минут чтения "наискосок". Ни один сектант тебе не пояснит, почему их раскрученный борроучекер очень хорош и нужен, зачем там два вида шаред_птров или с чего это вдруг биндинги к сишке - это SAFETY. Всё, что они могут тебе промямлить - это голословные утверждения, основанные на ложных предпосылках и лозунги, лозунги, лозунги...
"Rust is blazingly fast"
В качестве аргумента иногда даже можно увидеть апелляцию к бенчмаркам, чьим авторам мы, конечно-же, верим, ведь они никогда не переобувались и вообще эталон честности.[1] Впрочем, то не мешает растопараше сливать даже шлангу, что нас должно очень сильно удивить (нет).
Но если вопрос перфа поставить ребром, то ситуация резко проясняется,[2] учитывая мегаубогую кодогенерацию, сводящуюся к обмазыванию гнутым хинтом always_inline и intrinsic'ами, а также надежду, что "умный оптимизатор свернёт всё нинужное". Этим-же объясняется время его компиляции, на которую жалуются в том числе сами адепты. Раст очень многое делает в рантайме бай дизайн и от бытия унблейзинг слоу говнищем его спасают лишь халявные оптимизации LLVM.
"Rust’s rich type system and ownership model guarantee memory-safety and thread-safety"
Да, САФЕТИ - это то, под личиной чего чаще и усердней всего продвигают раст. И которой в язычке нет, поскольку он сделан криворукими макаками, а не программистами.
Во-первых, memory leaks are memory safe in Rust
, буквально.[3]
Во-вторых, раст использует абсолютно бищапащную libc. Да-да, его "стандартная библиотека" это враппер над сишной либой, который, почему-то, входит в safe-контекст. Да и LLVM написан тоже на не очень-то православных крестах...
В третьих - макросы. Они являются источником огромного количества скама. Заявляется If you wish, you can even toss #![forbid(unsafe_code)] into your code base to statically guarantee that you're only writing Safe Rust
, но тихо умалчиваются две вещи: 1 - этот макрос распространяется ТОЛЬКО в пределах текущего крейта, 2 - он может быть переопределён. Ага, #![allow(unsafe_code)]
и вуаля, мы локально обошли это жесточайшее ограничение. На кой оно тогда вообще нужно? Ну, видимо, чтобы облегчить существование крысам, которые сначала декларируют САФЕТИ, а потом втихую подкладывают свинью.
В четвёртых, первый "ньюанс" из прошлого пункта растоманы также не брезгают абузить и любят прятать все ансейфы в недра либы. Но зато на "фасаде" - всё чистенько и даже можно в очередной раз наврать про сафети.
В пятых, обосрамсы с ансейфами на этом не заканчиваются, ведь, чутка воспользоваться немощностью огрызка растофронта, можно без проблем использовать ансейф там, где формально это не должно быть возможно.[4] То есть, unsafe-контекст может "протечь" в safe через лямбды, что должно наводить на некоторые мысли касательно бищапащности.
В шестых, без ансейфов, как правило, тебе придётся страдать. Причём, как от написания, так и от перфа итоговой программы, потому что многие вещи на сейф-хрусте выразить или нельзя, или можно лишь с помощью чудовищных костылей и обходных путей.
"Раст позволяет работать на низком уровне, используя всю мощь высокоуровневых абстракций"
"Раст это язык системного программирования"
За скобками остаются столь неважные ньюансы, как:
Но помимо прямого противоречия своим же обещаниям, у раста есть также множество пичалек и более локального характера.
as
через as
, as
s'ом погоняет и это усугубляется тем фактом, что в расте нет неявных преобразований: Rust provides no implicit type conversion (coercion) between primitive types
unwrap
через unwrap
, что вполне обходимо с помощью чуть более вменяемых синтаксических конструкций, но поощряется официальной документацией и используется повсеместно, без стыда и оглядки.trait T
для декларации интерфейса, struct S
для полей "класса" и impl T for S
для реализации интерфейса. Это порождает нужду в феноменальном количестве бойлерплейта, который некоторые адепты ещё пытаются выставить в положительном свете, дескать, "так и должно быть".match
это просто "сахарок", просыпанный поверх этой лапши.match
, а прокидывать значение из самой вложенной функции в самую верхнюю вам предлагается старым, дедовским, сишным методом - ручками прописывая провкид на каждом из уровней вложенности. Вот такой он "высокоуровневый ЯП", этот ваш раст.panic!
) можно отловить через catch_unwind, что под капотом реализуется с помощью позаимствованных у LLVM интринсиков. Но только если сама паника не подразумевает abort
, который рушит программу в любом случае."Но это всё равно лучше чем си/си++, где сплошные безногие инвалиды!"
Правда? Ну, как скажете...
Регулярные попытки выглядеть выгодно на фоне ЯПа середины прошлого века, кстати, тоже входят в методичку ржавых сектантов. Они крайне усердно пытаются перевести разговор сначала на сравнение с выдуманным языком "C/C++", а потом вовсе к обсуждению C, тем самым подтверждая применимость к себе поговорки "слышал звон, да не знаю, где он".
Что-то ещё? О да, конечно, держите.
#![allow(unsafe_code)]
это дно? Как бы не так, макроснёй растеры обмазываются не просто по кд, а перманентно. Если увидел хоть один проект объёмом больше хелловорлда на расте без этой дрисни - считай, что ты счастливчик.