В этой статье я хотел бы поговорить о том, почему вы могли бы предпочесть использование Arc<[T]>
вместо Vec<T>
в качестве варианта по умолчанию в вашем Rust-коде.
Rust *
Мультипарадигмальный компилируемый язык
Новости
Как потерять управление оболочкой… Расследование
Несколько недель назад я занимался хаком языковых серверов в Zed, пытаясь заставить Zed определять, когда заданный бинарник языкового сервера, например gopls
, уже присутствует в $PATH
. Если так, вместо загрузки нового бинарника Zed должен использовать его.
Трудность: часто $PATH
динамически изменяется такими инструментами, как direnv
, asdf
, mise
и другими, которые позволяют в данной папке установить определённый $PATH
. Почему эти инструменты так делают? Потому что это даёт возможность, скажем, в начале $PATH
добавить ./my_custom_binaries
, пока вы находитесь в my-cool-project
. Поэтому нельзя просто использовать $PATH
, связанный с процессом Zed, нужен $PATH
, как он есть, когда выполняется cd
в каталог проекта.
Легко, подумал я. Просто запусти $SHELL
, выполни cd
в проект, чтобы запустить direnv
и всё такое, запусти env
, сохрани окружение, выбери $PATH
, найди в нём бинарники. И это было легко. Вот часть кода, та часть, которая запускает $SHELL
, cd
и получает env
:
fn load_shell_environment(dir: &Path) -> Result<HashMap<String, String>> {
// Получает $SHELL
let shell = std::env::var("SHELL")?;
// Конструирует команду, которую хочется выполнить в $SHELL
let command = format!("cd {:?}; /usr/bin/env -0;", dir);
// Запускает $SHELL как интерактивную оболочку (чтобы использовались файлы пользователя rc).
// и выполняет `command`:
let output = std::process::Command::new(&shell)
.args(["-i", "-c", &command])
.output()?;
// [... проверка кода выхода, получение stdout, превращение stdout в HashMap и т. д. ...]
}
За исключением одного: после запуска экземпляра Zed в терминале, который выполнял эту функцию, я больше не мог убить Zed, нажав Ctrl-C
.
Практическое руководство по Rust. 3/4
Hello world!
Представляю вашему вниманию третью часть практического руководства по Rust.
Руководство основано на Comprehensive Rust — руководстве по Rust
от команды Android
в Google
и рассчитано на людей, которые уверенно владеют любым современным языком программирования. Еще раз: это руководство не рассчитано на тех, кто только начинает кодить 😉
Смотрим на современный инструмент для FPGA
Область разработки для ПЛИС, довольна консервативна и неповоротлива. Поскольку она узкоспециализирована, то новые инструменты и среды появляются редко, а старые инструменты имеют свои слабости в самой своей основе и перекладывать их на новые рельсы уже ни кто не будет. Посмотрим на новый язык и инструмент для ПЛИС разработчиков, который следует современным тенденциям разработки.
Истории
Это слишком опасно для C++
Некоторые паттерны стало возможно использовать на практике только благодаря безопасности Rust по памяти, а на C++ они слишком опасны. В статье приведён один такой пример.
Работая над внутренней библиотекой, написанной на Rust, я создал тип ошибок для парсера, у которых должна быть возможность сделать Clone
без дублирования внутренних данных. В Rust для этого требуется указатель с подсчётом ссылок (reference-counted pointer) наподобие Rc.
Поэтому я написал свой тип ошибок, использовал его как вариант ошибок fallible-функций, и продолжил двигаться дальше.
Cloudflare открыла код Rust-фреймворка для программируемых сетевых сервисов — Pingora
Мы гордимся тем, что открываем исходный код Pingora — фреймворка на Rust, который мы используем для создания сервисов, обеспечивающих значительную часть трафика в Cloudflare. Pingora выпускается под лицензией Apache 2.0.
Обзор библиотеки Actix в Rust
Привет, Хабр!
Actix появился на свет благодаря Николаю Киму, также известного в сообществе под ником fafhrd91. Николай создал экосистему, которая позволяет строить масштабируемые, надежные веб-приложения и микросервисы. Actix основан на модели акторов, концепции, которая была впервые предложена в 1973 году для симуляции активных компонентов в распределенных системах.
Краткий обзор поведенческих паттернов в Rust
Привет, Хабр!
Зачем нужны поведенческие паттерны? Вопрос риторический, но ответ на него кроется в самой сути разработки. Поведенческие паттерны предоставляют нам для решения часто встречающихся проблем взаимодействия между объектами и классами.
Паттерны можно реализовать на любом ЯПе и сегодня рассмотрим, как их реализовать в Rust.
Разработчик-универсал под видом специалиста
С тех пор, как я начал работать на себя, заключая контракты, меня постоянно тяготило то, что, будучи разработчиком-универсалом, на рынке труда мне приходится позиционировать себя как узкого специалиста. Я уже много лет хотел написать об этом и даже делал кое-какие заметки. Решающим же толчком послужила встреченная мной недавно статья Бена Коллинса-Сассмана, хоть она и затрагивает эту тему лишь косвенно.
Ниже я опишу сложности, с которыми мне приходилось сталкиваться. Надеюсь, эта информация окажется полезной для других вольных авантюристов. Прошу учесть, что статья отражает преимущественно мой личный опыт, так что делайте на это скидку.
Как устроен языковой сервер
Здесь описан интересный рекурсивный алгоритм, неоднократно встречающийся в разных аспектах программирования языковых серверов. Я видел реализации такого алгоритма на Kotlin и C#, а затем сам реализовал его на Rust.
Вот, казалось бы, рандомная подборка возможностей IDE:
- Переход к определению
- Завершение кода
- Прогон теста на курсоре
- Извлечение переменной
Что общего между ними? Все эти возможности относятся к актуальному положению курсора! В данном случае вводом служит не только состояние кода в конкретный момент времени, но и конкретное расположение исходников проекта, например src/main.rs:90:2.
Практическое руководство по Rust. 2/4
Hello world!
Представляю вашему вниманию вторую часть практического руководства по Rust.
Руководство основано на Comprehensive Rust — руководстве по Rust
от команды Android
в Google
и рассчитано на людей, которые уверенно владеют любым современным языком программирования. Еще раз: это руководство не рассчитано на тех, кто только начинает кодить 😉
Начало работы с Axum — самым популярным веб-фреймворком Rust
Когда дело доходит до выбора серверного веб-фреймворка в экосистеме Rust, можно запутаться из-за большого количества вариантов. В прошлом, лидером по популярности был Rocket, но сейчас за первенство сражаются Axum и actix-web, и Axum
все больше набирает обороты. В этой статье мы немного погрузимся в Axum
— веб-фреймворк для создания REST API
на Rust
, разрабатываемый командой Tokio. Он прост в использовании и хорошо совместим с Tower — надежной библиотекой для создания модульных компонентов сетевых приложений.
В этой статье мы подробно рассмотрим, как использовать Axum
для создания веб-сервиса. Кроме того, мы рассмотрим изменения, которые произошли в версии 0.7.
Rust 1.76.0: обновление совместимости ABI, получение имени типа из ссылки
Команда Rust рада сообщить о новой версии языка — 1.76.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.76.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta
) или nightly (rustup default nightly
). Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Ближайшие события
Практическое руководство по Rust. 1/4
Hello world!
Представляю вашему вниманию первую часть практического руководства по Rust.
Руководство основано на Comprehensive Rust — руководстве по Rust
от команды Android
в Google
и рассчитано на людей, которые уверенно владеют любым современным языком программирования. Еще раз: это руководство не рассчитано на тех, кто только начинает кодить 😉
Trait-объекты и полиморфизм в Rust
Привет, Хабр!
Полиморфизм - это принцип в программирование, который позволяет нам писать гибкий, масштабируемый и поддерживаемый код. В Rust, как и во многих других языках программирования, полиморфизм позволяет одному интерфейсу представлять множество реализаций.
Один из способов, с помощью которого Rust достигает полиформизма, - использование Trait-объектов.
Основы Rust: синтаксис и структуры данных
Привет, Хабр!
Rust - это язык, который становится плюс-минус более популярным в последние годы благодаря своей высокой производительности и безопасности. Он был разработан Mozilla и сообществом разработчиков с целью предоставить инструмент для системного программирования, который позволяет избегать многих распространенных ошибок, связанных с управлением памятью.
В этой статье рассмотрим основы Rust. Статья будет полезна тем, кто только начинает своё знакомство с языком.
Большая шпаргалка по Rust. 2/2
Hello world!
Представляю вашему вниманию вторую часть большой шпаргалки по Rust.
Другой формат, который может показаться вам более удобным.
Обратите внимание: шпаргалка рассчитана на людей, которые хорошо знают любой современный язык программирования, а не на тех, кто только начинает кодить 😉
Также настоятельно рекомендуется хотя бы по диагонали прочитать замечательный Учебник по Rust (на русском языке).
Управление зависимостями в Rust с Cargo
Привет!
Cargo - это хороший менеджер пакетов Rust, который берет на себя тяжелую работу по управлению зависимостями, сборке проекта, тестированию и многому другому.
В этатье рассмотрим что такое Cargo и как с ним работать.
Как реализовывается WebAssembly в Rust: кратко
Привет, Хабр!
Rust - язык, который за последние годы завоевал сердца разработчиков своей надежностью, а в особенности безопасностью. WebAssembly в свою очередь позволяет нам перенести производительность и мощь нативных приложений в браузер. Вместе эти инструменты позволяют сделать веб-приложения с высокой скоростью, ну и кончечно - высокой безопасностью.
з.ы: предполагается, что читатель знает основы webassembly и про что-то из rust
Передавать пустые срезы между Rust и C/C++ на удивление сложно
Моя основная работа связана с браузерами и криптографией, а не компиляторами. Но я нередко сталкиваюсь с ситуацией, когда мне приходится проводить больше рабочего времени за изучением семантики языков программирования, чем за фактическим их использованием. Так что эта статья будет посвящена обсуждению острой межязыковой проблемы, касающейся С, С++ и Rust.
В общих чертах она выглядит так:
- В правила работы с указателями и
memcpy
в С не заложены грамотные способы представления пустого среза памяти. - В С++ с правилами указателей проблем нет, но поведение
memcpy
здесь аналогично её поведению в С. - Интерфейс внешних функций (Foreign Function Interface, FFI) в Rust не лишён накладных издержек. Rust использует несовместимое с C/C++ представление срезов, требуя их преобразования при передаче в обоих направлениях. При этом о преобразовании очень легко забыть.
- Срезы в Rust также несовместимы с арифметикой указателей, что создаёт проблемы в работе итератора срезов стандартной библиотеки. (Обновление от 2024-01-16: похоже, над этой проблемой работают).
Поскольку проблемы FFI касаются нескольких языков, я писал статью в качестве общей справки, описывающей их несогласованность.
Вклад авторов
-
humbug 810.2 -
RustLangRu 584.8 -
freecoder_xx 467.7 -
PsyHaSTe 460.2 -
m1rko 424.0 -
ozkriff 376.6 -
mkpankov 319.2 -
GRaAL 318.0 -
Bright_Translate 255.6