stringtranslate.com

Руст (язык программирования)

Rust — это мультипарадигмальный язык программирования общего назначения , в котором упор делается на производительность , безопасность типов и параллелизм . Он обеспечивает безопасность памяти (то есть все ссылки указывают на действительную память) без сборщика мусора . Чтобы одновременно обеспечить безопасность памяти и предотвратить гонки данных , его «проверка заимствования» отслеживает время жизни объектов всех ссылок в программе во время компиляции . На Rust повлияли идеи функционального программирования , включая неизменяемость , функции высшего порядка и алгебраические типы данных . Он популярен в системном программировании . [13] [14] [15]

Разработчик программного обеспечения Грейдон Хоар создал Rust как личный проект во время работы в Mozilla Research в 2006 году. Mozilla официально спонсировала проект в 2009 году. В годы, прошедшие после выхода первого стабильного выпуска в мае 2015 года, Rust был принят такими компаниями, как Amazon , Discord , Dropbox , Google ( Alphabet ), Meta и Microsoft . В декабре 2022 года он стал первым языком, кроме C и ассемблера , который поддерживался при разработке ядра Linux .

Rust известен своим быстрым распространением [16] и изучается в исследованиях теории языков программирования . [17] [18] [19]

История

Штаб-квартира Mozilla Foundation в Маунтин-Вью, Калифорния

Истоки (2006–2012)

Rust вырос из личного проекта, начатого в 2006 году сотрудником Mozilla Research Грейдоном Хоаром. [20] Mozilla начала спонсировать проект в 2009 году в рамках продолжающейся разработки экспериментального браузерного движка под названием Servo , [21] о котором Mozilla официально объявила в 2010 году . [22] [23] В это время логотип Rust был разработан на основе велосипедной экипировки . [24] Примерно в том же году работа перешла от первоначального компилятора , написанного на OCaml , к автономному компилятору на основе LLVM , написанному на Rust. Новый компилятор Rust успешно скомпилировался в 2011 году. [21]

Эволюция (2012–2019)

Система типов Rust претерпела значительные изменения между версиями 0.2, 0.3 и 0.4. В версии 0.2, вышедшей в марте 2012 года, впервые были представлены классы . [25] Четыре месяца спустя в версии 0.3 были добавлены деструкторы и полиморфизм за счет использования интерфейсов. [26] В октябре 2012 года была выпущена версия 0.4, в которой были добавлены черты как средство наследования . Интерфейсы были объединены с особенностями и удалены как отдельная функция; а классы были заменены комбинацией реализаций и структурированных типов . [27]

В начале 2010-х годов управление памятью через систему владения постепенно консолидировалось, чтобы предотвратить ошибки памяти. К 2013 году сборщик мусора Rust был удален, а правила владения остались в силе. [20]

В январе 2014 года главный редактор Dr. Dobb's Journal Эндрю Бинсток прокомментировал шансы Rust стать конкурентом C++ наряду с D , Go и Nim (тогда Nimrod). По словам Бинстока, хотя Rust «широко считался удивительно элегантным языком», его внедрение замедлилось, поскольку он радикально менялся от версии к версии. [28] Первая стабильная версия Rust 1.0 была анонсирована 15 мая 2015 года. [29] [30]

Разработка браузерного движка Servo продолжалась параллельно с ростом Rust. В сентябре 2017 года был выпущен Firefox 57 как первая версия, включающая компоненты Servo, в проекте под названием « Firefox Quantum ». [31]

Увольнения в Mozilla и Rust Foundation (2020 – настоящее время)

В августе 2020 года Mozilla уволила 250 из 1000 своих сотрудников по всему миру в рамках корпоративной реструктуризации, вызванной пандемией COVID-19 . [32] [33] Команда Servo была расформирована. Мероприятие вызвало обеспокоенность по поводу будущего Rust, поскольку некоторые члены команды активно участвовали в разработке Rust. [34] На следующей неделе команда Rust Core признала серьезные последствия увольнений и объявила, что планы по созданию фонда Rust находятся в стадии реализации. Первой целью фонда будет стать владельцем всех товарных знаков и доменных имен и взять на себя финансовую ответственность за их расходы. [35]

8 февраля 2021 года пять компаний-основателей ( AWS , Huawei , Google , Microsoft и Mozilla ) объявили о создании Rust Foundation . [36] [37] В сообщении в блоге , опубликованном 6 апреля 2021 года, Google объявил о поддержке Rust в рамках проекта Android Open Source Project в качестве альтернативы C/C++. [38]

22 ноября 2021 года группа модераторов, которая отвечала за соблюдение стандартов сообщества и Кодекса поведения, объявила о своей отставке «в знак протеста против того, что основная команда не несет ответственности ни перед кем, кроме себя». [39] В мае 2022 года команда Rust Core, другие ведущие программисты и некоторые члены правления Rust Foundation провели реформы управления в ответ на инцидент. [40]

6 апреля 2023 года Фонд Rust опубликовал проект новой политики в отношении товарных знаков , в котором были пересмотрены правила использования логотипа и названия Rust, что вызвало негативную реакцию со стороны пользователей и участников Rust. [41]

Синтаксис и особенности

Синтаксис Rust аналогичен синтаксису C и C++, [42] [43] , хотя на многие его функции повлияли языки функционального программирования . [44] Хоар описал Rust как ориентированный на «разочарованных разработчиков C++» и подчеркнул такие функции, как безопасность, контроль структуры памяти и параллелизм . [21] Безопасность в Rust включает в себя гарантии безопасности памяти, безопасности типов и отсутствия гонок за данными.

Программа «Здравствуй, мир»

Ниже находится надпись «Hello, World!» программа на Rust. Ключевое fnслово обозначает функцию , и println! макрос выводит сообщение на стандартный вывод . [45] Операторы в Rust разделяются точкой с запятой.

fn  main () { println! ( "Привет, мир!" ); }  

Ключевые слова и поток управления

В Rust блоки кода разделяются фигурными скобками , а поток управления реализуется с помощью таких ключевых слов, как if, else, whileи for. [46] Сопоставление с образцом можно выполнить с помощью matchключевого слова. [47] В приведенных ниже примерах пояснения даются в комментариях , которые начинаются с //. [48]

