Руст (язык программирования)
![]() | |
Парадигмы | |
---|---|
Разработчик | Ржавчина Проект |
Впервые появился | 15 мая 2015 г |
Стабильная версия | 1.81.0 [ 1 ] ![]() |
Дисциплина набора текста | |
Язык реализации | ОКамл (2006–2011 гг.) Руст (2012 – настоящее время) |
Платформа | Кросс-платформенный [ примечание 1 ] |
ТЫ | Кросс-платформенный [ примечание 2 ] |
Лицензия | Массачусетский технологический институт , Апач 2.0 [ примечание 3 ] |
Расширения имен файлов | .rs , .rlib |
Веб-сайт | www |
Под влиянием | |
Под влиянием | |
Rust — это общего назначения, язык программирования в котором упор делается на производительность , безопасность типов и параллелизм . Он обеспечивает безопасность памяти , а это означает, что все ссылки указывают на действительную память. Это делается без традиционного сборщика мусора ; вместо этого как ошибки безопасности памяти, так и гонки данных предотвращаются с помощью «проверки заимствования», которая отслеживает объект время жизни ссылок на во время компиляции .
Rust не навязывает парадигму программирования , но на него повлияли идеи функционального программирования , включая неизменяемость , функции высшего порядка , алгебраические типы данных и сопоставление с образцом . Он также поддерживает объектно-ориентированное программирование с помощью структур, перечислений , признаков и методов. Он популярен в системном программировании . [ 13 ] [ 14 ] [ 15 ]
Разработчик программного обеспечения Грейдон Хоар создал Rust как личный проект во время работы в Mozilla Research в 2006 году. Mozilla официально спонсировала проект в 2009 году. В годы, прошедшие после выхода первого стабильного выпуска в мае 2015 года, Rust был принят такими компаниями, как Amazon , Discord , Dropbox , Google ( Alphabet ), Meta и Microsoft . В декабре 2022 года он стал первым языком, кроме C и ассемблера, который поддерживался при разработке ядра Linux .
Rust известен своим быстрым распространением и изучается в исследованиях теории языков программирования .
История
[ редактировать ]Истоки (2006–2012)
[ редактировать ]Rust зародился как личный проект в 2006 году сотрудника Mozilla Research Грейдона Хоара, названный в честь группы грибов , которые «сверхустроены для выживания». Mozilla начала спонсировать проект в 2009 году и наняла дюжину инженеров для постоянной работы над ним в течение следующих десяти лет. [ 16 ]
Примерно в 2010 году работа перешла от первоначального компилятора , написанного на OCaml, к автономному компилятору на основе LLVM, написанному на Rust. Новый компилятор Rust успешно скомпилировался в 2011 году. [ 17 ] [ нужен лучший источник ] Осенью 2011 года на основе велосипедной звезды был разработан логотип Rust . [ 18 ]
Эволюция (2012–2020 гг.)
[ редактировать ]Rust Система типов претерпела значительные изменения между версиями 0.2, 0.3 и 0.4. В версии 0.2, вышедшей в марте 2012 года, классы . впервые были представлены [ 19 ] Четыре месяца спустя в версии 0.3 были добавлены деструкторы и полиморфизм за счет использования интерфейсов. [ 20 ] В октябре 2012 года вышла версия 0.4, в которой были добавлены черты как средство наследования . Интерфейсы были объединены с особенностями и удалены как отдельная функция; а классы были заменены комбинацией реализаций и структурированных типов . [ 21 ]
В начале 2010-х годов управление памятью через систему владения постепенно консолидировалось, чтобы предотвратить ошибки памяти. Rust К 2013 году сборщик мусора был удален, а правила владения остались в силе. [ 16 ]
В январе 2014 года главный редактор Dr. Dobb's Journal Эндрю Бинсток прокомментировал шансы Rust стать конкурентом C++ наряду с D , Go и Nim (тогда Nimrod). По словам Бинстока, хотя Rust «широко считался удивительно элегантным языком», его внедрение замедлилось, поскольку он радикально менялся от версии к версии. [ 22 ] Первая стабильная версия Rust 1.0 вышла 15 мая 2015 года. [ 16 ]
Разработка браузерного движка Servo продолжалась параллельно с ростом Rust. В сентябре 2017 года был выпущен Firefox 57 как первая версия, включающая компоненты Servo, в проекте под названием « Firefox Quantum ». [ 23 ]
Увольнения в Mozilla и Rust Foundation (2020 – настоящее время)
[ редактировать ]В августе 2020 года Mozilla уволила 250 из 1000 своих сотрудников по всему миру в рамках корпоративной реструктуризации, вызванной пандемией COVID-19 . [ 24 ] [ 25 ] Команда Servo была расформирована. Мероприятие вызвало обеспокоенность по поводу будущего Rust, поскольку некоторые члены команды активно участвовали в разработке Rust. [ 26 ] На следующей неделе команда Rust Core признала серьезные последствия увольнений и объявила, что планы по созданию фонда Rust находятся в стадии реализации. Первой целью фонда будет стать владельцем всех товарных знаков и доменных имен и взять на себя финансовую ответственность за их расходы. [ 27 ]
о создании Rust Foundation . объявили 8 февраля 2021 года пять компаний-учредителей ( AWS , Huawei , Google , Microsoft и Mozilla ) [ 28 ] [ 29 ] В сообщении в блоге , опубликованном 6 апреля 2021 года, Google объявил о поддержке Rust в рамках проекта Android Open Source Project в качестве альтернативы C/C++. [ 30 ]
22 ноября 2021 года группа модераторов, которая отвечала за соблюдение стандартов сообщества и Кодекса поведения, объявила о своей отставке «в знак протеста против того, что основная команда не несет ответственности ни перед кем, кроме себя». [ 31 ] В мае 2022 года команда Rust Core, другие ведущие программисты и некоторые члены правления Rust Foundation реализовали реформы управления в ответ на инцидент. [ 32 ]
6 апреля 2023 года Фонд Rust опубликовал проект новой политики в отношении товарных знаков , в котором были пересмотрены правила использования логотипа и названия Rust, что вызвало негативную реакцию со стороны пользователей и участников Rust. [ 33 ]
Синтаксис и особенности
[ редактировать ]Rust Синтаксис аналогичен синтаксису C и C++. [ 34 ] [ 35 ] хотя на многие из его функций повлияли языки функционального программирования, такие как OCaml . [ 36 ] Хоар описал Rust как ориентированный на «разочарованных разработчиков C++» и подчеркнул такие функции, как безопасность, контроль структуры памяти и параллелизм . [ 17 ] Безопасность в Rust включает в себя гарантии безопасности памяти, безопасности типов и отсутствия гонок за данными.
Программа «Здравствуй, мир»
[ редактировать ]Ниже находится надпись «Hello, World!» программа на Rust. fn
Ключевое слово обозначает функцию , а println!
макрос (см. § Макросы ) выводит сообщение на стандартный вывод . [ 37 ] Операторы в Rust разделяются точкой с запятой .
fn main() {
println!("Hello, World!");
}
Переменные
[ редактировать ]Переменные в Rust определяются через let
ключевое слово. [ 38 ] В приведенном ниже примере присваивается значение переменной с именем foo
.
fn main() {
let foo = 10;
println!("The value of foo is {foo}");
}
По умолчанию переменные являются неизменяемыми , и добавление mut
Ключевое слово позволяет изменять переменную. [ 39 ] В следующем примере используется //
, который обозначает начало комментария . [ 40 ]
fn main() {
let mut foo = 10; // This code would not compile without adding "mut".
println!("The value of foo is {foo}");
foo = 20;
println!("The value of foo is {foo}");
}
Несколько let
выражения могут определять несколько переменных с одним и тем же именем, что называется затенением переменных . Затенение переменных позволяет преобразовывать переменные без необходимости называть переменные по-другому. [ 41 ] В приведенном ниже примере объявляется новая переменная с тем же именем, которая вдвое превышает исходное значение:
fn main() {
let foo = 10;
println!("The value of foo is {foo}");
let foo = foo * 2;
println!("The value of foo is {foo}");
}
Затенение переменных также возможно для значений разных типов, начиная от строки и заканчивая ее длиной:
fn main() {
let spaces = " ";
let spaces = spaces.len();
}
Ключевые слова и поток управления
[ редактировать ]В Rust блоки кода ограничиваются фигурными скобками . [ 42 ]
if
блоки
[ редактировать ] Ан if
условное выражение выполняет код в зависимости от того, является ли данное значение true
. else
может использоваться, когда значение оценивается как false
, и else if
может использоваться для объединения нескольких выражений. [ 43 ]
fn main() {
let x = 10;
if x > 5 {
println!("value is greater than five");
}
if x % 7 == 0 {
println!("value is divisible by 7");
} else if x % 5 == 0 {
println!("value is divisible by 5");
} else {
println!("value is not divisible by 7 or 5");
}
}
while
петли
[ редактировать ] while
может использоваться для повторения блока кода при выполнении условия. [ 44 ]
fn main() {
// Iterate over all integers from 4 to 10
let mut value = 4;
while value <= 10 {
println!("value = {value}");
value += 1
}
}
for
циклы и итераторы
[ редактировать ] Циклы For в Rust перебирают элементы коллекции. [ 45 ] Выражения работают с любым типом итератора .
fn main(){
// Using `for` with range syntax for the same functionality as above
for value in 4..=10 {
println!("value = {value}");
}
}
В приведенном выше коде 4..=10
это значение типа Range
которая реализует Iterator
черта. Код в фигурных скобках применяется к каждому элементу, возвращаемому итератором.
Итераторы можно комбинировать с функциями над итераторами, например map
, filter
, и sum
. Например, следующая команда суммирует все числа от 1 до 100, кратные 3:
(1..=100).filter(|&x| x % 3 == 0).sum()
loop
и break
заявления
[ редактировать ] В более общем смысле, loop
Ключевое слово позволяет повторять часть кода до тех пор, пока break
происходит. break
при необходимости может выйти из цикла со значением. Этикетки, обозначенные значком 'label_name
может использоваться для разрыва внешнего цикла, когда циклы вложены. [ 46 ]
fn main() {
let value = 456;
let mut x = 1;
let y = loop {
x *= 10;
if x > value {
break x / 10;
}
};
println!("largest power of ten that is smaller than value: {y}");
let mut up = 1;
'outer: loop {
let mut down = 120;
loop {
if up > 100 {
break 'outer;
}
if down < 4 {
break;
}
down /= 2;
up += 1;
println!("up: {up}, down: {down}");
}
up *= 2;
}
}
Выражения
[ редактировать ]Rust ориентирован на выражения , причем почти каждая часть тела функции является выражением , включая операторы потока управления. [ 47 ] if
выражение используется для предоставления тернарного условного оператора . Поскольку возвраты являются неявными, функция не обязательно должна заканчиваться return
выражение; используется значение последнего выражения в функции если точка с запятой опущена, в качестве возвращаемого значения , [ 48 ] как видно из следующей рекурсивной реализации функции факториала :
fn factorial(i: u64) -> u64 {
if i == 0 {
1
} else {
i * factorial(i - 1)
}
}
Следующая итеративная реализация использует ..=
оператор для создания включающего диапазона:
fn factorial(i: u64) -> u64 {
(2..=i).product()
}
Сопоставление с образцом
[ редактировать ]The match
и if let
выражения можно использовать для сопоставления с образцом . Например, match
может использоваться для удвоения необязательного целочисленного значения, если оно присутствует, и возврата нуля в противном случае: [ 49 ]
fn double(x: Option<u64>) -> u64 {
match x {
Some(x) => x * 2,
None => 0,
}
}
Эквивалентно это можно записать с помощью if let
и else
:
fn double(x: Option<u64>) -> u64 {
if let Some(x) = x {
x * 2
} else {
0
}
}
Типы
[ редактировать ]Rust строго типизирован и статически типизирован . Типы всех переменных должны быть известны во время компиляции; присвоение значения определенного типа переменной другого типа приводит к ошибке компиляции . Вывод типа используется для определения типа переменных, если они не указаны. [ 50 ]
Целочисленный тип по умолчанию: i32
, а тип с плавающей запятой по умолчанию — f64
. Если тип буквального числа не указан явно, он либо выводится из контекста, либо используется тип по умолчанию. [ 51 ]
Примитивные типы
[ редактировать ]Целочисленные типы в Rust называются на основе знака и количества бит, которые занимает тип. Например, i32
представляет собой целое число со знаком, занимающее 32 бита памяти, тогда как u8
не имеет знака и занимает всего 8 бит памяти. isize
и usize
занимают место в зависимости от архитектуры компьютера, на котором выполняется код, например, на компьютерах с 32-битной архитектурой оба типа будут занимать 32 бита пространства.
По умолчанию целочисленные литералы имеют систему счисления с основанием 10, но разные системы счисления , например: с префиксами поддерживаются 0b11
для двоичных чисел , 0o567
для восьмеричных чисел и 0xDB
для шестнадцатеричных чисел . По умолчанию целочисленные литералы имеют значение i32
как его тип. Суффиксы, такие как 4u32
может использоваться для явного задания типа литерала. [ 52 ] Байтовые литералы, такие как b'X'
доступны для представления значения ASCII (в u8
) конкретного характера. [ 53 ]
тип Логический называется bool
который может принимать значение либо true
или false
. А char
занимает 32 бита пространства и представляет собой скалярное значение Юникода: кодовую точку Юникода , которая не является суррогатом . [ 54 ] Числа с плавающей запятой IEEE 754 поддерживаются f32
для поплавков одинарной точности и f64
для чисел с плавающей запятой двойной точности . [ 55 ]
Пользовательские типы
[ редактировать ]Пользовательские типы создаются с помощью struct
или enum
ключевые слова. struct
Ключевое слово используется для обозначения типа записи , который группирует несколько связанных значений. [ 56 ] enum
s может принимать различные варианты во время выполнения, а его возможности аналогичны алгебраическим типам данных, встречающимся в функциональных языках программирования. [ 57 ] И структуры, и перечисления могут содержать поля разных типов. [ 58 ] Альтернативные имена для одного и того же типа можно определить с помощью type
ключевое слово. [ 59 ]
The impl
Ключевое слово может определять методы для определяемого пользователем типа. Данные и функции определяются отдельно. Реализации выполняют роль, аналогичную роли классов в других языках. [ 60 ]
Стандартная библиотека
[ редактировать ]Тип | Описание | Примеры |
---|---|---|
String
|
Строки в кодировке UTF-8 (динамические) |
|
|
Собственные строки платформы [ примечание 4 ] (заимствованный [ 61 ] и динамичный [ 62 ] ) |
|
|
Пути (заимствованные [ 63 ] и динамичный [ 64 ] ) |
|
|
C -совместимые строки с нулевым завершением (заимствованные [ 65 ] и динамичный [ 65 ] ) |
|
Vec<T>
|
Динамические массивы |
|
Option<T>
|
Тип опции |
|
Result<T, E>
|
Обработка ошибок с использованием типа результата |
|
Box<T>
|
Указатель на значение, выделенное в куче . [ 66 ] в C++ Аналогично std::unique_ptr . | let boxed: Box<u8> = Box::new(5);
let val: u8 = *boxed;
|
Rc<T>
|
подсчета ссылок Указатель [ 67 ] | let five = Rc::new(5);
let also_five = five.clone();
|
Arc<T>
|
Атомный , потокобезопасный указатель подсчета ссылок [ 68 ] | let foo = Arc::new(vec![1.0, 2.0]);
let a = foo.clone(); // a can be sent to another thread
|
Cell<T>
|
Изменяемая ячейка памяти [ 69 ] | let c = Cell::new(5);
c.set(10);
|
Mutex<T>
|
Блокировка мьютекса для общих данных, содержащихся внутри. [ 70 ] | let mutex = Mutex::new(0_u32);
let _guard = mutex.lock();
|
RwLock<T>
|
Блокировка чтения и записи [ 71 ] | let lock = RwLock::new(5);
let r1 = lock.read().unwrap();
|
Condvar
|
для Условный монитор общих данных [ 72 ] | let (lock, cvar) = (Mutex::new(true), Condvar::new());
// As long as the value inside the `Mutex<bool>` is `true`, we wait.
let _guard = cvar.wait_while(lock.lock().unwrap(), |pending| { *pending }).unwrap();
|
Duration
|
Тип, представляющий промежуток времени [ 73 ] | Duration::from_millis(1) // 1ms
|
HashMap<K, V>
|
Хэш-таблица [ 74 ] | let mut player_stats = HashMap::new();
player_stats.insert("damage", 1);
player_stats.entry("health").or_insert(100);
|
BTreeMap<K, V>
|
B-дерево [ 75 ] | let mut solar_distance = BTreeMap::from([
("Mercury", 0.4),
("Venus", 0.7),
]);
solar_distance.entry("Earth").or_insert(1.0);
|
Option
значения обрабатываются с использованием синтаксического сахара , такого как if let
конструкция для доступа к внутреннему значению (в данном случае к строке): [ 76 ]
fn main() {
let name1: Option<&str> = None;
// In this case, nothing will be printed out
if let Some(name) = name1 {
println!("{name}");
}
let name2: Option<&str> = Some("Matthew");
// In this case, the word "Matthew" will be printed out
if let Some(name) = name2 {
println!("{name}");
}
}
Указатели
[ редактировать ]Тип | Описание | Примеры |
---|---|---|
|
Ссылки (неизменяемые и изменяемые) |
|
|
|
|
|
Указатель на значение, выделенное в куче
(или, возможно, нулевой указатель, если он заключен в опцию) [ 65 ] |
|
|
|
Rust не использует нулевые указатели для обозначения отсутствия данных, так как это может привести к нулевому разыменованию . Соответственно, основные &
и &mut
ссылки гарантированно не будут нулевыми. Вместо этого Rust использует Option
для этой цели: Some(T)
указывает, что значение присутствует, и None
аналогичен нулевому указателю. [ 77 ] Option
реализует «оптимизацию нулевого указателя», избегая любых пространственных издержек для типов, которые не могут иметь нулевое значение (ссылки или NonZero
типы, например). [ 78 ]
В отличие от ссылок, типы необработанных указателей *const
и *mut
может быть нулевым; однако их невозможно разыменовать, если код явно не объявлен небезопасным с помощью unsafe
блокировать. В отличие от разыменования, создание необработанных указателей разрешено внутри безопасного кода Rust. [ 79 ]
Преобразование типов
[ редактировать ]Rust не обеспечивает неявного преобразования типов (принуждения) между примитивными типами. Но явное преобразование типов (приведение типов) можно выполнить с помощью as
ключевое слово. [ 80 ]
let x = 1000;
println!("1000 as a u16 is: {}", x as u16);
Право собственности и время жизни
[ редактировать ]Система владения Rust состоит из правил, обеспечивающих безопасность памяти без использования сборщика мусора. Во время компиляции каждое значение должно быть прикреплено к переменной, называемой владельцем этого значения, и каждое значение должно иметь ровно одного владельца. [ 81 ] Значения перемещаются между разными владельцами путем присвоения или передачи значения в качестве параметра функции. Значения также могут быть заимствованы, то есть они временно передаются в другую функцию перед возвратом владельцу. [ 82 ] С помощью этих правил Rust может предотвратить создание и использование висячих указателей : [ 82 ] [ 83 ]
fn print_string(s: String) {
println!("{}", s);
}
fn main() {
let s = String::from("Hello, World");
print_string(s); // s consumed by print_string
// s has been moved, so cannot be used any more
// another print_string(s); would result in a compile error
}
Из-за этих правил владения типы Rust известны как линейные или аффинные типы, что означает, что каждое значение можно использовать ровно один раз. Это обеспечивает своего рода изоляцию ошибок программного обеспечения , поскольку владелец значения несет полную ответственность за его правильность и освобождение. [ 84 ]
Когда значение выходит за пределы области видимости, оно удаляется путем запуска его деструктора . Деструктор может быть определен программно путем реализации Drop
черта . Это помогает управлять такими ресурсами, как дескрипторы файлов, сетевые сокеты и блокировки , поскольку при удалении объектов связанные с ними ресурсы автоматически закрываются или освобождаются. [ 85 ]
Время жизни обычно является неявной частью всех ссылочных типов в Rust. Каждое время жизни включает в себя набор мест в коде, для которых действительна переменная. Например, ссылка на локальную переменную имеет время жизни, соответствующее блоку, в котором она определена: [ 86 ]
fn main() {
let x = 5; // ------------------+- Lifetime 'a
// |
let r = &x; // -+-- Lifetime 'b |
// | |
println!("r: {}", r); // | |
// | |
// -+ |
} // ------------------+
Средство проверки заимствований в компиляторе Rust использует время жизни, чтобы гарантировать, что значения контрольных точек остаются действительными. [ 87 ] [ 88 ] В приведенном выше примере сохранение ссылки на переменную x
к r
действителен как переменная x
имеет более длительный срок службы( 'a
), чем переменная r
( 'b
). Однако, когда x
имеет более короткий срок службы, программа проверки заимствований отклонит программу:
fn main() {
let r; // ------------------+- Lifetime 'a
// |
{ // |
let x = 5; // -+-- Lifetime 'b |
r = &x; // | |
} // -| |
// |
println!("r: {}", r); // |
} // ------------------+
Поскольку время жизни ссылочной переменной ( 'b
) короче времени жизни переменной, содержащей ссылку ( 'a
), ошибки проверки заимствований, предотвращающие x
от использования за пределами своей области применения. [ 89 ]
Параметры времени жизни явно определяют время жизни ссылок, например, указывая источник вывода: [ 90 ]
fn remove_prefix<'a>(mut original: &'a str, prefix: &str) -> &'a str {
if original.starts_with(prefix) {
original = original[prefix.len()..];
}
original
}
Имея информацию о том, как время жизни выходного значения функции связано с ее входными данными, компилятор может предотвратить проблемы безопасности памяти, такие как висячие указатели.
Когда определяемые пользователем типы содержат ссылки на данные, им также необходимо использовать параметры времени жизни. В приведенном ниже примере анализируются некоторые параметры конфигурации из строки и создается структура, содержащая эти параметры. Функция parse_config
также демонстрирует исключение времени жизни, что уменьшает необходимость явного определения параметров времени жизни. [ 91 ]
use std::collections::HashMap;
// This struct has one lifetime parameter, 'src. The name is only used within the struct's definition.
#[derive(Debug)]
struct Config<'src> {
hostname: &'src str,
username: &'src str,
}
// The '_ lifetime parameter, in this case, refers to the anonymous lifetime attached to the type
// of the argument `config`.
fn parse_config(config: &str) -> Config<'_> {
let key_values: HashMap<_, _> = config
.lines()
.filter(|line| !line.starts_with('#'))
.filter_map(|line| line.split_once('='))
.map(|(key, value)| (key.trim(), value.trim()))
.collect();
Config {
hostname: key_values["hostname"],
username: key_values["username"],
}
}
fn main() {
let config = parse_config(
r#"hostname = foobar
username=barfoo"#,
);
println!("Parsed config: {:#?}", config);
}
Полиморфизм
[ редактировать ]Дженерики
[ редактировать ]Более продвинутые возможности Rust включают использование универсальных функций . Универсальной функции присваиваются универсальные параметры , которые позволяют применять одну и ту же функцию к различным типам переменных. Эта возможность уменьшает дублирование кода. [ 92 ] и известен как параметрический полиморфизм .
Следующая программа вычисляет сумму двух вещей, для чего сложение реализуется с помощью универсальной функции:
use std::ops::Add;
// sum is a generic function with one type parameter, T
fn sum<T>(num1: T, num2: T) -> T
where
T: Add<Output = T>, // T must implement the Add trait where addition returns another T
{
num1 + num2 // num1 + num2 is syntactic sugar for num1.add(num2) provided by the Add trait
}
fn main() {
let result1 = sum(10, 20);
println!("Sum is: {}", result1); // Sum is: 30
let result2 = sum(10.23, 20.45);
println!("Sum is: {}", result2); // Sum is: 30.68
}
Во время компиляции полиморфные функции, такие как sum
создаются экземпляры конкретных типов, требуемых кодом; в данном случае сумма целых чисел и сумма чисел с плавающей запятой.
Обобщенные шаблоны можно использовать в функциях, чтобы обеспечить реализацию поведения для разных типов без повторения одного и того же кода. Универсальные функции могут быть написаны относительно других дженериков, не зная фактического типа. [ 93 ]
Функции
[ редактировать ]Система типов Rust поддерживает механизм, называемый типажами, вдохновленный классами типов в языке Haskell . [ 6 ] определить общее поведение между различными типами. Например, Add
черта может быть реализована для чисел с плавающей запятой и целых чисел, которые можно добавлять; и Display
или Debug
черты могут быть реализованы для любого типа, который можно преобразовать в строку. Черты могут использоваться для обеспечения набора общего поведения для разных типов без знания фактического типа. Эта возможность известна как специальный полиморфизм .
Универсальные функции могут ограничивать универсальный тип для реализации определенного признака или признаков; например, add_one
функции может потребоваться тип для реализации Add
. Это означает, что универсальную функцию можно проверить по типу сразу после ее определения. Реализация дженериков аналогична типичной реализации шаблонов C++: для каждого экземпляра создается отдельная копия кода. Это называется мономорфизацией и контрастирует со схемой стирания типов, обычно используемой в Java и Haskell. Стирание типа также доступно по ключевому слову dyn
(сокращение от динамического). [ 94 ] Поскольку мономорфизация дублирует код для каждого используемого типа, это может привести к более оптимизированному коду для конкретных случаев использования, но время компиляции и размер выходного двоичного файла также увеличиваются. [ 95 ]
Помимо определения методов для определяемого пользователем типа, impl
Ключевое слово может использоваться для реализации признака типа. [ 60 ] При реализации трейты могут предоставлять дополнительные производные методы. [ 96 ] Например, черта Iterator
требует, чтобы next
метод должен быть определен для типа. Как только next
метод определен, признак может предоставлять общие функциональные вспомогательные методы для итератора, такие как map
или filter
. [ 97 ]
Объекты черт
[ редактировать ]Черты Rust реализованы с использованием статической диспетчеризации , что означает, что тип всех значений известен во время компиляции; однако Rust также использует функцию, известную как объекты-характеристики , для выполнения динамической отправки (также известной как утиная типизация ). [ 98 ] Динамически отправляемые объекты свойств объявляются с использованием синтаксиса dyn Tr
где Tr
это черта. Объекты признаков имеют динамический размер, поэтому их необходимо поместить за указателем, например Box
. [ 99 ] В следующем примере создается список объектов, каждый из которых можно распечатать с помощью Display
черта:
use std::fmt::Display;
let v: Vec<Box<dyn Display>> = vec![
Box::new(3),
Box::new(5.0),
Box::new("hi"),
];
for x in v {
println!("{x}");
}
Если элемент в списке не реализует Display
черта, это вызовет ошибку времени компиляции. [ 100 ]
Безопасность памяти
[ редактировать ]Rust спроектирован так, чтобы быть безопасным для памяти . Он не допускает нулевых указателей, висячих указателей или гонок за данными . [ 101 ] [ 102 ] [ 103 ] Значения данных могут быть инициализированы только с помощью фиксированного набора форм, каждая из которых требует, чтобы их входные данные были уже инициализированы. [ 104 ]
Небезопасный код может обойти некоторые из этих ограничений, используя unsafe
ключевое слово. [ 79 ] Небезопасный код также может использоваться для низкоуровневых функций, таких как доступ к энергозависимой памяти , встроенные функции, специфичные для архитектуры, каламбур типов и встроенная сборка. [ 105 ]
Управление памятью
[ редактировать ]Rust не использует сбор мусора . Вместо этого память и другие ресурсы управляются по соглашению «получение ресурсов — это инициализация». [ 106 ] с дополнительным подсчетом ссылок . Rust обеспечивает детерминированное управление ресурсами с очень низкими накладными расходами . [ 107 ] значения выделяются в стеке По умолчанию , и все динамические выделения должны быть явными. [ 108 ]
Встроенные ссылочные типы, использующие &
символ не включает подсчет ссылок во время выполнения. Безопасность и достоверность базовых указателей проверяются во время компиляции, что предотвращает зависание указателей и другие формы неопределенного поведения . [ 109 ] Система типов Rust разделяет общие неизменяемые ссылки вида &T
из уникальных, изменяемых ссылок вида &mut T
. Изменяемую ссылку можно привести к неизменяемой ссылке, но не наоборот. [ 110 ]
Замыкания
[ редактировать ]В Rust анонимные функции называются замыканиями. [ 111 ] Они определяются с использованием следующего синтаксиса:
|<parameter-name>: <type>| -> <return-type> { <body> };
Например:
let f = |x: i32| -> i32 { x * 2 };
Однако с помощью вывода типа компилятор может определить тип каждого параметра и тип возвращаемого значения, поэтому приведенную выше форму можно записать как:
let f = |x| { x * 2 };
При замыканиях с одним выражением (т. е. телом с одной строкой) и неявным возвращаемым типом фигурные скобки можно опустить:
let f = |x| x * 2;
Замыкания без входного параметра записываются так:
let f = || println!("Hello, world!");
Замыкания могут передаваться в качестве входных параметров функций, которые ожидают указатель на функцию:
// A function which takes a function pointer as an argument and calls it with
// the value `5`.
fn apply(f: fn(i32) -> i32) -> i32 {
// No semicolon, to indicate an implicit return
f(5)
}
fn main() {
// Defining the closure
let f = |x| x * 2;
println!("{}", apply(f)); // 10
println!("{}", f(5)); // 10
}
Однако для описания того, как фиксируются значения в теле замыкания, могут потребоваться сложные правила. Они реализуются с помощью Fn
, FnMut
, и FnOnce
функции: [ 112 ]
Fn
: замыкание фиксируется по ссылке (&T
). Они используются для функций, которые все еще можно вызывать, если у них есть только ссылочный доступ (с&
) к окружающей среде.FnMut
: замыкание фиксируется по изменяемой ссылке (&mut T
). Они используются для функций, которые можно вызывать, если у них есть доступ к изменяемым ссылкам (с&mut
) к окружающей среде.FnOnce
: замыкание захватывает по значению (T
). Они используются для функций, которые вызываются только один раз.
Благодаря этим особенностям компилятор будет захватывать переменные наименее ограничительным образом. [ 112 ] Они помогают управлять тем, как значения перемещаются между областями действия, что очень важно, поскольку Rust следует конструкции жизненного цикла, чтобы гарантировать, что значения «заимствованы» и перемещены предсказуемым и явным образом. [ 113 ]
Ниже показано, как можно передать замыкание в качестве входного параметра, используя метод Fn
черта:
// A function that takes a value of type F (which is defined as
// a generic type that implements the `Fn` trait, e.g. a closure)
// and calls it with the value `5`.
fn apply_by_ref<F>(f: F) -> i32
where F: Fn(i32) -> i32
{
f(5)
}
fn main() {
let f = |x| {
println!("I got the value: {}", x);
x * 2
};
// Applies the function before printing its return value
println!("5 * 2 = {}", apply_by_ref(f));
}
// ~~ Program output ~~
// I got the value: 5
// 5 * 2 = 10
Предыдущее определение функции также можно для удобства сократить следующим образом:
fn apply_by_ref(f: impl Fn(i32) -> i32) -> i32 {
f(5)
}
Макросы
[ редактировать ]Язык Rust можно расширить с помощью макросов.
Декларативные макросы
[ редактировать ]Декларативный макрос (также называемый «макросом по примеру») — это макрос, который использует сопоставление с образцом для определения своего расширения. [ 114 ] [ 115 ]
Процедурные макросы
[ редактировать ]компилятора Процедурные макросы — это функции Rust, которые запускают и изменяют входной поток токенов до компиляции любых других компонентов. Они, как правило, более гибкие, чем декларативные макросы, но их сложнее поддерживать из-за их сложности. [ 116 ] [ 117 ]
Процедурные макросы бывают трех видов:
- Функциональные макросы
custom!(...)
- Получение макросов
#[derive(CustomDerive)]
- Макросы атрибутов
#[custom_attribute]
The println!
макрос является примером функционального макроса. serde_derive
макрос [ 118 ] предоставляет широко используемую библиотеку для генерации кода
для чтения и записи данных во многих форматах, таких как JSON . Макросы атрибутов обычно используются для языковых привязок, таких как extendr
библиотека для привязок Rust R. к [ 119 ]
Следующий код показывает использование Serialize
, Deserialize
, и Debug
-производные процедурные макросы
реализовать чтение и запись JSON, а также возможность форматировать структуру для отладки.
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let point = Point { x: 1, y: 2 };
let serialized = serde_json::to_string(&point).unwrap();
println!("serialized = {}", serialized);
let deserialized: Point = serde_json::from_str(&serialized).unwrap();
println!("deserialized = {:?}", deserialized);
}
Вариативные макросы
[ редактировать ]Rust не поддерживает переменные аргументы в функциях. Вместо этого он использует макросы . [ 120 ]
macro_rules! calculate {
// The pattern for a single `eval`
(eval $e:expr) => {{
{
let val: usize = $e; // Force types to be integers
println!("{} = {}", stringify!{$e}, val);
}
}};
// Decompose multiple `eval`s recursively
(eval $e:expr, $(eval $es:expr),+) => {{
calculate! { eval $e }
calculate! { $(eval $es),+ }
}};
}
fn main() {
calculate! { // Look ma! Variadic `calculate!`!
eval 1 + 2,
eval 3 + 4,
eval (2 * 3) + 1
}
}
c_variadic
переключатель функций. Как и другие интерфейсы C, система считается unsafe
к Русту. [ 121 ] Интерфейс с C и C++
[ редактировать ]В Rust есть интерфейс внешних функций (FFI), который можно использовать как для вызова кода, написанного на таких языках, как C , из Rust, так и для вызова кода Rust с этих языков. По состоянию на 2024 год [update]существует внешняя библиотека CXX для вызова C++ или из него. [ 122 ] Rust и C различаются тем, как они размещают структуры в памяти, поэтому структурам Rust можно присвоить #[repr(C)]
атрибут, обеспечивающий тот же макет, что и эквивалентная структура C. [ 123 ]
Экосистема
[ редактировать ]
Экосистема Rust включает в себя компилятор, стандартную библиотеку и дополнительные компоненты для разработки программного обеспечения. Установкой компонентов обычно управляет rustup
Rust , установщик набора инструментов , разработанный в рамках проекта Rust. [ 124 ]
Компилятор
[ редактировать ]Компилятор Rust назван rustc
и переводит код Rust в язык низкого уровня, называемый промежуточным представлением LLVM (LLVM IR). Затем LLVM вызывается как подкомпонент для перевода IR-кода в машинный код . Затем компоновщик . используется для объединения нескольких контейнеров в один исполняемый или двоичный файл [ 125 ] [ 126 ]
Помимо LLVM, компилятор также поддерживает использование альтернативных бэкэндов, таких как GCC и Cranelift, для генерации кода. [ 127 ] Целью этих альтернативных бэкэндов является увеличение охвата платформы Rust или сокращение времени компиляции. [ 128 ] [ 129 ]
Стандартная библиотека
[ редактировать ]Стандартная библиотека Rust определяет и реализует множество широко используемых пользовательских типов данных, включая основные структуры данных, такие как Vec
, Option
, и HashMap
, а также типы интеллектуальных указателей . Rust также предоставляет возможность исключить большую часть стандартной библиотеки с помощью атрибута #![no_std]
; это позволяет приложениям, таким как встроенные устройства, удалять код зависимостей или предоставлять свои собственные основные структуры данных. Внутри стандартная библиотека разделена на три части: core
, alloc
, и std
, где std
и alloc
исключены #![no_std]
. [ 130 ]

