О Rust: учебные заметки из траншей

Национализм, религия, политика, идентичность… языки программирования. Чувствительные темы. Помимо Javascript, я уже давно ничего не бросал во время кодирования. Ржавчина это весело.

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

Вам нужно |двигаться| ваши но - это вызов

  • «Но я уже могу делать все на языке X, так что…»
  • «Но там нет заданий на Rust…»
  • «Но Rust — это сложно…»
  • «Но в Rust недостаточно библиотек/пакетов, на которые можно опереться…»
  • правда, вроде правда, вроде правда, это зависит… ОК(())

Всего несколько моментов:

  • Вам понадобится время и мотивация.
  • Он становится более эргономичным. Rust 2018 проще, чем более ранние версии.
  • Rust относится к категории системных языков программирования, но во многих местах выходит за рамки этой категории. Однако работа на Rust обязательно не делает ее лучше, чем на другом языке, даже на PHP.
  • Он по-прежнему не отличен для создания пользовательских интерфейсов, веб-сайтов, анализа данных и многих других вещей. На самом деле, я добавлю, что это отлично для работы типа dev/opsy (шины сообщений, базы данных и т. д.). По крайней мере, пока не очень.

Учитывая вышесказанное, я думаю, вам все равно стоит попробовать

  • Если вы проведете день, неделю или месяц с Rust и больше никогда его не будете использовать, вы почти наверняка чему-то научитесь. Программисты Java/.NET получат некоторое представление о распределении кучи и стека. Программисты на C/C++ будут думать о области действия по-новому и интересно.
  • Это не исключает использования других языков. Если вы последовательно моногамны со своими языками программирования, вы что-то упускаете (и, вероятно, вам меньше 25 лет).
  • Есть много интересных функций и есть одна очень интересная: управление памятью в коде регулируется компилятором. Rust не дает вам делать глупости. Если вы к этому предрасположены, вам будет казаться, что ваши родители принуждают вас вынести мусор. (да, так и было задумано)
  • Это весело, что трудно. Это похоже на решение головоломки, которая имеет награду.

Это w̶i̶c̶k̶e̶d̶,̶ ̶b̶l̶i̶s̶t̶e̶r̶i̶n̶g̶l̶y̶ ̶ Быстро

Это. Попробуй.

Бенчмарки врут, но вот один и вот еще: время отклика веб-сервера.

Но GO работает быстро. Кристалл быстрый. С++ быстрый. Языки JVM, языки dotnet, Python и многие другие являются быстрыми или, по крайней мере, и что более важно, достаточно быстрыми.

Есть яркие примеры того, как производительность Rust имеет значение: замена командной строки grep: ripgrep. Это потрясающе.

Это безопасно для памяти

Переполнение буфера, висячие указатели, нулевые указатели… в Rust они «обрабатываются» вверх по течению во время компиляции. Или, точнее, конструкция компилятора снижает риск того, что код, явно не помеченный как небезопасный, не обнаружит эти уязвимости. Явно помеченный как «небезопасный» код предоставляет исключения (каламбур) для применения правил компилятором.

Если это для вас чуждо, немного контекста. Аудиторы PA-DSS (вспомните кредитные карты) любят разбрасывать память приложения и копаться в содержимом — особенно в поисках личной информации, ключей шифрования, паролей и т. д. Дизайн Rust радикально уменьшает поверхность этого вектора атаки.

И большая часть импульса вокруг Rust, похоже, связана с этим преимуществом:

Rust определенно что-то покупает здесь — и если бы мне пришлось выбрать холм Rust, чтобы умереть, я бы выбрал именно его.

Упаковка, среда выполнения и библиотеки

Экосистема Rust сделала это правильно. Аллилуйя, ٱلْـحَـمْـدُ للهِ, спасибо. Настраиваемые среды выполнения, пакеты (крейты), версии, функции, модули, ссылки и т. д. Работает как положено — скучно и прозрачно. Не придираться к GO, но эта статья слишком длинная. Достаточно сказано.

Параллельная обработка — это бесстрашно, а с Rayon — безумно просто

Если я хочу написать код, ограниченный одним ядром:

fn sum_of_squares(input: &[i32]) -> i32
{
input.iter().map(|&i| i * i).sum()
}

Если я хочу написать код, использующий несколько ядер:

use rayon::prelude::*;
fn sum_of_squares(input: &[i32]) -> i32
{
input.par_iter().map(|&i| i * i).sum()
}

Обратите внимание на par_

Этот код является параллельным, потокобезопасным и функциональным в смысле функционального программирования. Хороший.

Хотя мы статистически аномальная профессия, где ни один член не попадает ниже 50-го процентиля, Rust дает нам дополнительные гарантии.

Документация отличная

Это требует некоторой дисциплины, но изучение документации, особенно Книги, — действительно хорошая идея.

Нет лишнего формализма. Контент линейный. Мало что предполагается о вашем прошлом, но это не влияет на более сложный контент. Письмо хорошее.

Начало работы — пара предложений

  • Восходящая звезда ржавчины, по крайней мере, в поиске, еще не превзошла то, что вы смахиваете проволочной щеткой со своего гриля. Итак, квалифицируйте свои поиски как Rust.
  • Следуйте книге в начале. Это приносит дивиденды. Прыжок в github может привести вас сюда:

procmacro2::misc_syntax!( where while abcd : u64 >> 1 + 2 * 3; where T: 'x + A<B='y+C+D>;[M];A::f );

когда вы ищете это:

fn main() println!("Hi");

Обе они являются однострочными основными функциями.

Щепотка больше мотивации

  • Макросы, дженерики, замыкания, параллелизм и параллелизм — важные функции Rust, но вы можете (в большинстве случаев) писать компактный код Rust и без них. Есть забавные вещи, которыми можно заняться по мере продвижения.
  • Опять же, изучение rust сделает другие языки более понятными, по крайней мере, так было для меня.

Есть много отличных ящиков и проектов.

Несколько любимых:

  • Имя: комбинаторы парсера
  • Exa: современная версия ls
  • nалгебра: библиотека линейной алгебры и немного красивого, хорошо структурированного кода
  • Xsv: вы больше никогда не будете смотреть на CSV-файл как раньше
  • Criterion: библиотека статистического бенчмаркинга с интеллектуальной выборкой функций и потрясающими диаграммами/отчетами
  • Crossbeam: Примитивы и инструменты параллельного программирования
  • TIKV: база данных ключ-значение на базе etcd и rockdb с дополнительным слоем совместимости mysql (TIDB) без сохранения состояния.
  • Ripgrep: Замена Grep
  • Фейерверк: Micro VM Framework Новый и интересный для меня жанр

Незаконный отказ от ответственности

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

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

Я не собираю вязание. Простая загрузка файла по HTTP в стабильном коде Rust — это своего рода головная боль (сегодня).

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

Несмотря ни на что, это весело…