Почему мне нравится изучать Rust как Java-программист

Перевод | Автор оригинала: Mike Bursell

краб Феррис под морем, неофициальный логотип языка программирования Rust

Прошло много времени с тех пор, как я должным образом выучил новый язык - компьютерный или человеческий. Может, лет 25. Этим языком была Java, и хотя мне пока приходилось писать небольшие кусочки C (очень, очень мало) и JavaScript, единственными двумя языками, на которых я написал много реального кода, были Perl и Java.

Я соучредитель проекта Enarx, который почти полностью написан на Rust. Сейчас я называю себя «архитектором», и прошло довольно много времени с тех пор, как я написал какой-либо производственный код. В преддверии Рождества 2019 года я завершил первый значительный проект, который я написал за несколько лет: реализация набора алгоритмов вокруг патентной заявки на Java. Это была хорошая возможность снова погрузиться в код, и мне это очень понравилось.

Вот некоторые из моих мыслей о Rust с точки зрения Java-разработчика с сильным объектно-ориентированным опытом.

1. Rust кажется знакомой

Хотя многие учебные пособия и книги, которые вы там найдете, написаны с учетом C и C++, сходства с Java достаточно, чтобы сделать общий язык знакомым. Два руководства, которые я использую чаще всего, - это The Rust Programming Language (онлайн) и каноническая книга Programming Rust (в формате мертвого дерева), причем в последней часто упоминаются сходства и различия между другими языками и между ними, включая не только C, C++ и Java, а также Python, JavaScript и другие. Такие вещи, как управляющие структуры и типы, достаточно похожи на Java, поэтому они обычно просты для понимания, и, хотя есть некоторые существенные различия, вы сможете довольно просто изучить основы языка. Однако будьте осторожны: одна из самых больших начальных проблем, с которыми я столкнулся, заключается в том, что Rust иногда кажется мне слишком знакомым, поэтому я начинаю пытаться делать что-то неправильно, и мне приходится отступать и пытаться найти способ более идиоматичный по сравнению с Rust. Мне предстоит долгий путь к этому!

2. Ссылки имеют смысл

В Rust вам приходится использовать ссылки, то есть получать доступ к данным по адресу памяти. Откровенно говоря, ссылки на переменные и разыменование переменных никогда не имели для меня особого смысла, когда я смотрел на C или C++, но на этот раз мне кажется, что я понял. Если вы привыкли передавать переменные Java по ссылке и значению и знаете, когда вам нужно предпринять шаги, чтобы сделать это по-другому в конкретных ситуациях, то вы готовы начать понимать ссылки на Rust. Еще одна вещь, которую вам нужно понять, - это то, почему Rust нуждается в их использовании: это потому, что Rust очень, очень осторожен в управлении памятью, и у вас нет сборщика мусора, который бы убирал после вас, куда бы вы ни пошли (как в Java). . Вы не можете передавать строки (например) волей-неволей: Rust будет настаивать на том, чтобы вы знали время жизни переменной, и подумайте о том, когда она будет готова к "отбрасыванию". Это означает, что вам нужно хорошо подумать об объеме, и это вводит сложную концепцию: владение.

3. Право собственности имеет смысл

Честно говоря, я еще не там. Я изучаю и кодирую на Rust меньше двух недель, и я начинаю понимать, что такое право собственности. Для меня (как, я подозреваю, для многих новичков) это большой сдвиг при переходе на Rust с Java или большинства других языков: владение. Как я уже упоминал выше, вам нужно понимать, когда будет использоваться переменная и как долго она будет жить. Однако есть еще кое-что, и действительно получить это - то, что мне как Java-разработчику кажется немного чуждым: вам нужно понимать стек и кучу, различие, которое было достаточно скрыто от меня Java, но то, что многие разработчики C и C++, вероятно, поймут гораздо легче. Здесь не место для объяснения концепции (я нашел диаграммы в Programming Rust особенно полезными), но для управления временем жизни переменных в памяти Rust необходимо знать, какой компонент владеет каждой из них. Это усложняется, когда вы привыкли создавать объекты и создавать их экземпляры с переменными из любого места (как в Java), и требует значительного переосмысления. Сочетание этого с явной маркировкой времен жизни - это самое большое концептуальное изменение, которое мне нужно выполнить прямо сейчас.

4. Cargo полезен

Честно говоря, я не использую самые последние и лучшие инструменты Java должным образом. Когда я начал изучать Java, этого даже не было в версии 1.0, и к тому времени, когда я закончил писать производственный код на регулярной основе, еще не было необходимости подбирать самые последние инструменты, так что, возможно, Java в этом лучше, чем я помню, но встроенные инструменты для управления различными частями проекта Rust, включая зависимости, библиотеки, компиляцию и тестирование, стали откровением. Бинарный файл Cargo просто делает правильные вещи, и удивительно наблюдать, как он выполняет свою работу, когда понимает, что вы, например, внесли изменения в свои зависимости. Он будет выполнять автоматические тесты, автоматически оптимизировать, создавать документацию - так много полезных задач, все в одном пакете. Совместите это с репозиториями Git, и управление проектами станет более разумным и простым.

5. Компилятор потрясающий

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

For more information about this error, try rustc --explain E0308

Когда вы все же попробуете это, вы получите (как правило!) Полезные объяснения и фрагменты кода. Иногда, особенно когда вы все еще работаете над языком, не всегда очевидно, что вы делаете не так, но пробираться через ошибки может помочь вам разобраться в концепциях таким образом, который сильно отличается от сообщений. Я, например, привык получать из инструмента javac.

Вывод

Я не ожидаю, что когда-либо напишу много производственного Rust, или когда-нибудь действительно достигну статуса гуру - на Rust или на любом другом языке, если честно, - но я действительно думаю, что Rust есть что сказать. На протяжении всего моего пути я кивал головой и думал: «Это хороший способ сделать это» или «ах, это имеет гораздо больше смысла, чем то, к чему я привык». Это статья не о том, почему Rust такой хороший язык - их множество - или о том, как лучше всего выучить Rust - их тоже много, - но я могу сказать, что мне это нравится. Это сложно, но одна вещь, на которой сильны все учебники, книги и другие учебные материалы, - это объяснение причин выбора, который делает Rust, и это, безусловно, помогло мне как в решении моих разочарований, так и в попытке усвоить некоторые различия между Java и Rust.

Если я смогу по-настоящему погрузиться в Rust, я, честно говоря, не думаю, что когда-либо снова напишу какую-нибудь Java. Я не уверен, что у меня есть еще 25 лет программирования, но я думаю, что сейчас я с Rust надолго. Я (подающий надежды) Rustacean.

  1. Rust, конечно же, имеет полностью открытый исходный код, и его поддержка сообществом кажется потрясающей.