Rust *
Мультипарадигмальный компилируемый язык
Rust 1.46.0: track_caller и улучшения const fn
Команда Rust рада объявить о новой версии Rust 1.46.0. Rust — это язык программирования, который позволяет каждому создавать надёжное и эффективное программное обеспечение.
Если у вас установлена предыдущая версия Rust через rustup, получить Rust 1.46.0 так же просто, как:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта и ознакомиться с подробными примечаниями к выпуску 1.46.0 на GitHub.
Что вошло в стабильную версию 1.46.0
Этот выпуск достаточно небольшой, с улучшениями в const fn
, стабилизацией двух новых API в стандартной библиотеке и одной опции, удобной для авторов библиотек. Смотрите подробные примечания к выпуску чтобы узнать о других изменениях, не представленных в данном анонсе.
Rust vs. State
Важно: для комфортного прочтения статьи нужно уметь читать исходный код на Rust и понимать, почему оборачивать всё в Rc<RefCell<...>>
— плохо.
Введение
Rust не принято считать объектно-ориентированным языком: в нём нет наследования реализации; инкапсуляции на первый взгляд тоже нет; наконец, столь привычные ООП-адептам графы зависимостей мутабельных объектов здесь выглядят максимально уродливо (вы только посмотрите на все эти Rc<RefCell<...>>
и Arc<Mutex<...>>
!)
Правда, наследование реализации уже как несколько лет считают вредным, а гуру ООП говорят очень правильные вещи вроде "хороший объект — иммутабельный объект". Вот мне и стало интересно: насколько хорошо объектное мышление и Rust сочетаются друг с другом на самом деле?
Первым подопытным кроликом станет паттерн State, чистой реализации которого и посвящена эта статья.
Закладывая фундамент будущего Rust
Rust был задуман в 2010 (в зависимости от того, как вы считаете, можно сказать, что в 2006!) как проект в Mozilla Research, но его долгосрочной целью было создание самостоятельного проекта. В 2015, вместе с выпуском Rust 1.0, появилось управление, независимое от Mozilla. С тех пор Rust работает как автономная организация, а Mozilla выступает в качестве известного и постоянного финансового и юридического спонсора.
Mozilla была и продолжает восторгаться от возможности широкого использования и поддержки языка Rust многими компаниями в отрасли. Сегодня многие компании, как крупные так и малые, используют Rust более разнообразными и значительными способами: от Amazon’s Firecracker до Fastly’s Lucet, в критических службах, которые "снабжают энергией" Discord, Cloudflare, Figma, 1Password и многие, многие другие.
Во вторник, 11 августа 2020 года, Mozilla объявила о реструктуризации компании и увольнении около 250 сотрудников, включая активных участников Rust и Rust сообщества. Понятно, что эти увольнения породили множество путаницы и неуверенности в отношении Rust. Цель этого поста — решить эти проблемы. Также у нас есть важное объявление, о котором сказано дальше!
Истории
Разработка инструмента командной строки: сравнение Go и Rust
Если вам не терпится увидеть код и самостоятельно сравнить один вариант моей программы с другим — то вот репозиторий Go-варианта проекта, а вот — репозиторий его варианта, написанного на Rust.
Опыт конвертирования кода C# в код Rust
Постановка задачи
Код на языке C# нужно перевести в код на Rust. Точнее, требуется такая процедура перевода (разработка продолжается на C#), чтобы в любой момент можно было получить работающий код на Rust. Эту задачу я решал для языков Java, Python, JavaScript и PHP, написав конвертер из C# в эти языки. Концепция такого конвертирования была изложена в статье UniSharping пару лет назад. Я разрабатывал этот конвертер, чтобы переводить код своего проекта SDK Pullenti (лингвистический анализ текста). И подумалось мне: а не замахнуться ли на Rust? Да, слышал разные отзывы, что язык необычный и пр., но попытка же не пытка… Тем более, что у одного из заказчиков группа программистов увлечённо пишет на нём.
Распространённые заблуждения о временах жизни в Rust
(прим. переводчика: времена жизни (lifetimes) — это одна из самых запутанных вещей в Rust, которая часто вызывает затруднение у новичков, даже несмотря на официальную документацию. Разъяснения по отдельным аспектам времён жизни есть, но они все разбросаны по разным источникам и ответам на Stack Overflow. Автор статьи собрал в одном месте и разъяснил множество связанных с временами жизни вопросов, что и делает эту статью столь ценной (я и сам почерпнул новое для себя отсюда). Я решил перевести её, чтобы дать возможность прочитать её тем, кто не владеет английским в достаточной степени, чтобы свободно читать оригинал, а также для того, чтобы повысить известность этой статьи среди русскоязычного Rust-сообщества)
19 мая 2020 г. · 37 минут · #rust · # lifetimes
В поиске вопросов, или как создать новый отладчик
Мы уделяем много внимания инструментам разработки: участвуем в горячих спорах о редакторах (Vim или Emacs?), долго настраиваем IDE под свой вкус, и тщательно выбираем языки программирования и библиотеки, которые с каждым днем становятся все лучше и удобнее. Однако, здесь можно выделить одну категорию, которая по какой-то причине остается незаслуженно забытой: отладчики не сильно изменились за последний десяток лет, хотя по-прежнему являются одним из базовых инструментов для отлова ошибок и навигации в коде.
Изображение: Timothy Dykes @timothycdykes, unsplash.com
Гораздо чаще мы предпочитаем быстро добавить пару print
ов вместо того, чтобы поставить в нужном месте точку останова и пройтись к ней отладчиком — и вопрос "почему?" не перестает меня занимать — ведь логи и print
ы дают ограниченную информацию и не позволяют интерактивно взаимодействовать с запущенным процессом (а отладчики могут работать даже и с "умершими" процессами!).
Одной из главных причин я вижу как раз отсутствие значительного прогресса в разработке отладчиков.
Rust 1.45.0: стабилизация функциональных процедурных макросов, исправление дефектов преобразования
Команда Rust рада сообщить о выпуске новой версии, 1.45.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup
, то для обновления до версии 1.45.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть на GitHub.
Что вошло в стабильную версию 1.45.0
Данный выпуск содержит два больших изменения: исправление давних дефектов при преобразовании между целыми числами и числами с плавающей точкой и стабилизация фич, необходимых для того, чтобы как минимум один веб-фреймворк смог работать на стабильном Rust.
Как переписать код на Rust
В большинстве языков вам придётся переписывать всю библиотеку с нуля, а первые результаты появятся ближе к концу проекта. Такие порты, как правило, довольно дороги и подвержены ошибкам, а часто они выходят из строя на полпути. Джоэл Сполски гораздо лучше меня объясняет это в статье о том, почему полные переделки проектов — плохая идея.
Однако у Rust есть убийственная особенность, когда речь заходит о таких вещах. Он может вызывать код на языке С без накладных расходов (т. е. среда P/Invoke в C#), и он выставляет функции, которые можно использовать в C так же, как и любые другие функции на языке С. Это открывает дверь для альтернативного подхода:
Портировать библиотеки на Rust по одной функции.
Время в логах
Измерение продолжительности стадий инициализации приложения; времени затраченного на обработку данных; времени отрисовки (рендеринга) и так далее позволяют нам судить о достаточности ресурсов и эффективности нашего решения так какового. Кроме того, часто именно тайминг может указать нам на ошибки при отсутствии явных признаков таковых в логах. Например, если обработка какого-нибудь запроса, занимающая как правило несколько миллисекунд, переодически «ест» больше секунды — это явный повод проверить обработчик запроса.
Поскольку нагружать приложение тоннами логов путь, мягко скажем, сомнительный, то разработчик как правило ставит тайминги именно на критически важные операции. А там где таймингов нет — вам вполне может пригодиться новый функционал в обновлённой версии «смотрелки для логов» chipmunk.
Как я написал интро 4K на Rust — и оно победило
Можете просмотреть демо-версию на Youtube, скачать исполняемый файл на Pouet или получить исходный код с Github.
О нет! Моя Data Science ржавеет
Предлагаем вашему вниманию перевод интереснейшего исследования от компании Crowdstrike. Материал посвящен использованию языка Rust в области Data Science (применительно к malware analysis) и демонстрирует, в чем Rust на таком поле может посоперничать даже с NumPy и SciPy, не говоря уж о чистом Python.
Приятного чтения!
Ближайшие события
Microsoft: Rust является 'лучшим шансом' в отрасли программирования безопасных систем
Источник всех утверждений статьи взят из данной видео-конференции Левика. В ней язык живой, а не "доклад под бумажку". Не поленитесь послушать, чтобы заранее не писать глупости (про теорию заговора и аргессивного продвижения).
Независимо от того, сколько вложений компании-разработчики могут потратить на инструментарий и обучение своих разработчиков, «C++, по своей сути, не является безопасным языком», сказал Райан Левик (Ryan Levick) 'cloud developer advocate' из Microsoft на виртуальной конференции AllThingsOpen в прошлом месяце, объясняя в виртуальной беседе почему Microsoft постепенно переходит с C/C++ на Rust для создания своего инфраструктурного программного обеспечения. И вдохновляет других гигантов индустрии программного обеспечения задуматься о том же.
Имитируем функционал зависимых типов в системе типов Rust
Системы типов — это настоящее безумие.
Некоторое время назад я уже отметился здесь со статьёй, в которой пытался разобрать, какие гарантии в compile-time может дать система типов Rust. Кое-какие интересные моменты удалось выловить уже тогда, однако больше всего меня зацепил весьма развёрнутый комментарий, описывающий некоторые вещи, доступные в зависимо-типизированном Idris.
Разумеется, я не мог остаться в стороне. Результат исследований доступен на github, а детальный разбор — под катом.
Мьютекс в мире асинхронного кода
Фото: James P. Blair/National Geographic Creative
Вы когда-нибудь сталкивались со следующей проблемой в rust, когда использовали std::sync::Mutex
в асинхронном коде?
7 | tokio::spawn(/* some future here */);
| ^^^^^^^^^^^^ future returned by `fut` is not `Send`
|
127 | T: Future + Send + 'static,
| ---- required by this bound in `tokio::task::spawn::spawn`
|
Что делает Rust универсальным языком программирования
Долгое время Rust позиционировался исключительно как язык для системного программирования. Попытки использовать Rust для высокоуровневых прикладных задач зачастую вызывали усмешку у значительной части сообщества: зачем использовать инструмент в том качестве, на которое он не рассчитан? Какая польза от возни с типами и анализатором заимствований (borrow checker), если есть Python и Java со сборкой мусора? Но другая часть сообщества всегда видела потенциал Rust именно как языка прикладного, и даже находила его удобным в использовании для быстрого прототипирования — во многом благодаря его особенностям, а не вопреки им.
Пишем игру «Жизнь» для NES на Rust
Этот пост — о программе на Rust…
$ cargo install conway-nes
…выводящей двоичный файл NES…
$ conway-nes > life.nes
…в котором выполняется конвеевская игра «Жизнь»!
$ fceux life.nes # fceux is a NES emulator
Запустив игру на эмуляторе, нажмите любую кнопку контроллера, чтобы начать заново с рандомизированного состояния.
Пять лет Rust
В этом бардаке, который сейчас происходит в мире, легко забыть, что прошло уже пять лет с выпуска 1.0 в 2015 году! Rust за эти пять лет сильно изменился, так что мы хотели бы вспомнить о работе всех участников сообщества, начиная с момента стабилизации языка.
Напомним, если кто забыл: Rust — это язык программирования общего назначения, который обладает средствами, позволяющими строить надёжное и эффективное программное обеспечение. Rust может быть использован в любой области: от ядра вашей операционной системы до вашего следующего web-приложения. Этот язык полностью построен участниками открытого многоликого сообщества, в основном волонтёрами, кто щедро делился своим временем и знаниями для того, чтобы помочь сделать Rust таким, какой он есть сейчас.
Rust для Java разработчиков
Представляю перевод статьи автора Evan Cameron, которая может помочь Java разработчикам лучше понять отличия и схожесть этих двух языков — оригинал на сайте автора. Не считая себя достаточно опытным Rust разработчиком, я вряд ли смогу аргументированно участвовать в возможных дискуссиях.
Вклад авторов
humbug 810.2RustLangRu 591.6freecoder_xx 468.0PsyHaSTe 460.2m1rko 424.0ozkriff 376.6mkpankov 319.2GRaAL 318.0Bright_Translate 258.8