среда, 26 декабря 2018 г.

[prog.humour] Открыл статью о Rust, увидел пример кода, закрыл статью о Rust-е ;)

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

Так вот, автор сперва приводит пример кода на Rust-е:

let mut guess = String::new();

io::stdin().read_line(&mut guess)
    .expect("Failed to read line");

let guess: u32 = guess.trim().parse()
    .expect("Please type a number!");

println!("You guessed: {}", guess);

А потом говорит, что можно сделать существенно проще и приводит вот такой аналог:

let mut guess = String::new();
io::stdin().read_line(&mut guess)?;
let guess: u32 = guess.trim().parse()?;
println!("You guessed: {}", guess);

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

При том, что оба примера -- это попытка записать вот такой двустрочник на C#:

var number = int.Parse(Console.ReadLine());
Console.WriteLine($"You guessed: {number}");

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


Если же говорить серьезно, то в последние годы с интересом наблюдаю за двумя хайпами.

Первый хайп происходит вокруг языка Go. Крайне убогий по своим выразительным средствам, но становится все популярнее и популярнее. Причем его убогость и своевременность его появления привели к тому, что на Go можно "просто педалить код" (подробнее эта тема раскрыта здесь). Так что с хайпом вокруг Go мне все понятно и происходящее с Go мне представляется логичным.

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

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

Вот серьезно, где Rust-у с его ручным управлением памяти самое место?

Где-то поближе к ядру ОС. Где-то в middleware. Ну там СУБД какую-нибудь реализовать, MQ-шный брокер. Где-то в области околосистемных или сетевых утилит. Скажем, написать на Rust-е traceroute, fgrep или sshd -- это вполне себе OK. Видео или аудиокодек. Тоже OK. Какую-нибудь Lua- или JavaScript-виртуальную машину. Вполне себе OK.

Даже в вышеперечисленных областях у Rust-а все не так однозначно, поскольку, скажем, при работе с низким уровнем неизбежно придется уходить в unsafe. И этого unsafe будет довольно много, так что аргумент "вы сможете легко обнаружить все небезопасные места просто поискав по ключевому слову unsafe" уже не будет работать.

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

Но вот вне этих весьма специфических и (как мне представляется) не очень денежных ниш, зачем кому-то в здравом уме добровольно отказываться от Java, C#, Scala, Kotlin, Ceylon. Да и даже каких-нибудь OCaml, Haskell или D. Или даже того же Go?

Единственная разумная причина, которая мне видна, -- это докеризация всего и вся. Одно дело помещать в Docker бинарник на несколько мегабайт, как это происходит в случае с Go или Rust-ом. Совсем другое -- не только бинарник приложения, но и несколько десятков мегабайт с JRE или .NET Framework.


Вообще, не смотря на то, что программирование на C++ не представляет для меня лично проблемы и, временами, даже оказывается в удовольствие, зачастую от C++ устаешь. Как от самого языка, так и от его экосистемы (точнее жалкого подобия оной). Но еще больше от количества идиотов среди пользователей C++ (показательные темы недавно были на RSDN-е: раз и два). Поэтому время от времени хочется послать C++ куда подальше и уйти куда-нибудь, где тепло и уютно (как известно, везде хорошо, где нас нет).

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

А вот Rust, не смотря, что за его развитием я наблюдаю последние 3.5-4 года, и код на котором даже более-менее читаю, желание попрограммировать на этом языке не вызывает. Скорее наоборот. Если такое приходит в мейнстрим, значит с индустрией что-то не то и может быть пора задуматься о смене профессии, пока еще не слишком поздно? ;)

PS. Отдельное напоминание тем невменяемым растоманам, которым покажется, что я в очередной раз испражнился на них неприкосновенную святыню: вам прямиком сюда.

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