Что за штука…. Rust?

Ну и сразу вопрос на миллион: что за штука — Rust?

Rust (www.rust-lang.org) — это открытый язык программирования, разработкой которого занимается Mozilla Foundation.

rust language

Язык программирования? Тогда для начала объясните, пожалуйста, почему ‘Rust’ [англ. ржавчина]? По-моему, название дикое.

Официальных комментариев нет, по Сети ходят лишь версии. Самая популярная в том, что Rust предназначен не для хромирования — блестящих внешних компонентов приложений Mozilla — а для внутренней структуры сетевого ПО.

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

Что ж, похоже, что по такой логике, Rust — неплохой вариант. Но, уходя в сторону от имени, зачем вообще нужен новый язык?

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

Звучит, по меньшей мере, амбициозно. Как воплотились эти требования и заявки на практике?

Rust пытается быть ближе к тем, кто программирует на С и С++. Отчасти потому, что он призван, за большинством случаев, вытеснить последние. Так что обеим сторонам имеет смысл взаимно уподобить функции, облегчив разработчикам этот переход. Параллельно, Rust с удовольствием возвращается к использованию методов из многих других языков, таких как Erlang и Go (еще один язык Google, подробнее смотрите на http://qolanq.org), совмещая их и создавая новые.

Erlang — это же тот язык, на котором создается ПО для крупных АТС, так?

Да, все верно. Параллелизм и подобные функции (в различных формах) есть и в Rust, и в Erlang. Однако Erlang — все же другой биологический вид, его в АТС, в обозримом будущем, Rust (как и что-либо еще) не сменит. Потому что, помимо всего прочего, «высокая доступность» в сфере связи и в сфере Интернет понимается по-разному.

А как насчет Go? Это более прямой I конкурент Rust?

Не совсем. Хотя Go и предназначался для на-I писания параллельных интернет-приложений, он решает другие задачи, и иначе, чем Rust. По мнению некоторых программистов, хотя Rust может заменить С и С++ в крупных проектах, Go является наиболее простым и подходящим вариантом для серверного ПО, а также других программ и утилит, которые сегодня пишутся на Python или Java.

Каковы, по вашему, основные функциональные возможности Rust?

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

Хорошо, давайте тогда с параллелизма и начнем.

Иногда параллельное ПО определяют как способное «плодиться» и одновременно запускать множество независимых копий собственных частей, способных взаимодействовать друг с другом. Отметим, что здесь действует совершенно иной принцип, чем когда, допустим, web-сервер одновременно взаимодействует со множеством независимых пользователей! В Rust могут параллельно выполняться тысячи или миллионы легких задач [lightweight tasks], без риска, что крах или зависание одной из них обрушит все приложение, или что единичное вредоносное проникновение поставит под угрозу взлома все личные данные.

Каким образом будут обеспечиваться высокая безопасность и производительность?

Rust затрудняет создание вредоносного кода одним простым способом: чтобы получить тот же уровень «свободы действий», что и в С, вам нужно запросить разрешение, и далее еще поработать, чтобы это стало возможным. Таким образом, Rust должен стать гораздо более безопасным и надежным эквивалентом С, при тех же функциональных возможностях.

То есть в Rust функций намного меньше, чем в других языках?

Нет. В Rust есть и структуры, и указатели, и все прочее, к чему привыкли современные программисты. Просто в нем, по умолчанию, гораздо больше ограничений. Примером может послужить так называемый «контроль изменчивости [mutability control]».

Да уж, звучит как коварная программа генной инженерии; но я полагаю, что это нечто другое…

Да, действительно, похоже на какой-нибудь замысел Umbrella Corporation, но расслабьтесь. Имеется в виду, что в отличие от многих других языков, переменные Rust — вовсе не переменные. Чтобы изменить одну из них, в процессе работы программы, нужно объявить это, используя ключевое слово mut: let mut my_initial_salary = 1000 Другие характеристики, делающие Rust более безопасным, чем, скажем, С или С++ — это параметризация типов и отсутствие null-указателей.

Погодите! Вы сказали, что не будете бросаться терминами, понятными только программистам!

Ну, соврал; но не переживайте. Невозможно представить язык программирования, не вдаваясь в некоторые детали, но все гораздо проще, чем кажется.

Параметризация типов, например, означает, что Rust позволяет, или скорее заставляет вас очень точно определять (то есть параметризовать) ваши основные типы и функции, избегая необходимости постоянно приспосабливать (то есть назначать) несколько стандартных типов переменных.

А как насчет упомянутого отсутствия null-указателей?

Rust запрещает использование указателей (переменных, содержащих адреса других переменных) со значением NULL (если только вы не упросите Rust это сделать). Одно такое ограничение в коде избавляет от целого класса ошибок, прежде омрачавших жизнь программистов на С и С++.

Похоже, что управление памятью в Rust -невероятно сложное занятие…

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

Правда? У меня сложилось впечатление, что разделение данных между разными задачами в Rust вообще невозможно.

Если только вы не пометите все наиболее разгульные части кода как «небезопасные». Таковые смогут использоваться в памяти в более произвольных (то есть опасных) формах.

Но если программисты по-прежнему смогут писать ненадежный код, какой смысл использовать Rust?

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

А как, на практике, Rust может помочь начинающему программисту сделать свой код безопасным?

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

Остался один вопрос: когда мы сможем увидеть приложения Rust в Интернете?

Текущая версия Rust, 0.7, выпущена 3 июля 2013 года. Но независимо от номера версии, Rust — еще очень молодой язык и гораздо менее сложившийся и протестированный на практике, чем тот же Erlang. Так что могу сказать одно: будем надеяться, это будет где-нибудь в 2014. Чтобы быть в курсе последних новостей, обратитесь на официальный сайт: www.rust-lang.ru.