Груз
[ редактировать ]Rust Cargo — это система сборки и менеджер пакетов . Он загружает, компилирует, распространяет и загружает пакеты, называемые ящиками , которые сохраняются в официальном реестре. Он также выступает в качестве интерфейса для Clippy и других компонентов Rust. [ 131 ]
По умолчанию Cargo получает свои зависимости из реестра, созданного пользователем crates.io , но Git в локальной файловой системе, а также другие внешние источники. в качестве зависимостей также можно указать репозитории и ящики [ 132 ]
Ржавчина
[ редактировать ]Rustfmt — форматировщик кода для Rust. Он форматирует пробелы и отступы для создания кода в соответствии с общим стилем , если не указано иное. Его можно вызвать как отдельную программу или из проекта Rust через Cargo. [ 133 ]

Клиппи
[ редактировать ]Clippy — это встроенный в Rust инструмент проверки , позволяющий улучшить корректность, производительность и читаемость кода Rust. По состоянию на 2024 год [update], он имеет более 700 правил. [ 134 ] [ 135 ]
Система версий
[ редактировать ]После Rust 1.0 новые функции разрабатываются в ночных версиях, которые выпускаются ежедневно. В течение каждого шестинедельного цикла выпуска изменения ночных версий переводятся в бета-версию, а изменения предыдущей бета-версии переводятся в новую стабильную версию. [ 136 ]
Каждые два-три года выпускается новое «издание». Выпускаются версии, позволяющие вносить ограниченные критические изменения , например продвигать await
к ключевому слову для поддержки функций async/await . Крейты, предназначенные для разных выпусков, могут взаимодействовать друг с другом, поэтому крейт может обновиться до новой редакции, даже если его вызывающие программы или его зависимости по-прежнему ориентированы на более старые выпуски. Переход на новую редакцию можно облегчить с помощью автоматизированных инструментов. [ 137 ]
поддержка IDE
[ редактировать ]rust-analyzer — это набор утилит, которые предоставляют интегрированным средам разработки (IDE) и текстовым редакторам информацию о проекте Rust через протокол языкового сервера . Это включает такие функции, как автодополнение и отображение ошибок компиляции во время редактирования. [ 138 ]
Производительность
[ редактировать ]В общем, гарантии безопасности памяти Rust не накладывают накладных расходов во время выполнения. [ 139 ] Заметным исключением является индексация массива , которая проверяется во время выполнения, хотя часто это не влияет на производительность. [ 140 ] Поскольку Rust не выполняет сборку мусора, он часто работает быстрее, чем другие языки, безопасные для памяти. [ 141 ] [ 84 ] [ 142 ]
Rust предоставляет два «режима»: безопасный и небезопасный. Безопасный режим — это «обычный» режим, в котором написана большая часть Rust. В небезопасном режиме разработчик несет ответственность за безопасность памяти кода, которая используется разработчиками в тех случаях, когда компилятор слишком ограничителен. [ 143 ]
Многие из функций Rust являются так называемыми абстракциями с нулевой стоимостью , что означает, что они оптимизируются во время компиляции и не несут никаких потерь во время выполнения. [ 144 ] Система владения и заимствования допускает реализацию с нулевым копированием для некоторых задач, чувствительных к производительности, таких как синтаксический анализ . [ 145 ] Статическая диспетчеризация используется по умолчанию для устранения вызовов методов , за исключением методов, вызываемых динамическими объектами типажей. [ 146 ] Компилятор также использует встроенное расширение для устранения вызовов функций и вызовов статически отправляемых методов. [ 147 ]
Поскольку Rust использует LLVM , любые улучшения производительности в LLVM также переносятся и на Rust. [ 148 ] В отличие от C и C++, Rust позволяет переупорядочивать элементы структуры и перечисления. [ 149 ] для уменьшения размеров структур в памяти, для лучшего выравнивания памяти и повышения к кэшу . эффективности доступа [ 150 ]
Принятие
[ редактировать ]
Rust использовался в программном обеспечении в разных областях. Первоначально Rust финансировался Mozilla в рамках разработки Servo , экспериментального параллельного браузерного движка, в сотрудничестве с Samsung . [ 151 ] Компоненты движка Servo позже были включены в движок браузера Gecko , лежащий в основе Firefox. [ 152 ] В январе 2023 года Google ( Alphabet ) объявила о поддержке использования сторонних библиотек Rust в Chromium . [ 153 ] [ 154 ]
Rust используется в нескольких проектах серверного программного обеспечения крупных веб-сервисов . OpenDNS , служба разрешения DNS , принадлежащая Cisco , использует Rust внутри себя. [ 155 ] [ 156 ] Amazon Web Services использует Rust в «компонентах, чувствительных к производительности» нескольких своих сервисов. В 2019 году AWS выпустила с открытым исходным кодом Firecracker — решение для виртуализации, написанное в основном на Rust. [ 157 ] Microsoft Azure IoT Edge, платформа, используемая для запуска сервисов Azure на устройствах Интернета вещей , имеет компоненты, реализованные на Rust. [ 158 ] Microsoft также использует Rust для запуска контейнерных модулей с помощью WebAssembly и Kubernetes . [ 159 ] Cloudflare , компания, предоставляющая сетевые услуги доставки контента , использовала Rust для создания нового веб-прокси под названием Pingora для повышения производительности и эффективности. [ 160 ] Менеджер пакетов npm начал использовать Rust для своей службы аутентификации в 2019 году. [ 161 ] [ 162 ] [ 163 ]
В операционных системах разработчики Android использовали Rust в 2021 году для переписывания существующих компонентов. [ 164 ] [ 165 ] Проект Rust for Linux , запущенный в 2020 году, добавил первоначальную поддержку Rust в Linux в конце 2022 года, а первые драйверы Linux, написанные на Rust, были выпущены в конце 2023 года. [ 166 ] [ 167 ] Microsoft переписывает части Windows на Rust. [ 168 ] Проект r9 направлен на повторную реализацию Plan 9 от Bell Labs в Rust. [ 169 ] Rust использовался при разработке новых операционных систем, таких как Redox , «Unix-подобная» операционная система и микроядро . [ 170 ] Тесей, экспериментальная операционная система с модульным управлением состояниями, [ 171 ] [ 172 ] и большая часть фуксии . [ 173 ] Rust также используется для инструментов командной строки и компонентов операционной системы, включая stratisd , файловой системы. менеджер [ 174 ] [ 175 ] и COSMIC, среда рабочего стола от System76 . [ 176 ]
В веб-разработке Deno , безопасная среда выполнения для JavaScript и TypeScript , построена на базе V8 с использованием Rust и Tokio. [ 177 ] Другие заметные разработки в этой области включают Ruffle с открытым исходным кодом , эмулятор SWF , [ 178 ] и Polkadot , платформа блокчейна и криптовалют с открытым исходным кодом . [ 179 ]
Discord , компания-разработчик программного обеспечения для обмена мгновенными сообщениями , переписала части своей системы на Rust для повышения производительности в 2020 году. В том же году Dropbox объявила, что синхронизация файлов была переписана на Rust. Facebook ( Meta ) также использовал Rust для редизайна своей системы управления исходным кодом внутренних проектов. [ 16 ]
В опросе разработчиков Stack Overflow 2023 года 13% респондентов недавно провели обширную разработку на Rust. [ 180 ] Опрос также называл Rust «самым любимым языком программирования» каждый год с 2016 по 2023 год (включительно), исходя из количества разработчиков, заинтересованных в продолжении работы на том же языке. [ 181 ] [ примечание 5 ] В 2023 году Rust занял 6-е место среди «самых востребованных технологий», при этом 31% разработчиков, которые в настоящее время не работают в Rust, выразили заинтересованность в этом. [ 180 ]
В академических исследованиях
[ редактировать ]Rust изучался в академических исследованиях как на предмет свойств самого языка, так и на предмет полезности, которую язык обеспечивает для написания программного обеспечения, используемого для исследований. Его особенности, связанные с безопасностью [ 182 ] [ 143 ] и производительность [ 183 ] были осмотрены.
В журнальной статье, опубликованной в Proceedings of the International Astronomical Union , астрофизики Бланко-Куаресма и Болмонт повторно реализовали программы, отвечающие за моделирование многопланетных систем в Rust, и обнаружили, что это конкурентоспособный язык программирования по своей «скорости и точности». [ 15 ] Аналогичным образом, в статье, опубликованной в журнале Nature, рассказывается несколько историй о том, как биоинформатики использовали Rust из-за его производительности и безопасности. [ 131 ] Тем не менее, в обеих статьях уникальные концепции Rust, включая его систему владения, которую трудно изучить, названы одним из основных недостатков внедрения Rust.
Сообщество
[ редактировать ]
Было отмечено, что Rust имеет инклюзивное сообщество и особенно приветствует людей из квир-сообщества , отчасти из-за своего кодекса поведения , в котором изложен ряд ожиданий, которым должны следовать члены сообщества Rust. В одной из статей MIT Technology Review сообщество Rust описывается как «необычайно дружелюбное» к новичкам. [ 16 ] [ 131 ]
Фонд ржавчины
[ редактировать ]![]() | |
Формирование | 8 февраля 2021 г |
---|---|
Основатели | |
Тип | Некоммерческая организация |
Расположение | |
Шейн Миллер | |
Ребекка Рамбул | |
Веб-сайт | фундамент |
Rust Foundation — это некоммерческая членская организация, зарегистрированная в США , основной целью которой является поддержка технического проекта в качестве юридического лица и помощь в управлении товарными знаками и инфраструктурными активами. [ 186 ] [ 35 ]
Он был создан 8 февраля 2021 года пятью корпоративными членами-учредителями (Amazon Web Services, Huawei, Google, Microsoft и Mozilla). [ 187 ] Совет фонда возглавляет Шейн Миллер. [ 188 ] С конца 2021 года ее исполнительным директором и генеральным директором станет Ребекка Рамбул. [ 189 ] До этого временным исполнительным директором была Эшли Уильямс. [ 35 ]
Управленческие команды
[ редактировать ]Проект Rust состоит из команд , отвечающих за различные области разработки. Команда компилятора разрабатывает, управляет и оптимизирует внутренние компоненты компилятора; а языковая группа разрабатывает новые функции языка и помогает их реализовать. На сайте проекта Rust перечислены 6 команд высшего уровня по состоянию на июль 2024 года. [update]. [ 190 ] Представители команд образуют Лидерский совет, который курирует проект Rust в целом. [ 191 ]
См. также
[ редактировать ]- Сравнение языков программирования
- История языков программирования
- Список языков программирования
- Список языков программирования по типам
Примечания
[ редактировать ]- ^ Включая инструменты сборки, инструменты хоста и поддержку стандартных библиотек для x86-64 , ARM , MIPS , RISC-V , WebAssembly , i686 , AArch64 , PowerPC и s390x . [ 2 ]
- ^ Включая Windows , Linux , macOS , FreeBSD , NetBSD и Illumos . Инструменты сборки хоста для Android , iOS , Haiku , Redox и Fuchsia официально не поставляются; эти операционные системы поддерживаются в качестве целевых. [ 2 ]
- ^ Сторонние зависимости, например LLVM или MSVC , регулируются собственными лицензиями. [ 3 ] [ 4 ]
- ^ В системах Unix это часто строки UTF-8 без внутреннего 0 байта. В Windows это строки UTF-16 без внутреннего 0 байта. В отличие от этих,
str
иString
всегда действительны в формате UTF-8 и могут содержать внутренние нули. - ^ То есть среди респондентов, которые проделали «обширную работу по разработке [с Rust] за последний год» (13,05%), у Rust был самый большой процент тех, кто также выразил интерес к «работе с [Rust] в следующем году» ( 84,66%). [ 180 ]
Ссылки
[ редактировать ]Источники книг
[ редактировать ]- Гьенгсет, Джон (2021). Ржавчина для рустообразных (1-е изд.). Нет крахмального пресса. ISBN 9781718501850 . OCLC 1277511986 .
- Клабник, Стив; Николс, Кэрол (12 августа 2019 г.). Язык программирования Rust (охватывает Rust 2018) . Нет крахмального пресса. ISBN 978-1-7185-0044-0 .
- Блэнди, Джим; Орендорф, Джейсон; Тиндалл, Леонора Ф.С. (2021). Программирование на Rust: быстрая и безопасная разработка систем (2-е изд.). О'Рейли Медиа. ISBN 978-1-4920-5254-8 . OCLC 1289839504 .
- Макнамара, Тим (2021). Ржавчина в действии . Публикации Мэннинга. ISBN 978-1-6172-9455-6 . OCLC 1153044639 .
- Клабник, Стив; Николс, Кэрол (2023). Язык программирования Rust (2-е изд.). Нет крахмального пресса. ISBN 978-1-7185-0310-6 . OCLC 1363816350 .
Другие
[ редактировать ]- ^ «Анонсируем Rust 1.81.0» . 05.09.2024 . Проверено 05 сентября 2024 г.
- ^ Перейти обратно: а б «Поддержка платформы» . Русская книга . Проверено 27 июня 2022 г.
- ^ «Язык программирования Rust» . Язык программирования Rust. 2022-10-19.
- ^ «Правовая политика Rust» . Rust-lang.org . Архивировано из оригинала 4 апреля 2018 г. Проверено 03 апреля 2018 г.
- ^ «Типы уникальности» . Ржавый блог . Проверено 8 октября 2016 г.
Те из вас, кто знаком со стилем Elm, возможно, поймут, что обновленный Сообщения --explain черпают вдохновение из подхода Elm.
- ^ Перейти обратно: а б «Влияния — Справочник по ржавчине» . Справочник по ржавчине . Архивировано из оригинала 26 ноября 2023 г. Проверено 31 декабря 2023 г.
- ^ «Типы уникальности» . Документация Идриса 1.3.3 . Проверено 14 июля 2022 г.
Они вдохновлены… типами владения и заимствованными указателями из языка программирования Rust.
- ^ «Microsoft открывает на GitHub язык программирования Project Verona, вдохновленный Rust» . ЗДНет . Архивировано из оригинала 17 января 2020 г. Проверено 17 января 2020 г.
- ^ Джалоян, Жорж-Аксель (19 октября 2017 г.). «Безопасные указатели в СПАРК 2014». arXiv : 1710.07047 [ cs.PL ].
- ^ Латтнер, Крис. «Домашняя страница Криса Лэттнера» . Nondot.org . Архивировано из оригинала 25 декабря 2018 г. Проверено 14 мая 2019 г.
- ^ «V документация (Введение)» . Гитхаб . Проверено 4 ноября 2023 г.
- ^ Егулалп, Сердар (29 августа 2016 г.). «Новый претендент присоединяется к Rust, чтобы свергнуть язык C» . Инфомир . Проверено 19 октября 2022 г.
- ^ Эшварла, Прабху (24 декабря 2020 г.). Практическое системное программирование для разработчиков Rust: создавайте быстрое и безопасное программное обеспечение для систем Linux/Unix с помощью практических примеров . Packt Publishing Ltd. ISBN 978-1-80056-201-1 .
- ^ Блэнди, Джим; Орендорф, Джейсон (21 ноября 2017 г.). Программирование на Rust: быстрая и безопасная разработка систем . O'Reilly Media, Inc. ISBN 978-1-4919-2725-0 .
- ^ Перейти обратно: а б Бланко-Куаресма, Сержи; Болмонт, Эмелин (30 мая 2017 г.). «Что язык программирования Rust может сделать для астрофизики?» . Труды Международного астрономического союза . 12 (С325): 341–344. arXiv : 1702.02951 . Бибкод : 2017IAUS..325..341B . дои : 10.1017/S1743921316013168 . ISSN 1743-9213 . S2CID 7857871 .
- ^ Перейти обратно: а б с д и Томпсон, Клайв (14 февраля 2023 г.). «Как Rust превратился из побочного проекта в самый любимый в мире язык программирования» . Обзор технологий Массачусетского технологического института . Проверено 23 февраля 2023 г.
- ^ Перейти обратно: а б Аврам, Авель (3 августа 2012 г.). «Интервью о Rust, языке системного программирования, разработанном Mozilla» . ИнфоВ. Архивировано из оригинала 24 июля 2013 г. Проверено 17 августа 2013 г.
- ^ «Ржавый логотип» . bugzilla.mozilla.org . Проверено 2 февраля 2024 г.
- ^ Хоар, Грейдон (29 марта 2012 г.). «[rust-dev] Выпущена версия Rust 0.2» . mail.mozilla.org . Архивировано из оригинала 06.11.2022 . Проверено 4 апреля 2024 г.
- ^ Хоар, Грейдон (12 июля 2012 г.). «[rust-dev] Выпущена версия Rust 0.3» . mail.mozilla.org . Архивировано из оригинала 24 августа 2022 г. Проверено 12 июня 2022 г.
- ^ Хоар, Грейдон (15 октября 2012 г.). «[rust-dev] Выпущена версия Rust 0.4» . mail.mozilla.org . Архивировано из оригинала 31 октября 2021 г. Проверено 31 октября 2021 г.
- ^ Бинсток, Эндрю (07 января 2014 г.). «Взлет и падение языков в 2013 году» . Журнал доктора Добба . Архивировано из оригинала 7 августа 2016 г. Проверено 20 ноября 2022 г.
- ^ Лардинуа, Фредерик (29 сентября 2017 г.). «Пришло время дать Firefox еще один шанс» . ТехКранч . Проверено 15 августа 2023 г.
- ^ Чимпану, Каталин (11 августа 2020 г.). «Mozilla увольняет 250 сотрудников и переориентируется на коммерческие продукты» . ЗДНет . Архивировано из оригинала 18 марта 2022 г. Проверено 2 декабря 2020 г.
- ^ Купер, Дэниел (11 августа 2020 г.). «Mozilla увольняет 250 сотрудников из-за пандемии» . Engadget . Архивировано из оригинала 13 декабря 2020 г. Проверено 2 декабря 2020 г.
- ^ Тунг, Лиам. «Язык программирования Rust: сокращение рабочих мест в Mozilla сильно ударило по нам, но вот как мы выживем» . ЗДНет. Архивировано из оригинала 21 апреля 2022 г. Проверено 21 апреля 2022 г.
- ^ «Закладываем фундамент для будущего Rust» . Ржавый блог . 18.08.2020. Архивировано из оригинала 2 декабря 2020 г. Проверено 2 декабря 2020 г.
- ^ "Привет, мир!" . Фонд ржавчины . 08.02.2020. Архивировано из оригинала 19 апреля 2022 г. Проверено 4 июня 2022 г.
- ^ «Mozilla приветствует Rust Foundation» . Блог Мозиллы . 09.02.2021. Архивировано из оригинала 08 февраля 2021 г. Проверено 9 февраля 2021 г.
- ^ Амадео, Рон (07 апреля 2021 г.). «Google сейчас пишет низкоуровневый код Android на Rust» . Арс Техника . Архивировано из оригинала 8 апреля 2021 г. Проверено 8 апреля 2021 г.
- ^ Андерсон, Тим (23 ноября 2021 г.). «Вся команда модераторов Rust уходит в отставку» . Регистр . Проверено 4 августа 2022 г.
- ^ «Обновление управления» . Блог изнутри Rust . Проверено 27 октября 2022 г.
- ^ Клэберн, Томас (17 апреля 2023 г.). «Rust Foundation приносит извинения за путаницу в политике в отношении товарных знаков» . Регистр . Проверено 7 мая 2023 г.
- ^ Доказано, Лиам (27 ноября 2019 г.). «Ребекка Рамбул назначена новым генеральным директором The Rust Foundation» . Регистр . Проверено 14 июля 2022 г.
Оба являются языками с фигурными скобками и имеют синтаксис, подобный C, что делает их непугающими для программистов C.
- ^ Перейти обратно: а б с Вильяроло, Брэндон (10 февраля 2021 г.). «Язык программирования Rust теперь имеет свою независимую основу» . Техреспублика . Архивировано из оригинала 20 марта 2023 г. Проверено 14 июля 2022 г.
- ^ Клабник и Николс 2019 , с. 263.
- ^ Клабник и Николс 2019 , стр. 5–6.
- ^ Клабник и Николс 2023 , с. 32.
- ^ Клабник и Николс 2023 , стр. 32–33.
- ^ Клабник и Николс 2023 , стр. 49–50.
- ^ Клабник и Николс 2023 , стр. 34–36.
- ^ Клабник и Николс 2023 , стр. 6, 44, 47.
- ^ Клабник и Николс 2023 , стр. 50–52.
- ^ Клабник и Николс 2023 , с. 56.
- ^ Клабник и Николс 2023 , стр. 57–58.
- ^ Клабник и Николс 2023 , стр. 54–56.
- ^ Клабник и Николс 2019 , стр. 50–53.
- ^ Тайсон, Мэтью (3 марта 2022 г.). «Программирование на Rust для Java-разработчиков» . Инфомир . Проверено 14 июля 2022 г.
- ^ Клабник и Николс 2019 , стр. 104–109.
- ^ Клабник и Николс 2019 , стр. 24.
- ^ Клабник и Николс 2019 , стр. 36–38.
- ^ Клабник и Николс 2023 , стр. 36–38.
- ^ Клабник и Николс 2023 , с. 502.
- ^ «Глоссарий терминов Юникода» . Консорциум Юникод . Проверено 30 июля 2024 г.
- ^ Клабник и Николс 2019 , стр. 38–40.
- ^ Клабник и Николс 2019 , с. 83.
- ^ Клабник и Николс 2019 , с. 97.
- ^ Клабник и Николс 2019 , стр. 98–101.
- ^ Клабник и Николс 2019 , стр. 438–440.
- ^ Перейти обратно: а б Клабник и Николс 2019 , стр. 93.
- ^ «OsStr в std::ffi — Rust» . doc.rust-lang.org . Проверено 2 октября 2023 г.
- ^ «OsString в std::ffi — Rust» . doc.rust-lang.org . Проверено 2 октября 2023 г.
- ^ «Путь в std::path — Rust» . doc.rust-lang.org . Проверено 2 октября 2023 г.
- ^ «PathBuf в std::path — Rust» . doc.rust-lang.org . Проверено 2 октября 2023 г.
- ^ Перейти обратно: а б с "std::boxed — Rust" . doc.rust-lang.org . Проверено 23 июня 2023 г.
- ^ "std::boxed — Rust" . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «Rc в std::rc — Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «Дуга в std::sync — Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «Ячейка в std::cell — Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «Мьютекс в std::sync — Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «RwLock в std::sync — Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «Кондвар в std::sync — Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «Продолжительность в std::time – Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «HashMap в std::collections — Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ «BTreeMap в std::collections — Rust» . doc.rust-lang.org . Проверено 24 июня 2023 г.
- ^ Макнамара 2021 .
- ^ Клабник и Николс 2019 , стр. 101–104.
- ^ "std::option - Rust" . doc.rust-lang.org . Проверено 12 ноября 2023 г.
- ^ Перейти обратно: а б Клабник и Николс 2019 , стр. 418–427.
- ^ «Литье — ржавчина на примере» . doc.rust-lang.org .
- ^ Клабник и Николс 2019 , стр. 59–61.
- ^ Перейти обратно: а б Клабник и Николс 2019 , стр. 63–68.
- ^ Клабник и Николс 2019 , стр. 74–75.
- ^ Перейти обратно: а б Баласубраманиан, Абхирам; Барановский, Марек С.; Бурцев Антон; Панда, Ауроджит; Ракамарич, Звонимир; Рыжик, Леонид (07.05.2017). «Системное программирование на Rust» . Материалы 16-го семинара по актуальным темам операционных систем . ХоОС '17. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 156–161. дои : 10.1145/3102980.3103006 . ISBN 978-1-4503-5068-6 . S2CID 24100599 . Архивировано из оригинала 11 июня 2022 г. Проверено 1 июня 2022 г.
- ^ Клабник и Николс 2023 , стр. 327–30.
- ^ Клабник и Николс 2019 , с. 194.
- ^ Клабник и Николс 2019 , стр. 75, 134.
- ^ Шамрелл-Харрингтон, Нелл. «Проверка заемных средств на ржавчину – глубокое погружение» . ИнфоQ . Проверено 25 июня 2022 г.
- ^ Клабник и Николс 2019 , стр. 194–195.
- ^ Клабник и Николс 2023 , стр. 208–12.
- ^ Клабник и Николс 2019 , стр. 201–203.
- ^ Клабник и Николс 2019 , стр. 171–172.
- ^ Клабник и Николс 2019 , стр. 171–172, 205.
- ^ Клабник и Николс 2019 , стр. 181, 182.
- ^ Ggenset 2021 , с. 25.
- ^ Клабник и Николс 2019 , стр. 182–184.
- ^ Клабник и Николс 2019 , стр. 281–283.
- ^ «Использование объектов-типов, допускающих значения разных типов — язык программирования Rust» . doc.rust-lang.org . Проверено 11 июля 2022 г.
- ^ Клабник и Николс 2019 , стр. 441–442.
- ^ Клабник и Николс 2019 , стр. 379–380.
- ^ Розенблатт, Сет (3 апреля 2013 г.). «Samsung присоединяется к Mozilla в поисках Rust» . CNET . Архивировано из оригинала 4 апреля 2013 г. Проверено 5 апреля 2013 г.
- ^ Браун, Нил (17 апреля 2013 г.). «Вкус ржавчины» . LWN.net . Архивировано из оригинала 26 апреля 2013 г. Проверено 25 апреля 2013 г.
- ^ «Гонки – Рустономикон» . doc.rust-lang.org . Архивировано из оригинала 10 июля 2017 г. Проверено 3 июля 2017 г.
- ^ «Часто задаваемые вопросы по языку Rust» . static.rust-lang.org . 2015. Архивировано из оригинала 20 апреля 2015 г. Проверено 24 апреля 2017 г.
- ^ Макнамара 2021 , с. 139, 376–379, 395.
- ^ «RAII – ржавчина на примере» . doc.rust-lang.org . Архивировано из оригинала 21 апреля 2019 г. Проверено 22 ноября 2020 г.
- ^ «Абстракция без накладных расходов: особенности Rust» . Ржавый блог . Архивировано из оригинала 23 сентября 2021 г. Проверено 19 октября 2021 г.
- ^ «Коробка, стопка и куча» . Ржавчина на примере . Проверено 13 июня 2022 г.
- ^ Клабник и Николс 2019 , стр. 70–75.
- ^ Клабник и Николс 2019 , с. 323.
- ^ «Замыкания — пример ржавчины» . doc.rust-lang.org .
- ^ Перейти обратно: а б «В качестве входных параметров — пример Rust» . doc.rust-lang.org .
- ^ «Время жизни — ржавчина на примере» . doc.rust-lang.org .
- ^ «Макросы на примере» . Справочник по ржавчине . Проверено 21 апреля 2023 г.
- ^ Клабник и Николс 2019 , стр. 446–448.
- ^ «Процедурные макросы» . Справочник по языку программирования Rust . Архивировано из оригинала 07.11.2020 . Проверено 23 марта 2021 г.
- ^ Клабник и Николс 2019 , стр. 449–455.
- ^ «Серде Дериве» . Документация Serde Derive . Архивировано из оригинала 17 апреля 2021 г. Проверено 23 марта 2021 г.
- ^ «extendr_api — Руст» . Документация по API Extendr . Архивировано из оригинала 25 мая 2021 г. Проверено 23 марта 2021 г.
- ^ «Вариадики» . Ржавчина на примере .
- ^ «2137-вариативный» . Книга Rust RFC .
- ^ «Безопасное взаимодействие Rust и C++ с CXX» . ИнфоQ . 06.12.2020. Архивировано из оригинала 22 января 2021 г. Проверено 03 января 2021 г.
- ^ «Макет текста – Справочник по Rust» . doc.rust-lang.org . Проверено 15 июля 2022 г.
- ^ Бланди, Орендорф и Тиндалл, 2021 , стр. 6–8.
- ^ Макнамара 2021 , стр. 411–412.
- ^ «Обзор компилятора» . Руководство по разработке компилятора Rust . Проверено 2 июня 2023 г.
- ^ «Генерация кода — Руководство по разработке компилятора Rust» . rust-dev-guide.rust-lang.org . Проверено 3 марта 2024 г.
- ^ "rust-lang/rustc_codegen_gcc" . Гитхаб . Язык программирования Rust. 02.03.2024 . Проверено 3 марта 2024 г.
- ^ "rust-lang/rustc_codegen_cranelift" . Гитхаб . Язык программирования Rust. 02.03.2024 . Проверено 3 марта 2024 г.
- ^ Ggenset 2021 , с. 213-215.
- ^ Перейти обратно: а б с Перкель, Джеффри М. (01 декабря 2020 г.). «Почему ученые обращаются к Rust» . Природа . 588 (7836): 185–186. Бибкод : 2020Natur.588..185P . дои : 10.1038/d41586-020-03382-2 . ПМИД 33262490 . S2CID 227251258 . Архивировано из оригинала 06 мая 2022 г. Проверено 15 мая 2022 г.
- ^ Симона, Серхио Де (18 апреля 2019 г.). «Rust 1.34 представляет альтернативные реестры для закрытых крейтов» . ИнфоQ . Проверено 14 июля 2022 г.
- ^ Клабник и Николс 2019 , стр. 511–512.
- ^ Clippy , Язык программирования Rust, 30 ноября 2023 г. , получено 30 ноября 2023 г.
- ^ «Клиппи Линтс» . Язык программирования Rust . Проверено 30 ноября 2023 г.
- ^ Klabnik & Nichols 2019 , Приложение G – Как создается ржавчина и «Ночная ржавчина»
- ^ Бланди, Орендорф и Тиндалл, 2021 , стр. 176–177.
- ^ Клабник и Николс 2023 , с. 623.
- ^ Макнамара 2021 , с. 11.
- ^ Попеску, Натали; Сюй, Цзыян; Апостолакис, Сотирис; Август, Дэвид И.; Леви, Амит (15 октября 2021 г.). «Безопаснее на любой скорости: автоматическое контекстно-зависимое повышение безопасности для Rust» . Труды ACM по языкам программирования . 5 (ООПСЛА). Раздел 2. doi : 10.1145/3485480 . S2CID 238212612 . п. 5:
Мы наблюдаем большую разницу в издержках проверенного индексирования: 23,6% тестов сообщают о значительном снижении производительности от проверенного индексирования, но 64,5% сообщают о незначительном влиянии или его отсутствии, и, что удивительно, 11,8% сообщают об улучшении производительности... В конечном итоге , хотя неконтролируемое индексирование может повысить производительность, в большинстве случаев это не так.
- ^ Андерсон, Тим. «Может ли Руст спасти планету? Почему и почему бы и нет» . Регистр . Проверено 11 июля 2022 г.
- ^ Егулалп, Сердар (06 октября 2021 г.). «Что такое язык Rust? Безопасная, быстрая и простая разработка программного обеспечения» . Инфомир . Проверено 25 июня 2022 г.
- ^ Перейти обратно: а б Астраускас, Витаутас; Матея, Кристоф; Поли, Федерико; Мюллер, Питер; Саммерс, Александр Дж. (13 ноября 2020 г.). «Как программисты используют небезопасный ржавчину?» . Труды ACM по языкам программирования . 4 (OOPSLA): 1–27. дои : 10.1145/3428204 . hdl : 20.500.11850/465785 . ISSN 2475-1421 .
- ^ Макнамара 2021 , с. 19, 27.
- ^ Купри, Жоффруа (2015). «Nom, байт-ориентированная, потоковая передача, нулевое копирование, библиотека комбинаторов парсеров в Rust» . Семинары IEEE по безопасности и конфиденциальности , 2015 г. стр. 142–148. дои : 10.1109/SPW.2015.31 . ISBN 978-1-4799-9933-0 . S2CID 16608844 .
- ^ Макнамара 2021 , с. 20.
- ^ «Генерация кода — Справочник по Rust» . doc.rust-lang.org . Проверено 9 октября 2022 г.
- ^ «Насколько быстро ржавеет?» . Часто задаваемые вопросы по языку программирования Rust . Архивировано из оригинала 28 октября 2020 г. Проверено 11 апреля 2019 г.
- ^ Фаршин, Алиреза; Барбетт, Том; Рузбе, Амир; Магуайр-младший, Джеральд К.; Костич, Деян (2021). «PacketMill: к сети со скоростью 100 ГБ/с на каждое ядро». Материалы 26-й Международной конференции ACM по архитектурной поддержке языков программирования и операционных систем . стр. 1–17. дои : 10.1145/3445814.3446724 . ISBN 9781450383172 . S2CID 231949599 . Проверено 12 июля 2022 г.
... В то время как некоторые компиляторы (например, Rust) поддерживают переупорядочение структур [82], компиляторам C и C++ запрещено переупорядочивать структуры данных (например, структуру или класс) [74] ...
- ^ «Тип-макет» . Справочник по ржавчине . Проверено 14 июля 2022 г.
- ^ Лардинуа, Фредерик (3 апреля 2015 г.). «Mozilla и Samsung объединяются для разработки Servo, браузерного движка следующего поколения Mozilla для многоядерных процессоров» . ТехКранч . Архивировано из оригинала 10 сентября 2016 г. Проверено 25 июня 2017 г.
- ^ Кейзер, Грегг (31 октября 2016 г.). «Mozilla планирует омолодить Firefox в 2017 году» . Компьютерный мир . Проверено 13 мая 2023 г.
- ^ Клэберн, Томас (12 января 2023 г.). «Google полирует код Chromium слоем Rust» . Регистр . Проверено 17 июля 2024 г.
- ^ «Поддержка использования Rust в проекте Chromium» . Блог Google по онлайн-безопасности . Проверено 12 ноября 2023 г.
- ^ Шенкленд, Стивен (12 июля 2016 г.). «Firefox будет переработан, чтобы снова заинтересовать вас» . CNET . Проверено 14 июля 2022 г.
- ^ Группа исследования безопасности (04.10.2013). «ZeroMQ: помогает нам блокировать вредоносные домены в режиме реального времени» . Зонт Циско . Архивировано из оригинала 13 мая 2023 г. Проверено 13 мая 2023 г.
- ^ Чимпану, Каталин (15 октября 2019 г.). «AWS спонсирует проект Rust» . ЗДНЕТ . Проверено 17 июля 2024 г.
- ^ Николс, Шон (27 июня 2018 г.). «Следующий трюк Microsoft? Перенос данных из облака в Azure IoT Edge» . Регистр . Архивировано из оригинала 27 сентября 2019 г. Проверено 27 сентября 2019 г.
- ^ Тунг, Лиам. «Microsoft: почему мы использовали язык программирования Rust вместо Go для WebAssembly в приложении Kubernetes» . ЗДНет. Архивировано из оригинала 21 апреля 2022 г. Проверено 21 апреля 2022 г.
- ^ Клэберн, Томас (20 сентября 2022 г.). «Мы доверяем Rust: технический директор Microsoft Azure избегает C и C++» . Регистр . Проверено 7 июля 2024 г.
- ^ Симоне, Серджио Де. «NPM внедрила Rust для устранения узких мест в производительности» . ИнфоQ . Проверено 20 ноября 2023 г.
- ^ Лю, Шинг (2020), Лю, Шинг (ред.), «Добро пожаловать в мир Rust» , Практические проекты Rust: создание игр, физические вычисления и приложения машинного обучения , Беркли, Калифорния: Apress, стр. 1–8 , doi : 10.1007/978-1-4842-5599-5_1 , ISBN 978-1-4842-5599-5 , получено 29 ноября 2023 г.
- ^ Лю, Шинг (2021), Лю, Шинг (редактор), «Rust в мире Интернета» , «Практические веб-проекты Rust: создание облачных и веб-приложений» , Беркли, Калифорния: Apress, стр. 1–7, doi : 10.1007/978-1-4842-6589-5_1 , ISBN 978-1-4842-6589-5 , получено 29 ноября 2023 г.
- ^ Амадео, Рон (07 апреля 2021 г.). «Google сейчас пишет низкоуровневый код Android на Rust» . Арс Техника . Архивировано из оригинала 8 апреля 2021 г. Проверено 21 апреля 2022 г.
- ^ Дарккризт. «Google разрабатывает новый стек Bluetooth для Android, написанный на Rust» . Деде Линукс . Архивировано из оригинала 25 августа 2021 г. Проверено 31 августа 2024 г.
- ^ Андерсон, Тим (07 декабря 2021 г.). «Ржавое ядро Linux становится ближе с новым патчем» . Регистр . Проверено 14 июля 2022 г.
- ^ «Первый взгляд на Rust в ядре 6.1 [LWN.net]» . lwn.net . Проверено 11 ноября 2023 г.
- ^ Клэберн, Томас (27 апреля 2023 г.). «Microsoft переписывает основные библиотеки Windows на Rust» . Регистр . Проверено 13 мая 2023 г.
- ^ Доказано, Лиам. «Маленькая, но мощная «Humanbiologics» компании 9Front создана для по-настоящему любопытных» . Регистр . Проверено 7 марта 2024 г.
- ^ Егулалп, Сердар. «Ос Redox от Rust может показать Linux несколько новых трюков» . Инфомир . Архивировано из оригинала 21 марта 2016 г. Проверено 21 марта 2016 г.
- ^ Андерсон, Тим (14 января 2021 г.). «Еще одна ОС в стиле Rust: Тесей присоединяется к Redox в поисках более безопасных и отказоустойчивых систем» . Регистр . Проверено 14 июля 2022 г.
- ^ Боос, Кевин; Лиянаге, Намита; Иджаз, Рамла; Чжун, Линь (2020). Тезей: эксперимент в структуре операционной системы и управлении состоянием . стр. 1–19. ISBN 978-1-939133-19-9 .
- ^ Чжан, ХаньДун (Алекс) (31 января 2023 г.). «Обзор 2022 года | Внедрение Rust в бизнес» . Журнал Ржавчина . Проверено 7 февраля 2023 г.
- ^ Сей, Марк (10 октября 2018 г.). «Новые возможности Fedora 29: Start теперь официально в Fedora» . Марксей, Еженедельные таблетки сисадмина . Архивировано из оригинала 13 апреля 2019 г. Проверено 13 мая 2019 г.
- ^ Провен, Лиам (12 июля 2022 г.). «Выпущен Oracle Linux 9 с некоторыми интересными дополнениями» . Регистр . Проверено 14 июля 2022 г.
- ^ Провен, Лиам (2 февраля 2023 г.). «System76 анонсирует функции, которые появятся в отечественном настольном компьютере COSMIC на базе Rust» . Регистр . Проверено 17 июля 2024 г.
- ^ Ху, Вивиан (12 июня 2020 г.). «Deno готов к производству» . ИнфоQ . Проверено 14 июля 2022 г.
- ^ Абрамс, Лоуренс (6 февраля 2021 г.). «Этот эмулятор Flash Player позволяет безопасно играть в старые игры» . Мигающий компьютер . Проверено 25 декабря 2021 г.
- ^ Хариф, Ольга (17 октября 2020 г.). «Убийца блокчейна Ethereum носит скромное имя Polkadot» . Блумберг ЛП . Проверено 14 июля 2021 г.
- ^ Перейти обратно: а б с «Опрос разработчиков Stack Overflow, 2023 г.» . Переполнение стека . Проверено 25 июня 2023 г.
- ^ Клэберн, Томас (23 июня 2022 г.). «Линус Торвальдс говорит, что Rust появится в ядре Linux» . Регистр . Проверено 15 июля 2022 г.
- ^ Юнг, Ральф; Журдан, Жак-Анри; Кребберс, Робберт; Дрейер, Дерек (27 декабря 2017 г.). «RustBelt: закрепление основ языка программирования Rust» . Труды ACM по языкам программирования . 2 (ПОПЛ): 1–34. дои : 10.1145/3158154 . hdl : 21.11116/0000-0003-34C6-3 . ISSN 2475-1421 .
- ^ Попеску, Натали; Сюй, Цзыян; Апостолакис, Сотирис; Август, Дэвид И.; Леви, Амит (20 октября 2021 г.). «Безопаснее на любой скорости: автоматическое контекстно-зависимое повышение безопасности для Rust» . Труды ACM по языкам программирования . 5 (OOPSLA): 1–23. дои : 10.1145/3485480 . ISSN 2475-1421 .
- ^ Клабник и Николс 2019 , с. 4.
- ^ "Начиная" . www.rust-lang.org . Архивировано из оригинала 01.11.2020 . Проверено 11 октября 2020 г.
- ^ Тунг, Лиам (08 февраля 2021 г.). «Язык программирования Rust сделал огромный шаг вперед» . ЗДНет . Проверено 14 июля 2022 г.
- ^ Крилл, Пол. «Язык Rust переходит на самостоятельную основу» . Инфомир . Архивировано из оригинала 10 апреля 2021 г. Проверено 10 апреля 2021 г.
- ^ Воган-Николс, Стивен Дж. (9 апреля 2021 г.). «Шейн Миллер из AWS возглавит недавно созданный Rust Foundation» . ЗДНет . Архивировано из оригинала 10 апреля 2021 г. Проверено 10 апреля 2021 г.
- ^ Воан-Николс, Стивен Дж. (17 ноября 2021 г.). «Rust Foundation назначает Ребекку Рамбул исполнительным директором» . ЗДНет . Архивировано из оригинала 18 ноября 2021 г. Проверено 18 ноября 2021 г.
- ^ «Управление» . Язык программирования Rust . Архивировано из оригинала 10 мая 2022 г. Проверено 18 июля 2024 г.
- ^ «Представляем Совет лидеров Rust» . Ржавый блог . Проверено 12 января 2024 г.
Дальнейшее чтение
[ редактировать ]- Блэнди, Джим; Орендорф, Джейсон; Тиндалл, Леонора Ф.С. (06 июля 2021 г.). Программирование на Rust: быстрая и безопасная разработка систем . О'Рейли Медиа. ISBN 978-1-4920-5259-3 .
Внешние ссылки
[ редактировать ]- Руст (язык программирования)
- Параллельные языки программирования
- Бесплатные компиляторы и интерпретаторы
- Бесплатные программные проекты
- Функциональные языки
- Языки программирования высокого уровня
- Мозилла
- Мультипарадигмальные языки программирования
- Языки программирования сопоставления шаблонов
- Процедурные языки программирования
- Языки программирования, созданные в 2015 году.
- Программное обеспечение, использующее лицензию Apache
- Программное обеспечение, использующее лицензию MIT
- Статически типизированные языки программирования
- Языки системного программирования