fn  main () { // Определение изменяемой переменной с помощью 'let mut' // Использование макроса vec! чтобы создать вектор, пусть значения mut = vec! [ 1 , 2 , 3 , 4 ];            для значения в & значений { println! ( "значение = {}" , значение ); }        если значения . len () > 5 { println! ( «Список длиннее пяти элементов» ); }       // Значения соответствия шаблону . len () { 0 => println! ( «Пусто» ), 1 => println! ( «Одно значение» ), // при сопоставлении с образцом можно использовать диапазоны целых чисел 2 ..= 10 => println! ( «От двух до десяти значений» ), 11 => println! ( "Одиннадцать значений" ), // Шаблон `_` называется "подстановочным знаком", он соответствует любому значению _ => println! ( «Много значений» ), };                      // цикл while с предикатом и сопоставлением с образцом с использованием let while let Some ( value ) = values . поп () { println! ( "значение = {значение}" ); // использование фигурных скобок для форматирования локальной переменной } }         

Блоки выражений

Rust ориентирован на выражения , причем почти каждая часть тела функции является выражением , включая операторы потока управления. [49] Вместо троичного условного выражения Cif используется обычное выражение . Поскольку возвраты являются неявными, функция не обязательно должна заканчиваться выражением ; если точка с запятой опущена, в качестве возвращаемого значения используется значение последнего выражения в функции , [50] , как показано в следующей рекурсивной реализации функции факториал :return

fn  факториал ( i : u64 )  -> u64  { if i == 0 { 1 } else { i * факториал ( i - 1 ) } }               

Следующая итеративная реализация использует ..=оператор для создания включающего диапазона:

fn  факториал ( я : u64 )  -> u64  { ( 2 ..= i ). продукт () } 

Замыкания

В Rust анонимные функции называются замыканиями. [51] Они определяются с использованием следующего синтаксиса:

|< параметр - имя > : < тип >|  -> < возврат - тип > { < тело > };   

Например:

пусть ж = | х : i32 | -> i32 { х * 2 };         

Однако с помощью вывода типа компилятор может определить тип каждого параметра и тип возвращаемого значения, поэтому приведенную выше форму можно записать как:

пусть ж = | х | { х * 2 };        

При замыканиях с одним выражением (т. е. телом с одной строкой) и неявным возвращаемым типом фигурные скобки можно опустить:

пусть ж = | х | х * 2 ;      

Замыкания без входного параметра записываются так:

пусть f = || распечататьлн! ( "Привет, мир!" );    

Замыкания могут передаваться в качестве входных параметров функций, которые ожидают указатель на функцию:

// Функция, которая принимает указатель функции в качестве аргумента и вызывает ее // со значением `5`. fn  apply ( f : fn ( i32 )  -> i32 )  -> i32  { // Нет точки с запятой, чтобы указать неявный возврат f ( 5 ) }  fn  main () { // Определение замыкания let f = | х | х * 2 ;          распечататьлн! ( "{}" , применить ( f )); // 10 println! ( "{}" , f ( 5 )); // 10 }     

Однако для описания того, как фиксируются значения в теле замыкания, могут потребоваться сложные правила. Они реализованы с использованием черт Fn, FnMutи FnOnce: [52]

  • Fn: замыкание фиксируется по ссылке ( &T). Они используются для функций, которые все еще можно вызывать, если у них есть только ссылочный доступ (с &) к своей среде.
  • FnMut: замыкание фиксируется по изменяемой ссылке ( &mut T). Они используются для функций, которые могут быть вызваны, если у них есть доступ к изменяемой ссылке (с &mut) к их среде.
  • FnOnce: замыкание фиксируется по значению ( T). Они используются для функций, которые вызываются только один раз.

Благодаря этим особенностям компилятор будет захватывать переменные наименее ограничительным образом. [52] Они помогают управлять тем, как значения перемещаются между областями действия, что очень важно, поскольку Rust следует конструкции жизненного цикла, чтобы гарантировать, что значения «заимствованы» и перемещены предсказуемым и явным образом. [53]

Ниже показано, как можно передать замыкание в качестве входного параметра, используя этот Fnпризнак:

// Функция, которая принимает значение типа F (который определяется как // универсальный тип, реализующий признак `Fn`, например замыкание) // и вызывает его со значением `5`. fn  apply_by_ref < F > ( f : F )  -> i32  где F : Fn ( i32 ) -> i32 { f ( 5 ) }   fn  main () { let f = | х | { печать! ( «Я получил значение: {}» , x ); х * 2 }; // Применяет функцию перед печатью возвращаемого значения println! ( "5 * 2 = {}" , apply_by_ref ( f )); }                // ~~ Вывод программы ~~ // Я получил значение: 5 // 5 * 2 = 10

Предыдущее определение функции также можно для удобства сократить следующим образом:

fn  apply_by_ref ( f : impl Fn ( i32 ) -> i32 ) -> i32 { f ( 5 ) }     

Типы

Rust строго типизирован и статически типизирован . Типы всех переменных должны быть известны во время компиляции; присвоение значения определенного типа переменной другого типа приводит к ошибке компиляции . Переменные объявляются с ключевым словом let , а для определения их типа используется определение типа. [54] Переменные, назначенные несколько раз, должны быть помечены ключевым словом mut(сокращение от mutable). [55]

Целочисленный тип по умолчанию — i32, а тип с плавающей запятой по умолчанию — f64. Если тип буквального числа не указан явно, он либо выводится из контекста, либо используется тип по умолчанию. [56]

Примитивные типы

Стандартная библиотека

Optionзначения обрабатываются с использованием синтаксического сахара , такого как if letконструкция, для доступа к внутреннему значению (в данном случае, строке): [76]

fn  main () { let name1 : Option <& str > = None ; // В этом случае ничего не будет выведено, если let Some ( name ) = name1 { println! ( "{имя}" ); }               let name2 : Option <& str > = Some ( "Мэтью" ); // В этом случае слово «Мэтью» будет напечатано, если let Some ( name ) = name2 { println! ( "{имя}" ); } }            

Указатели

Rust не использует нулевые указатели для обозначения отсутствия данных, так как это может привести к нулевому разыменованию . Соответственно, базовые &и &mutссылки гарантированно не будут нулевыми. Вместо этого Rust использует Optionдля этой цели: Some(T)указывает на наличие значения и Noneаналогичен нулевому указателю. [77] Option реализует «оптимизацию нулевого указателя», избегая любых пространственных издержек для типов, которые не могут иметь нулевое значение ( NonZeroнапример, ссылки или типы). [78]

В отличие от ссылок, типы необработанных указателей *constмогут *mutбыть нулевыми; однако их невозможно разыменовать, если код явно не объявлен небезопасным посредством использования блока unsafe. В отличие от разыменования, создание необработанных указателей разрешено внутри безопасного кода Rust. [79]

Пользовательские типы

Пользовательские типы создаются с помощью ключевых слов structили enum. Ключевое structслово используется для обозначения типа записи , который группирует несколько связанных значений. [80] enum s может принимать различные варианты во время выполнения, его возможности аналогичны алгебраическим типам данных, встречающимся в языках функционального программирования. [81] И структуры, и перечисления могут содержать поля разных типов. [82] Альтернативные имена для одного и того же типа можно определить с помощью typeключевого слова. [83]

Ключевое implслово может определять методы для определяемого пользователем типа (данные и функции определяются отдельно). Реализации выполняют роль, аналогичную роли классов в других языках. [84]

Преобразование типов

Rust не обеспечивает неявного преобразования типов (принуждения) между примитивными типами. Но явное преобразование типов (приведение типов) можно выполнить с помощью asключевого слова. [85]

пусть х = 1000 ; распечататьлн! ( "1000 как u16: {}" , x как u16 );      

Право собственности и время жизни

Система владения Rust состоит из правил, обеспечивающих безопасность памяти без использования сборщика мусора. Во время компиляции каждое значение должно быть прикреплено к переменной, называемой владельцем этого значения, и каждое значение должно иметь ровно одного владельца. [86] Значения перемещаются между разными владельцами путем присвоения или передачи значения в качестве параметра функции. Значения также могут быть заимствованы, то есть они временно передаются в другую функцию перед возвратом владельцу. [87] С помощью этих правил Rust может предотвратить создание и использование висячих указателей : [87] [88]

fn  print_string ( s : String ) { println! ( "{}" , с ); }   fn  main () { let s = String :: from ( «Hello, World» ); print_string ( ы ); // s, использованные print_string // s были перемещены, поэтому их больше нельзя использовать // другой print_string(s); приведет к ошибке компиляции }         

Из-за этих правил владения типы Rust известны как линейные или аффинные типы, что означает, что каждое значение можно использовать ровно один раз. Это обеспечивает своего рода изоляцию ошибок программного обеспечения , поскольку владелец значения несет полную ответственность за его правильность и освобождение. [89]

Время жизни обычно является неявной частью всех ссылочных типов в Rust. Каждое время жизни включает в себя набор мест в коде, для которых действительна переменная. Например, ссылка на локальную переменную имеет время жизни, соответствующее блоку, в котором она определена: [90]

fn  main () { let r = 9 ; // ------------------+- Время жизни 'a // | { // | пусть х = 5 ; // --+-- Время жизни 'b | распечататьлн! ( "r: {}, x: {}" , r , x ); // | | } // | | // | распечататьлн! ( "р: {}" , р ); // | } // ------------------+                         

Средство проверки заимствований в компиляторе Rust использует время жизни, чтобы гарантировать, что значения контрольных точек остаются действительными. Это также гарантирует, что изменяемая ссылка существует только в том случае, если одновременно не существует неизменяемых ссылок. [91] [92] В приведенном выше примере время существования субъекта ссылки (переменная x) короче, чем время жизни самой ссылки (переменная r), поэтому при проверке заимствований возникают ошибки, препятствующие xиспользованию из-за пределов ее области действия. [93] На систему памяти и владения Rust повлияло региональное управление памятью в таких языках, как Cyclone и ML Kit. [5]

Rust определяет взаимосвязь между временем жизни объектов, созданных и используемых функциями, с использованием параметров времени жизни в качестве сигнатурной функции. [94]

Когда стек или временная переменная выходит за пределы области видимости, они удаляются путем запуска деструктора . Деструктор может быть определен программно через dropфункцию. Этот метод реализует так называемый шаблон проектирования «приобретение ресурсов — инициализация» (RAII), в котором ресурсы, такие как файловые дескрипторы или сетевые сокеты, привязаны к времени жизни объекта: при удалении объекта ресурс закрывается. [95] [96]

В приведенном ниже примере анализируются некоторые параметры конфигурации из строки и создается структура, содержащая эти параметры. Структура содержит только ссылки на данные; поэтому, чтобы структура оставалась допустимой, данные, на которые ссылается структура, также должны быть действительными. Сигнатура функции parse_configявно определяет эту связь. В этом примере явное время жизни не требуется в новых версиях Rust из-за исключения времени жизни — алгоритма, который автоматически назначает время жизни функциям, если они тривиальны. [97]

используйте std :: collections :: HashMap ; // Эта структура имеет один параметр времени жизни, 'src. Имя используется только в определении структуры. #[derive(Debug)] struct  Config <' src > { имя хоста : & ' src str , имя пользователя : & ' src str , }     // Эта функция также имеет параметр времени жизни 'cfg. 'cfg прикрепляется к параметру "config", который // устанавливает, что данные в "config" живут, по крайней мере, в течение времени жизни 'cfg. // Возвращенная структура также использует 'cfg на протяжении всего своего существования, поэтому она может существовать не более, чем 'cfg. fn  parse_config <' cfg > ( config : & ' cfg  str )  -> Config <' cfg > { let key_values ​​: HashMap < _ , _ > = config . линии () . фильтр ( | линия | ! строка . начинается_с ( '#' )) . filter_map ( | линия | линия . Split_once ( '=' )) . карта ( | ( ключ , значение ) | ( ключ . обрезка (), значение . обрезка ())) . собирать (); Config { имя_хоста : значения_ключа [ "имя_хоста] ], имя пользователя : значения_ключей [ "имя_пользователя" ] } }                     fn  main () { let config = parse_config ( r#"hostname = foobar username=barfoo"# , ); распечататьлн! ( "Разобранная конфигурация: {:#?}" , config ); }         
Презентация по Rust Эмили Данэм из команды Mozilla Rust (конференция linux.conf.au , Хобарт, 2017 г.)

Безопасность памяти

Rust спроектирован так, чтобы быть безопасным для памяти . Он не допускает нулевых указателей, висячих указателей или гонок за данными . [98] [99] [100] Значения данных могут быть инициализированы только с помощью фиксированного набора форм, каждая из которых требует, чтобы их входные данные были уже инициализированы. [101]

Небезопасный код может обойти некоторые из этих ограничений, используя unsafeключевое слово. [79] Небезопасный код также может использоваться для низкоуровневых функций, таких как доступ к энергозависимой памяти , встроенные функции, специфичные для архитектуры, каламбур типов и встроенная ассемблерная система. [102]

Управление памятью

Rust не использует сборку мусора . Вместо этого память и другие ресурсы управляются по соглашению «получение ресурсов — это инициализация» [103] с дополнительным подсчетом ссылок . Rust обеспечивает детерминированное управление ресурсами с очень низкими накладными расходами . [104] По умолчанию значения распределяются в стеке , и все динамические выделения должны быть явными. [105]

Встроенные типы ссылок, использующие этот &символ, не требуют подсчета ссылок во время выполнения. Безопасность и достоверность базовых указателей проверяются во время компиляции, что предотвращает зависание указателей и другие формы неопределенного поведения . [106] Система типов Rust отделяет общие неизменяемые ссылки формы &Tот уникальных изменяемых ссылок формы &mut T. Изменяемую ссылку можно привести к неизменяемой ссылке, но не наоборот. [107]

Полиморфизм

Дженерики

Более продвинутые возможности Rust включают использование универсальных функций . Универсальной функции присваиваются универсальные параметры , которые позволяют применять одну и ту же функцию к различным типам переменных. Эта возможность уменьшает дублирование кода [108] и известна как параметрический полиморфизм .

Следующая программа вычисляет сумму двух вещей, для чего сложение реализуется с помощью универсальной функции:

используйте std :: ops :: Add ; // sum — это универсальная функция с одним параметром типа T fn  sum < T > ( num1 : T , num2 : T ) -> T где T : Add < Output = T > , // T должен реализовать признак Add, где сложение возвращает еще один T { num1 + num2 // num1 + num2 — это синтаксический сахар для num1.add(num2), предоставляемый признаком Add }           fn  main () { let result1 = sum ( 10 , 20 ); распечататьлн! ( "Сумма: {}" , результат1 ); // Сумма: 30          пусть результат2 = сумма ( 10,23 , 20,45 ); распечататьлн! ( "Сумма: {}" , результат2 ); // Сумма: 30,68 }       

Во время компиляции создаются экземпляры таких полиморфных функций, как sumконкретные типы , требуемые кодом; в данном случае сумма целых чисел и сумма чисел с плавающей запятой.

Обобщенные шаблоны можно использовать в функциях, чтобы обеспечить реализацию поведения для разных типов без повторения одного и того же кода. Универсальные функции могут быть написаны относительно других дженериков, не зная фактического типа. [109]

Черты

Система типов Rust поддерживает механизм, называемый типажами, вдохновленный классами типов в языке Haskell [5] для определения общего поведения между различными типами. Например, этот Addпризнак может быть реализован для чисел с плавающей запятой и целых чисел, которые можно добавлять; а признаки Displayили Debugмогут быть реализованы для любого типа, который можно преобразовать в строку. Черты могут использоваться для обеспечения набора общего поведения для разных типов без знания фактического типа. Эта возможность известна как специальный полиморфизм .

Универсальные функции могут ограничивать универсальный тип для реализации определенного признака или признаков; например, add_oneдля реализации функции может потребоваться тип Add. Это означает, что универсальную функцию можно проверить по типу сразу после ее определения. Реализация дженериков аналогична типичной реализации шаблонов C++: для каждого экземпляра создается отдельная копия кода. Это называется мономорфизацией и контрастирует со схемой стирания типов , обычно используемой в Java и Haskell. Стирание типов также доступно по ключевому слову dyn(сокращение от «динамический»). [110] Поскольку мономорфизация дублирует код для каждого используемого типа, это может привести к более оптимизированному коду для конкретных случаев использования, но время компиляции и размер выходного двоичного файла также увеличиваются. [111]

Помимо определения методов для определяемого пользователем типа, implключевое слово можно использовать для реализации признака типа. [84] При реализации трейты могут предоставлять дополнительные производные методы. [112] Например, признак Iteratorтребует, чтобы nextметод был определен для типа. Как только nextметод определен, признак может предоставлять общие функциональные вспомогательные методы для итератора, такие как mapили filter. [113]

Объекты черт

Черты Rust реализованы с использованием статической диспетчеризации , что означает, что тип всех значений известен во время компиляции; однако Rust также использует функцию, известную как объекты-характеристики, для выполнения динамической отправки (также известной как утиная типизация ). [114] Динамически отправляемые объекты свойств объявляются с использованием синтаксиса, dyn Trгде Tr— признак. Объекты признаков имеют динамический размер, поэтому их необходимо помещать за указателем, например Box. [115] В следующем примере создается список объектов, каждый из которых может быть распечатан с использованием Displayпризнака:

используйте std :: fmt :: Display ; let v : Vec < Box < dyn Display >> = vec! [ Коробка :: новый ( 3 ), Коробка :: новый ( 5.0 ), Коробка :: новый ( «привет» ), ];       для x в v { println! ( "{Икс}" ); }     

Если элемент в списке не реализует этот Displayпризнак, это вызовет ошибку времени компиляции. [116]

Итераторы

Циклы for в Rust работают в функциональном стиле как операции над типом итератора . Например, в цикле

для х в 0 .. 100 { f ( x ); }     

0..100— значение типа Range, реализующего Iteratorпризнак; код применяет функцию fк каждому элементу, возвращаемому итератором. Итераторы можно комбинировать с функциями над итераторами, такими как map, filterи sum. Например, следующая команда суммирует все числа от 1 до 100, кратные 3:

( 1 ..= 100 ). фильтр ( |& x | x % 3 == 0 ). сумма ()     

Макросы

Язык Rust можно расширить с помощью макросов.

Декларативные макросы

Декларативный макрос (также называемый «макросом по примеру») — это макрос, который использует сопоставление с образцом для определения своего расширения. [117] [118]

Процедурные макросы

Процедурные макросы — это функции Rust, которые запускают и изменяют входной поток токенов компилятора до компиляции любых других компонентов. Они, как правило, более гибкие, чем декларативные макросы, но их сложнее поддерживать из-за их сложности. [119] [120]

Процедурные макросы бывают трех видов:

Макрос println!является примером функционального макроса. Макрос [121] предоставляет широко используемую библиотеку для генерации кода для чтения и записи данных во многих форматах, таких serde_deriveкак JSON . Макросы атрибутов обычно используются для привязок к языку, например библиотека привязок Rust к R. [122]extendr

В следующем коде показано использование процедурных макросов Serialize, Deserializeи Debug-derived для реализации чтения и записи JSON, а также возможности форматирования структуры для отладки.

UML - диаграмма , изображающая структуру Rust с именем Point.
используйте serde_json :: { Сериализация , Десериализация };  #[derive(Serialize, Deserialize, Debug)] struct  Point { x : i32 , y : i32 , }   fn  main () { let point = Point { x : 1 , y : 2 };          let сериализованный = serde_json :: to_string ( & point ). развернуть (); распечататьлн! ( "сериализованный = {}" , сериализованный );      пусть десериализовано : Point = serde_json :: from_str ( & сериализовано ). развернуть (); распечататьлн! ( "десериализован = {:?}" , десериализовано ); }     

Вариативные макросы

Rust не поддерживает переменные аргументы в функциях. Вместо этого он использует макросы . [123]

макро_правила! вычисление { // Шаблон для одного `eval` ( eval $e : expr ) => {{ { let val : usize = $e ; // Принудительно сделать типы целыми числами println! ( "{} = {}" , stringify! { $e }, val ); } }};                   // Рекурсивно разложить несколько `eval` ( eval $e : expr , $( eval $es : expr ), + ) => {{ Calculation ! { eval $e } вычислить ! { $( оценка $es ), + } }}; }                 fn  main () { вычислить ! { // Смотри, ма! Вариатическое `вычислить!`! оценка 1 + 2 , оценка 3 + 4 , оценка ( 2 * 3 ) + 1 } }                   
Rust может взаимодействовать с вариативной системой C через c_variadicпереключатель функций. Как и другие интерфейсы C, система считается unsafeRust. [124]

Интерфейс с C и C++

В Rust есть интерфейс внешних функций (FFI), который можно использовать как для вызова кода, написанного на таких языках, как C , из Rust, так и для вызова кода Rust с этих языков. По состоянию на 2023 год существует внешняя библиотека CXX для вызова C++ или из него. [125] Rust и C различаются тем, как они размещают структуры в памяти, поэтому структурам Rust может быть присвоен атрибут #[repr(C)], обеспечивающий ту же структуру, что и эквивалентная структура C. [126]

Экосистема

Компиляция программы Rust с помощью Cargo

Экосистема Rust включает в себя компилятор, стандартную библиотеку и дополнительные компоненты для разработки программного обеспечения. Установка компонента обычно управляется установщиком набора инструментовrustup Rust , разработанным в рамках проекта Rust. [127]

Компилятор

Компилятор Rust называется rustcи переводит код Rust в язык низкого уровня, называемый промежуточным представлением LLVM (LLVM IR). Затем LLVM вызывается как подкомпонент для перевода IR-кода в машинный код . Затем компоновщик используется для объединения нескольких контейнеров в один исполняемый или двоичный файл . [128] [129]

Стандартная библиотека

Стандартная библиотека Rust определяет и реализует множество широко используемых пользовательских типов данных, включая основные структуры данных, такие как Vec, Optionи HashMap, а также типы интеллектуальных указателей . Rust также предоставляет возможность исключить большую часть стандартной библиотеки с помощью атрибута #![no_std]; это позволяет приложениям, таким как встроенные устройства, удалять код зависимостей или предоставлять свои собственные основные структуры данных. Внутри стандартная библиотека разделена на три части: core, alloc, и std, где stdи allocисключаются #![no_std]. [130]

Скриншот crates.io в июне 2022 г.

Груз

Cargo — это система сборки и менеджер пакетов Rust . Он загружает, компилирует, распространяет и загружает пакеты, называемые ящиками , которые сохраняются в официальном реестре. Он также действует как интерфейс для Clippy и других компонентов Rust. [16]

По умолчанию Cargo получает свои зависимости из пользовательского реестра crates.io , но в качестве зависимостей также можно указать репозитории и ящики Git в локальной файловой системе, а также другие внешние источники. [131]

Рустфмт

Rustfmt — форматировщик кода для Rust. Он форматирует пробелы и отступы для создания кода в соответствии с общим стилем , если не указано иное. Его можно вызвать как отдельную программу или из проекта Rust через Cargo. [132]

Пример вывода Clippy в программе hello world на Rust

Клиппи

Clippy — это встроенный в Rust инструмент проверки , позволяющий улучшить корректность, производительность и читаемость кода Rust. По состоянию на 2024 год в нем имеется более 700 правил. [133] [134]

Система версий

После Rust 1.0 новые функции разрабатываются в ночных версиях, которые выпускаются ежедневно. В течение каждого шестинедельного цикла выпуска изменения ночных версий переводятся в бета-версию, а изменения предыдущей бета-версии переводятся в новую стабильную версию. [135]

Каждые два-три года выпускается новое «издание». Выпускаются версии, позволяющие вносить ограниченные критические изменения , например повышение awaitключевого слова для поддержки функций async/await . Крейты, предназначенные для разных выпусков, могут взаимодействовать друг с другом, поэтому крейт может обновиться до новой редакции, даже если его вызывающие программы или его зависимости по-прежнему ориентированы на более старые выпуски. Переход на новую редакцию можно облегчить с помощью автоматизированных инструментов. [136]

поддержка IDE

Самым популярным языковым сервером для Rust является Rust Analyzer , который официально заменил исходный языковой сервер RLS в июле 2022 года. [137] Rust Analyzer предоставляет IDE и текстовым редакторам информацию о проекте Rust; базовые функции, включая автодополнение и отображение ошибок компиляции при редактировании. [138]

Производительность

В общем, гарантии безопасности памяти Rust не накладывают накладных расходов во время выполнения. [139] Заметным исключением является индексация массива , которая проверяется во время выполнения, хотя это часто не влияет на производительность. [140] Поскольку Rust не выполняет сборку мусора, он часто работает быстрее, чем другие языки, безопасные для памяти. [141] [142] [143]

Rust предоставляет два «режима»: безопасный и небезопасный. Безопасный режим — это «обычный» режим, в котором написана большая часть Rust. В небезопасном режиме разработчик несет ответственность за безопасность памяти кода, что полезно в случаях, когда компилятор слишком строгий. [144]

Многие из функций Rust являются так называемыми абстракциями с нулевой стоимостью , что означает, что они оптимизируются во время компиляции и не несут никаких потерь во время выполнения. [145] Система владения и заимствования допускает реализацию с нулевым копированием для некоторых задач, чувствительных к производительности, таких как синтаксический анализ . [146] Статическая диспетчеризация используется по умолчанию для устранения вызовов методов , за исключением методов, вызываемых для динамических объектов типажей. [147] Компилятор также использует встроенное расширение для устранения вызовов функций и вызовов статически отправляемых методов. [148]

Поскольку Rust использует LLVM , любые улучшения производительности в LLVM также переносятся и на Rust. [149] В отличие от C и C++, Rust позволяет переупорядочивать элементы struct и enum [150] для уменьшения размеров структур в памяти, лучшего выравнивания памяти и повышения эффективности доступа к кэшу . [151]

Принятие

Ранняя домашняя страница браузерного движка Mozilla Servo

Rust использовался в программном обеспечении, охватывающем разные области. Первоначально Rust финансировался Mozilla в рамках разработки Servo, экспериментального параллельного браузерного движка , в сотрудничестве с Samsung . [152] Компоненты движка Servo позже были включены в движок браузера Gecko , лежащий в основе Firefox. [153] В январе 2023 года Google ( Alphabet ) объявила о поддержке сторонних библиотек Rust в Chromium и, следовательно, в базе кода ChromeOS . [154]

Rust используется в нескольких проектах серверного программного обеспечения крупных веб-сервисов . OpenDNS , служба разрешения DNS , принадлежащая Cisco , использует Rust внутри себя. [155] [156] Amazon Web Services начала разработку проектов на Rust еще в 2017 году, [157] включая Firecracker , решение для виртуализации; [158] Bottlerocket, решение для распространения и контейнеризации Linux ; [159] и Tokio — асинхронный сетевой стек. [160] Microsoft Azure IoT Edge, платформа, используемая для запуска сервисов Azure на устройствах Интернета вещей , имеет компоненты, реализованные на Rust. [161] Microsoft также использует Rust для запуска контейнерных модулей с помощью WebAssembly и Kubernetes . [162] Cloudflare , компания, предоставляющая сетевые услуги доставки контента, использует Rust в качестве механизма сопоставления шаблонов брандмауэра . [163] [164]

В операционных системах проект Rust for Linux был начат в 2021 году с целью добавления поддержки Rust в ядро ​​Linux . [165] Поддержка Rust (наряду с поддержкой языка C и ассемблера ) была официально добавлена ​​в версии 6.1. [166] В 2020 году Microsoft объявила, что некоторые части Microsoft Windows переписываются на Rust. По состоянию на 2023 год DWriteCore , системная библиотека для макетирования текста и рендеринга глифов, содержит около 152 000 строк кода Rust и около 96 000 строк кода C++, а в некоторых случаях наблюдается прирост производительности от 5 до 15 процентов. [167] Google объявила о поддержке Rust в операционной системе Android также в 2021 году. [168] [169] Другие операционные системы, написанные на Rust, включают Redox , «Unix-подобную» операционную систему и микроядро , [170] и Тесей, экспериментальная операционная система с модульным управлением состояниями. [171] [172] Rust также используется для инструментов командной строки и компонентов операционной системы, включая stratisd , менеджер файловой системы [173] [174] и COSMIC, среду рабочего стола от System76 . [175] [176]

Ruffle, веб-эмулятор для SWF -файлов Adobe Flash.

В веб-разработке менеджер пакетов npm начал использовать Rust в 2019 году . [177] [178] [179] Deno , безопасная среда выполнения для JavaScript и TypeScript , построена на V8 , Rust и Tokio. [180] Другие заметные разработки в этой области включают Ruffle , эмулятор SWF с открытым исходным кодом , [181] и Polkadot , блокчейн- платформу с открытым исходным кодом и криптовалюту . [182]

Discord , социальная платформа для обмена мгновенными сообщениями, использует Rust для некоторых частей своей серверной части, а также для кодирования видео на стороне клиента . [183] ​​В 2021 году Dropbox объявила об использовании Rust для сервиса захвата экрана, видео и изображений. [184] Facebook ( Meta ) использовал Rust для Mononoke, сервера для системы контроля версий Mercurial . [185]

В опросе разработчиков Stack Overflow 2023 года 13% респондентов недавно провели обширную разработку на Rust. [186] В ходе опроса Rust также назывался «самым любимым языком программирования» каждый год с 2016 по 2023 год (включительно), исходя из количества разработчиков, заинтересованных в продолжении работы на том же языке. [187] [примечание 8] В 2023 году Rust заняла 6-е место среди «самых востребованных технологий», причем 31% разработчиков, которые в настоящее время не работают в Rust, выразили заинтересованность в этом. [186]

Сообщество

Ярко-оранжевый значок краба
Некоторые пользователи Rust называют себя Rustaceans (по аналогии со словом ракообразное ) и сделали оранжевого краба Ферриса своим неофициальным талисманом. [188] [189]

Фонд ржавчины

Rust Foundation — это некоммерческая членская организация, зарегистрированная в США , основной целью которой является поддержка технического проекта в качестве юридического лица и помощь в управлении товарными знаками и инфраструктурными активами. [190] [43]

Он был создан 8 февраля 2021 года пятью корпоративными членами-учредителями (Amazon Web Services, Huawei, Google, Microsoft и Mozilla). [191] Совет фонда возглавляет Шейн Миллер. [192] С конца 2021 года ее исполнительным директором и генеральным директором станет Ребекка Рамбул. [193] До этого временным исполнительным директором была Эшли Уильямс. [194]

Управленческие команды

Проект Rust состоит из команд , отвечающих за различные области разработки. Команда компилятора разрабатывает, управляет и оптимизирует внутренние компоненты компилятора; а языковая группа разрабатывает новые функции языка и помогает их реализовать. На сайте проекта Rust перечислены 9 команд топ-уровня по состоянию на январь 2024 года . [195] Представители команд образуют Лидерский совет, который курирует проект Rust в целом. [196]

Смотрите также

Примечания

  1. ^ Включая инструменты сборки, инструменты хоста и поддержку стандартных библиотек для x86-64 , ARM , MIPS , RISC-V , WebAssembly , i686 , AArch64 , PowerPC и s390x . [2]
  2. ^ Включая Windows , Linux , macOS , FreeBSD , NetBSD и Illumos . Инструменты сборки хоста для Android , iOS , Haiku , Redox и Fuchsia официально не поставляются; эти операционные системы поддерживаются в качестве целевых. [2]
  3. ^ Сторонние зависимости, например LLVM или MSVC , регулируются собственными лицензиями. [3] [4]
  4. ^ abcdef Этот литерал использует явный суффикс, который не нужен, если тип можно определить из контекста.
  5. ^ Интерпретируется как i32по умолчанию или выводится из контекста.
  6. ^ Тип, выведенный из контекста.
  7. ^ В системах Unix это часто строки UTF-8 без внутреннего 0 байта. В Windows это строки UTF-16 без внутреннего 0 байта. strВ отличие от них , StringUTF-8 всегда допустимы и могут содержать внутренние нули.
  8. ^ То есть среди респондентов, которые проделали «обширную работу по разработке [с Rust] за последний год» (13,05%), у Rust был самый большой процент тех, кто также выразил интерес к «работе с [Rust] в течение следующего года» ( 84,66%). [186]

Рекомендации

Источники книг

Другие

  1. ^ «Анонс Rust 1.76.0» . 08 февраля 2024 г. Проверено 8 февраля 2024 г.
  2. ^ ab «Поддержка платформы». Русская книга . Проверено 27 июня 2022 г.
  3. ^ «Язык программирования Rust». Язык программирования Rust. 2022-10-19.
  4. ^ abcdefghijkl «Влияния - Справочник по ржавчине». Справочник по ржавчине . Архивировано из оригинала 26 ноября 2023 г. Проверено 31 декабря 2023 г.
  5. ^ «Типы уникальности». Ржавый блог . Проверено 8 октября 2016 г. Те из вас, кто знаком со стилем Elm, возможно, поймут, что обновленные сообщения --explain во многом вдохновлены подходом Elm.
  6. ^ «Типы уникальности». Документация Идрис 1.3.3 . Проверено 14 июля 2022 г. Они вдохновлены… типами владения и заимствованными указателями из языка программирования Rust.
  7. ^ «Microsoft открывает на GitHub язык программирования Project Verona, вдохновленный Rust» . ЗДНет . Архивировано из оригинала 17 января 2020 г. Проверено 17 января 2020 г.
  8. ^ Джалоян, Жорж-Аксель (19 октября 2017 г.). «Безопасные указатели в СПАРК 2014». arXiv : 1710.07047 [cs.PL].
  9. ^ Латтнер, Крис. «Домашняя страница Криса Лэттнера». Nondot.org . Архивировано из оригинала 25 декабря 2018 г. Проверено 14 мая 2019 г.
  10. ^ «Документация V (Введение)» . Гитхаб . Проверено 4 ноября 2023 г.
  11. ^ Егулалп, Сердар (29 августа 2016 г.). «Новый претендент присоединяется к Rust, чтобы свергнуть язык C». Инфомир . Проверено 19 октября 2022 г.
  12. ^ Эшварла, Прабху (24 декабря 2020 г.). Практическое системное программирование для разработчиков Rust: создавайте быстрое и безопасное программное обеспечение для систем Linux/Unix с помощью практических примеров. ISBN Packt Publishing Ltd. 978-1-80056-201-1.
  13. ^ Бланди, Джим; Орендорф, Джейсон (21 ноября 2017 г.). Программирование на Rust: быстрая и безопасная разработка систем. O'Reilly Media, Inc. ISBN 978-1-4919-2725-0.
  14. ^ Бланко-Куаресма, Сержи; Болмонт, Эмелин (30 мая 2017 г.). «Что язык программирования Rust может сделать для астрофизики?». Труды Международного астрономического союза . 12 (С325): 341–344. arXiv : 1702.02951 . Бибкод : 2017IAUS..325..341B. дои : 10.1017/S1743921316013168. ISSN  1743-9213. S2CID  7857871.
  15. ^ аб Перкель, Джеффри М. (01 декабря 2020 г.). «Почему ученые обращаются к Rust». Природа . 588 (7836): 185–186. Бибкод : 2020Natur.588..185P. дои : 10.1038/d41586-020-03382-2. PMID  33262490. S2CID  227251258. Архивировано из оригинала 06 мая 2022 г. Проверено 15 мая 2022 г.
  16. ^ «Ученый-компьютерщик доказывает заявления о безопасности языка программирования Rust» . ЭврекАлерт! . Архивировано из оригинала 24 февраля 2022 г. Проверено 15 мая 2022 г.
  17. ^ Юнг, Ральф; Журдан, Жак-Анри; Кребберс, Робберт; Дрейер, Дерек (27 декабря 2017 г.). «RustBelt: закрепление основ языка программирования Rust». Труды ACM по языкам программирования . 2 (ПОПЛ): 66:1–66:34. дои : 10.1145/3158154 . hdl : 21.11116/0000-0003-34C6-3 . S2CID  215791659. Архивировано из оригинала 11 июня 2022 г. Проверено 15 мая 2022 г.
  18. ^ Юнг, Ральф (2020). Понимание и развитие языка программирования Rust (кандидатская диссертация). Саарский университет . дои : 10.22028/D291-31946. Архивировано из оригинала 8 марта 2022 г. Проверено 15 мая 2022 г.
  19. ^ Аб Томпсон, Клайв (14 февраля 2023 г.). «Как Rust превратился из побочного проекта в самый любимый в мире язык программирования». Обзор технологий Массачусетского технологического института . Проверено 23 февраля 2023 г.
  20. ^ abc Аврам, Авель (3 августа 2012 г.). «Интервью о Rust, языке системного программирования, разработанном Mozilla». ИнфоВ. Архивировано из оригинала 24 июля 2013 г. Проверено 17 августа 2013 г.
  21. ^ Асай, Мэтт (12 апреля 2021 г.). «Rust, а не Firefox — величайший вклад Mozilla в индустрию». Техреспублика . Проверено 7 июля 2022 г.
  22. ^ Хоар, Грейдон (7 июля 2010 г.). Проект Серво (PDF) . Ежегодный саммит Mozilla 2010. Уистлер, Канада. Архивировано (PDF) из оригинала 11 июля 2017 г. Проверено 22 февраля 2017 г.
  23. ^ "Логотип Ржавчины" . bugzilla.mozilla.org . Проверено 2 февраля 2024 г.
  24. ^ Хоар, Грейдон (29 марта 2012 г.). «[rust-dev] Выпущена версия Rust 0.2». mail.mozilla.org . Проверено 12 июня 2022 г.
  25. ^ Хоар, Грейдон (12 июля 2012 г.). «[rust-dev] Выпущена версия Rust 0.3». mail.mozilla.org . Архивировано из оригинала 24 августа 2022 г. Проверено 12 июня 2022 г.
  26. ^ Хоар, Грейдон (15 октября 2012 г.). «[rust-dev] Выпущена версия Rust 0.4». mail.mozilla.org . Архивировано из оригинала 31 октября 2021 г. Проверено 31 октября 2021 г.
  27. ^ Бинсток, Эндрю (07 января 2014 г.). «Взлет и падение языков в 2013 году». Журнал доктора Добба . Архивировано из оригинала 7 августа 2016 г. Проверено 20 ноября 2022 г.
  28. ^ «История версий». Гитхаб . Архивировано из оригинала 15 мая 2015 г. Проверено 1 января 2017 г.
  29. ^ Команда Rust Core (15 мая 2015 г.). «Анонсируем Rust 1.0». Ржавый блог . Архивировано из оригинала 15 мая 2015 г. Проверено 11 декабря 2015 г.
  30. ^ Лардинуа, Фредерик (29 сентября 2017 г.). «Пришло время дать Firefox еще один шанс». ТехКранч . Проверено 15 августа 2023 г.
  31. ^ Чимпану, Каталин (11 августа 2020 г.). «Mozilla увольняет 250 сотрудников и переориентируется на коммерческие продукты». ЗДНет . Архивировано из оригинала 18 марта 2022 г. Проверено 2 декабря 2020 г.
  32. ^ Купер, Дэниел (11 августа 2020 г.). «Mozilla увольняет 250 сотрудников из-за пандемии». Engadget . Архивировано из оригинала 13 декабря 2020 г. Проверено 2 декабря 2020 г.
  33. ^ Тунг, Лиам. «Язык программирования Rust: сокращение рабочих мест в Mozilla сильно ударило по нам, но вот как мы выживем». ЗДНет. Архивировано из оригинала 21 апреля 2022 г. Проверено 21 апреля 2022 г.
  34. ^ «Закладывая основу для будущего Rust» . Ржавый блог . 18.08.2020. Архивировано из оригинала 2 декабря 2020 г. Проверено 2 декабря 2020 г.
  35. ^ «Привет, мир!». Фонд ржавчины . 08.02.2020. Архивировано из оригинала 19 апреля 2022 г. Проверено 4 июня 2022 г.
  36. ^ «Mozilla приветствует Rust Foundation» . Блог Мозиллы . 09.02.2021. Архивировано из оригинала 08 февраля 2021 г. Проверено 9 февраля 2021 г.
  37. ^ Амадео, Рон (07 апреля 2021 г.). «Google сейчас пишет низкоуровневый код Android на Rust». Арс Техника . Архивировано из оригинала 8 апреля 2021 г. Проверено 8 апреля 2021 г.
  38. ^ Андерсон, Тим (23 ноября 2021 г.). «Вся команда модераторов Rust уходит в отставку». Регистр . Проверено 4 августа 2022 г.
  39. ^ «Обновление управления». Блог изнутри Rust . Проверено 27 октября 2022 г.
  40. ^ Клэберн, Томас (17 апреля 2023 г.). «Rust Foundation приносит извинения за путаницу в политике в отношении товарных знаков». Регистр . Проверено 7 мая 2023 г.
  41. ^ Доказано, Лиам (27 ноября 2019 г.). «Ребекка Рамбул назначена новым генеральным директором The Rust Foundation». Регистр . Проверено 14 июля 2022 г. Оба являются языками с фигурными скобками и синтаксисом, подобным C, что делает их непугающими для программистов C.
  42. ^ аб Брэндон Вильяроло (10 февраля 2021 г.). «Язык программирования Rust теперь имеет свою независимую основу». Техреспублика . Проверено 14 июля 2022 г.
  43. ^ Клабник и Николс 2019, с. 263.
  44. ^ Клабник и Николс 2019, стр. 5–6.
  45. ^ Клабник и Николс 2019, стр. 49–57.
  46. ^ Клабник и Николс 2019, стр. 104–109.
  47. ^ Клабник и Николс 2019, с. 49.
  48. ^ Клабник и Николс 2019, стр. 50–53.
  49. ^ Тайсон, Мэтью (3 марта 2022 г.). «Программирование на Rust для разработчиков Java». Инфомир . Проверено 14 июля 2022 г.
  50. ^ «Замыкания - ржавчина на примере». doc.rust-lang.org .
  51. ^ ab «В качестве входных параметров — пример Rust». doc.rust-lang.org .
  52. ^ «Время жизни - ржавчина на примере». doc.rust-lang.org .
  53. ^ Клабник и Николс 2019, стр. 24.
  54. ^ Клабник и Николс 2019, стр. 32–33.
  55. ^ Клабник и Николс 2019, стр. 36–38.
  56. ^ Клабник и Николс 2019, стр. 39–40.
  57. ^ "ул - Руст" . doc.rust-lang.org . Проверено 23 июня 2023 г.
  58. ^ "срез - Ржавчина" . doc.rust-lang.org . Проверено 23 июня 2023 г.
  59. ^ «Кортежи». Ржавчина на примере . Проверено 1 октября 2023 г.
  60. ^ "std::boxed — Ржавчина" . doc.rust-lang.org . Проверено 24 июня 2023 г.
  61. ^ "OsStr в std::ffi – Rust" . doc.rust-lang.org . Проверено 2 октября 2023 г.
  62. ^ «OsString в std::ffi – Rust» . doc.rust-lang.org . Проверено 2 октября 2023 г.
  63. ^ «Путь в std::path – Rust» . doc.rust-lang.org . Проверено 2 октября 2023 г.
  64. ^ «PathBuf в std::path – Rust». doc.rust-lang.org . Проверено 2 октября 2023 г.
  65. ^ abc "std::boxed – Rust". doc.rust-lang.org . Проверено 23 июня 2023 г.
  66. ^ "Rc в std::rc - Rust" . doc.rust-lang.org . Проверено 24 июня 2023 г.
  67. ^ «Дуга в std::sync – Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
  68. ^ «Ячейка в std::cell – Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
  69. ^ «Мьютекс в std::sync – Rust». doc.rust-lang.org . Проверено 24 июня 2023 г.
  70. ^ «RwLock в std::sync – Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
  71. ^ «Кондвар в std::sync – Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
  72. ^ «Продолжительность в std::time – Rust». doc.rust-lang.org . Проверено 24 июня 2023 г.
  73. ^ «HashMap в std::collections – Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
  74. ^ «BTreeMap в std::collections – Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
  75. ^ Макнамара 2021.
  76. ^ Клабник и Николс 2019, стр. 101–104.
  77. ^ "std::option - Rust". doc.rust-lang.org . Проверено 12 ноября 2023 г.
  78. ^ ab Klabnik & Nichols 2019, стр. 418–427.
  79. ^ Клабник и Николс 2019, с. 83.
  80. ^ Клабник и Николс 2019, с. 97.
  81. ^ Клабник и Николс 2019, стр. 98–101.
  82. ^ Клабник и Николс 2019, стр. 438–440.
  83. ^ ab Klabnik & Nichols 2019, стр. 93.
  84. ^ «Литье - ржавчина на примере». doc.rust-lang.org .
  85. ^ Клабник и Николс 2019, стр. 59–61.
  86. ^ ab Klabnik & Nichols 2019, стр. 63–68.
  87. ^ Клабник и Николс 2019, стр. 74–75.
  88. ^ Баласубраманиан, Абхирам; Барановский, Марек С.; Бурцев Антон; Панда, Ауроджит; Ракамарич, Звонимир; Рыжик, Леонид (07.05.2017). «Системное программирование на Rust». Материалы 16-го семинара по актуальным темам операционных систем . ХоОС '17. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 156–161. дои : 10.1145/3102980.3103006. ISBN 978-1-4503-5068-6. S2CID  24100599. Архивировано из оригинала 11 июня 2022 г. Проверено 1 июня 2022 г.
  89. ^ Клабник и Николс 2019, с. 194.
  90. ^ Клабник и Николс 2019, стр. 75, 134.
  91. ^ Шамрелл-Харрингтон, Нелл. «Проверка ржавчины – глубокое погружение». ИнфоQ . Проверено 25 июня 2022 г.
  92. ^ Клабник и Николс 2019, стр. 194–195.
  93. ^ Клабник и Николс 2019, стр. 192–204.
  94. ^ «Загрузить std::ops – Rust» . doc.rust-lang.org . Проверено 16 июля 2022 г.
  95. ^ Гомес, Гийом; Буше, Антони (2018). «РАИИ». Программирование на Rust на примере (Первое изд.). Бирмингем, Великобритания: Packt Publishing. п. 358. ИСБН 9781788390637.
  96. ^ Клабник и Николс 2019, стр. 201–203.
  97. ^ Розенблатт, Сет (3 апреля 2013 г.). «Samsung присоединяется к Mozilla в поисках Rust». CNET . Архивировано из оригинала 4 апреля 2013 г. Проверено 5 апреля 2013 г.
  98. ^ Браун, Нил (17 апреля 2013 г.). «Вкус ржавчины». Архивировано из оригинала 26 апреля 2013 г. Проверено 25 апреля 2013 г.
  99. ^ «Гонки - Рустономикон» . doc.rust-lang.org . Архивировано из оригинала 10 июля 2017 г. Проверено 3 июля 2017 г.
  100. ^ «Часто задаваемые вопросы по языку Rust» . static.rust-lang.org . 2015. Архивировано из оригинала 20 апреля 2015 г. Проверено 24 апреля 2017 г.
  101. ^ Макнамара 2021, с. 139, 376–379, 395.
  102. ^ "RAII - Ржавчина на примере" . doc.rust-lang.org . Архивировано из оригинала 21 апреля 2019 г. Проверено 22 ноября 2020 г.
  103. ^ «Абстракция без накладных расходов: особенности Rust». Ржавый блог . Архивировано из оригинала 23 сентября 2021 г. Проверено 19 октября 2021 г.
  104. ^ «Коробка, стопка и куча» . Ржавчина на примере . Проверено 13 июня 2022 г.
  105. ^ Клабник и Николс 2019, стр. 70–75.
  106. ^ Клабник и Николс 2019, с. 323.
  107. ^ Клабник и Николс 2019, стр. 171–172.
  108. ^ Клабник и Николс 2019, стр. 171–172, 205.
  109. ^ Клабник и Николс 2019, стр. 181, 182.
  110. ^ Дженгсет 2021, с. 25.
  111. ^ Клабник и Николс 2019, стр. 182–184.
  112. ^ Клабник и Николс 2019, стр. 281–283.
  113. ^ «Использование объектов-характеристик, допускающих значения разных типов - язык программирования Rust» . doc.rust-lang.org . Проверено 11 июля 2022 г.
  114. ^ Клабник и Николс 2019, стр. 441–442.
  115. ^ Клабник и Николс 2019, стр. 379–380.
  116. ^ «Макросы на примере». Справочник по ржавчине . Проверено 21 апреля 2023 г.
  117. ^ Клабник и Николс 2019, стр. 446–448.
  118. ^ «Процедурные макросы». Справочник по языку программирования Rust . Архивировано из оригинала 07.11.2020 . Проверено 23 марта 2021 г.
  119. ^ Клабник и Николс 2019, стр. 449–455.
  120. ^ "Серде Дериве". Документация Serde Derive . Архивировано из оригинала 17 апреля 2021 г. Проверено 23 марта 2021 г.
  121. ^ "extendr_api – Rust". Документация по API Extendr . Архивировано из оригинала 25 мая 2021 г. Проверено 23 марта 2021 г.
  122. ^ "Вариадики". Ржавчина на примере .
  123. ^ "2137-вариативный". Книга Rust RFC .
  124. ^ «Безопасное взаимодействие между Rust и C++ с CXX». ИнфоQ . 06.12.2020. Архивировано из оригинала 22 января 2021 г. Проверено 3 января 2021 г.
  125. ^ «Макет текста - Справочник по Rust» . doc.rust-lang.org . Проверено 15 июля 2022 г.
  126. ^ Бланди, Орендорф и Тиндалл, 2021, стр. 6–8.
  127. ^ Макнамара 2021, стр. 411–412.
  128. ^ «Обзор компилятора». Руководство по разработке компилятора Rust . Проверено 2 июня 2023 г.
  129. ^ Дженгсет 2021, с. 213-215.
  130. ^ Симона, Серджио Де (18 апреля 2019 г.). «Rust 1.34 представляет альтернативные реестры для закрытых крейтов». ИнфоQ . Проверено 14 июля 2022 г.
  131. ^ Клабник и Николс 2019, стр. 511–512.
  132. ^ Clippy, Язык программирования Rust, 30 ноября 2023 г. , получено 30 ноября 2023 г.
  133. ^ "Клиппи Линтс". Язык программирования Rust . Проверено 30 ноября 2023 г.
  134. ^ Klabnik & Nichols 2019, Приложение G - Как создается ржавчина и «Ночная ржавчина»
  135. ^ Бланди, Орендорф и Тиндалл, 2021, стр. 176–177.
  136. ^ Андерсон, Тим (5 июля 2022 г.). «Команда Rust выпускает версию 1.62, устанавливает дату окончания устаревшего языкового сервера». ДЕВКЛАСС . Проверено 14 июля 2022 г.
  137. ^ Клабник и Николс 2023, с. 623.
  138. ^ Макнамара 2021, с. 11.
  139. ^ Попеску, Натали; Сюй, Цзыян; Апостолакис, Сотирис; Август, Дэвид И.; Леви, Амит (15 октября 2021 г.). «Безопаснее на любой скорости: автоматическое контекстно-зависимое повышение безопасности для Rust». Труды ACM по языкам программирования . 5 (ООПСЛА). Раздел 2. doi : 10.1145/3485480 . S2CID  238212612. с. 5: Мы наблюдаем большую разницу в издержках проверенного индексирования: 23,6% тестов сообщают о значительном снижении производительности от проверенного индексирования, но 64,5% сообщают о незначительном влиянии или его отсутствии, и, что удивительно, 11,8% сообщают об улучшении производительности... В конечном итоге , хотя неконтролируемое индексирование может повысить производительность, в большинстве случаев это не так.
  140. ^ Андерсон, Тим. «Может ли Руст спасти планету? Почему и почему бы и нет». Регистр . Проверено 11 июля 2022 г.
  141. ^ Баласубраманиан, Абхирам; Барановский, Марек С.; Бурцев Антон; Панда, Ауроджит; Ракамарич, Звонимир; Рыжик, Леонид (07.05.2017). «Системное программирование на Rust». Материалы 16-го семинара по актуальным темам операционных систем . Уистлер, Британская Колумбия, Канада: ACM. стр. 156–161. дои : 10.1145/3102980.3103006. ISBN 978-1-4503-5068-6. S2CID  24100599.
  142. ^ Егулалп, Сердар (06 октября 2021 г.). «Что такое язык Rust? Безопасная, быстрая и простая разработка программного обеспечения». Инфомир . Проверено 25 июня 2022 г.
  143. ^ Врубель, Кшиштоф (11 апреля 2022 г.). «Rust-проекты – почему крупные IT-компании используют Rust?». Архивировано из оригинала 27 декабря 2022 г.
  144. ^ Макнамара 2021, с. 19, 27.
  145. ^ Купри, Жоффруа (2015). «Ном, байт-ориентированная, потоковая передача, нулевое копирование, библиотека комбинаторов парсеров в Rust». Семинары IEEE по безопасности и конфиденциальности , 2015 г. стр. 142–148. дои : 10.1109/SPW.2015.31. ISBN 978-1-4799-9933-0. S2CID  16608844.
  146. ^ Макнамара 2021, с. 20.
  147. ^ «Генерация кода - Справочник по Rust». doc.rust-lang.org . Проверено 9 октября 2022 г.
  148. ^ «Насколько быстро ржавеет?». Часто задаваемые вопросы по языку программирования Rust . Архивировано из оригинала 28 октября 2020 г. Проверено 11 апреля 2019 г.
  149. ^ Фаршин, Алиреза; Барбетт, Том; Рузбе, Амир; Магуайр-младший, Джеральд К.; Костич, Деян (2021). «PacketMill: к сети со скоростью 100 ГБ/с на каждое ядро». Материалы 26-й Международной конференции ACM по архитектурной поддержке языков программирования и операционных систем. стр. 1–17. дои : 10.1145/3445814.3446724. ISBN 9781450383172. S2CID  231949599 . Проверено 12 июля 2022 г. ... В то время как некоторые компиляторы (например, Rust) поддерживают переупорядочение структур [82], компиляторам C и C++ запрещено переупорядочивать структуры данных (например, структуру или класс) [74] ...
  150. ^ «Тип-макет» . Справочник по ржавчине . Проверено 14 июля 2022 г.
  151. ^ Лардинуа, Фредерик (3 апреля 2015 г.). «Mozilla и Samsung объединяются для разработки Servo, браузерного движка следующего поколения Mozilla для многоядерных процессоров». ТехКранч . Архивировано из оригинала 10 сентября 2016 г. Проверено 25 июня 2017 г.
  152. ^ Кейзер, Грегг (31 октября 2016 г.). «Mozilla планирует омолодить Firefox в 2017 году». Компьютерный мир . Проверено 13 мая 2023 г.
  153. ^ «Поддержка использования Rust в проекте Chromium» . Блог Google по онлайн-безопасности . Проверено 12 ноября 2023 г.
  154. ^ Шенкленд, Стивен (12 июля 2016 г.). «Firefox будет переработан, чтобы снова заинтересовать вас». CNET . Проверено 14 июля 2022 г.
  155. ^ Группа исследования безопасности (04 октября 2013 г.). «ZeroMQ: помогает нам блокировать вредоносные домены в режиме реального времени». Зонт Циско . Проверено 13 мая 2023 г.
  156. ^ «Как наша команда AWS Rust внесет свой вклад в будущие успехи Rust» . Веб-сервисы Amazon . 03.03.2021. Архивировано из оригинала 02 января 2022 г. Проверено 02 января 2022 г.
  157. ^ «Firecracker - облегченная виртуализация для бессерверных вычислений» . Веб-сервисы Amazon . 2018-11-26. Архивировано из оригинала 08 декабря 2021 г. Проверено 02 января 2022 г.
  158. ^ «Объявление об общей доступности Bottlerocket, дистрибутива Linux с открытым исходным кодом, созданного для запуска контейнеров» . Веб-сервисы Amazon . 2020-08-31. Архивировано из оригинала 02 января 2022 г. Проверено 02 января 2022 г.
  159. ^ «Почему AWS любит Rust и как мы хотели бы помочь» . Веб-сервисы Amazon . 24.11.2020. Архивировано из оригинала 03 декабря 2020 г. Проверено 21 апреля 2022 г.
  160. ^ Николс, Шон (27 июня 2018 г.). «Следующий трюк Microsoft? Перенос данных из облака в Azure IoT Edge». Регистр . Архивировано из оригинала 27 сентября 2019 г. Проверено 27 сентября 2019 г.
  161. ^ Тунг, Лиам. «Microsoft: почему мы использовали язык программирования Rust вместо Go для WebAssembly в приложении Kubernetes». ЗДНет. Архивировано из оригинала 21 апреля 2022 г. Проверено 21 апреля 2022 г.
  162. ^ «Как мы создавали правила брандмауэра» . Блог Cloudflare . 04.03.2019 . Проверено 11 июня 2022 г.
  163. ^ «Наслаждайтесь кусочком QUIC и Rust!». Блог Cloudflare . 22 января 2019 г. Проверено 11 июня 2022 г.
  164. ^ Андерсон, Тим (07 декабря 2021 г.). «Ржавое ядро ​​Linux становится ближе с новым патчем». Регистр . Проверено 14 июля 2022 г.
  165. ^ «Первый взгляд на Rust в ядре 6.1 [LWN.net]» . lwn.net . Проверено 11 ноября 2023 г.
  166. ^ Клэберн, Томас (27 апреля 2023 г.). «Microsoft переписывает основные библиотеки Windows на Rust». Регистр . Проверено 13 мая 2023 г.
  167. ^ «Ржавчина на платформе Android». Блог Google по онлайн-безопасности . Архивировано из оригинала 3 апреля 2022 г. Проверено 21 апреля 2022 г.
  168. ^ Амадео, Рон (7 апреля 2021 г.). «Google сейчас пишет низкоуровневый код Android на Rust». Арс Техника . Архивировано из оригинала 8 апреля 2021 г. Проверено 21 апреля 2022 г.
  169. ^ Егулалп, Сердар. «Ос Redox от Rust может показать Linux несколько новых трюков». Инфомир . Архивировано из оригинала 21 марта 2016 г. Проверено 21 марта 2016 г.
  170. ^ Андерсон, Тим (14 января 2021 г.). «Еще одна ОС в стиле Rust: Тесей присоединяется к Redox в поисках более безопасных и отказоустойчивых систем». Регистр . Проверено 14 июля 2022 г.
  171. ^ Боос, Кевин; Лиянаге, Намита; Иджаз, Рамла; Чжун, Линь (2020). Тезей: эксперимент в структуре операционной системы и управлении состоянием. стр. 1–19. ISBN 978-1-939133-19-9.
  172. ^ Сэй, Марк (10 октября 2018 г.). «Новые возможности Fedora 29: Start теперь официально в Fedora». Марксей, Еженедельные таблетки сисадмина . Архивировано из оригинала 13 апреля 2019 г. Проверено 13 мая 2019 г.
  173. ^ Доказано, Лиам (12 июля 2022 г.). «Выпущен Oracle Linux 9 с некоторыми интересными дополнениями». Регистр . Проверено 14 июля 2022 г.
  174. ^ Патель, Пратам (14 января 2022 г.). «Я попробовал новый рабочий стол COSMIC на базе Rust от System76!». Это Новости FOSS – Новости развития . Это новости ФОСС . Проверено 10 января 2023 г.
  175. ^ "Pop!_OS от System76" . pop.system76.com . Система76, Инк . Проверено 10 января 2023 г.
  176. ^ Симона, Серджио Де. «NPM использовала Rust для устранения узких мест в производительности». ИнфоQ . Проверено 20 ноября 2023 г.
  177. ^ Лю, Шинг (2020), Лю, Шинг (ред.), «Добро пожаловать в мир Rust», Практические проекты Rust: создание игр, физические вычисления и приложения машинного обучения , Беркли, Калифорния: Apress, стр. 1– 8, номер домена : 10.1007/978-1-4842-5599-5_1, ISBN 978-1-4842-5599-5, получено 29 ноября 2023 г.
  178. ^ Лю, Шинг (2021), Лю, Шинг (ред.), «Ржавчина в мире Интернета», Практические веб-проекты Rust: создание облачных и веб-приложений , Беркли, Калифорния: Apress, стр. 1–7, doi :10.1007/978-1-4842-6589-5_1, ISBN 978-1-4842-6589-5, получено 29 ноября 2023 г.
  179. ^ Ху, Вивиан (12 июня 2020 г.). «Deno готов к производству». ИнфоQ . Проверено 14 июля 2022 г.
  180. ^ Абрамс, Лоуренс (6 февраля 2021 г.). «Этот эмулятор Flash Player позволяет безопасно играть в старые игры». Мигающий компьютер . Проверено 25 декабря 2021 г.
  181. ^ Хариф, Ольга (17 октября 2020 г.). «Убийца блокчейна Ethereum носит скромное имя Polkadot» . Блумберг ЛП . Проверено 14 июля 2021 г.
  182. ^ Ховарт, Джесси (04 февраля 2020 г.). «Почему Discord переходит с Go на Rust». Архивировано из оригинала 30 июня 2020 г. Проверено 14 апреля 2020 г.
  183. ^ Команда Dropbox Capture. «Почему мы создали собственную библиотеку Rust для Capture». Dropbox.Tech . Архивировано из оригинала 6 апреля 2022 г. Проверено 21 апреля 2022 г.
  184. ^ «Краткая история Rust в Facebook». Инженерное дело в Мете . 2021-04-29. Архивировано из оригинала 19 января 2022 г. Проверено 21 апреля 2022 г.
  185. ^ abc «Опрос разработчиков Stack Overflow, 2023 г.» . Переполнение стека . Проверено 25 июня 2023 г.
  186. ^ Клэберн, Томас (23 июня 2022 г.). «Линус Торвальдс говорит, что Rust появится в ядре Linux». Регистр . Проверено 15 июля 2022 г.
  187. ^ Клабник и Николс 2019, с. 4.
  188. ^ «Начало работы». www.rust-lang.org . Архивировано из оригинала 01.11.2020 . Проверено 11 октября 2020 г.
  189. ^ Тунг, Лиам (08 февраля 2021 г.). «Язык программирования Rust сделал огромный шаг вперед». ЗДНет . Проверено 14 июля 2022 г.
  190. ^ Криль, Пол. «Язык Rust переходит на самостоятельную основу». Инфомир . Архивировано из оригинала 10 апреля 2021 г. Проверено 10 апреля 2021 г.
  191. ^ Воан-Николс, Стивен Дж. (9 апреля 2021 г.). «Шейн Миллер из AWS возглавит недавно созданный Rust Foundation». ЗДНет . Архивировано из оригинала 10 апреля 2021 г. Проверено 10 апреля 2021 г.
  192. ^ Воган-Николс, Стивен Дж. (17 ноября 2021 г.). «Фонд Rust назначает Ребекку Рамбул исполнительным директором». ЗДНет . Архивировано из оригинала 18 ноября 2021 г. Проверено 18 ноября 2021 г.
  193. ^ «Язык программирования Rust теперь имеет собственную независимую основу» . Техреспублика . 10 февраля 2021 г. Архивировано из оригинала 18 ноября 2021 г. Проверено 18 ноября 2021 г.
  194. ^ «Управление». Язык программирования Rust . Архивировано из оригинала 10 мая 2022 г. Проверено 7 мая 2022 г.
  195. ^ «Представляем Совет лидеров Rust». Ржавый блог . Проверено 12 января 2024 г.

дальнейшее чтение

Внешние ссылки