Официальный логотип Rust | |
Парадигмы | Мультипарадигма : параллельная, функциональная, общая, императивная, структурированная |
---|---|
Разработано | Грейдон Хоар |
Разработчик | Фонд Ржавчины |
Впервые появился | 7 июля 2010 г. ; 11 лет назад ( 07.07.2010) |
Стабильный выпуск | 1.57.0 / 2 декабря 2021 г. ; 29 дней назад ( 2 декабря 2021 г.) |
Печатная дисциплина | Аффинный, предполагаемый, номинальный, статический, сильный |
Язык реализации | Ржавчина |
Платформа | AMD64, i686, arm, AArch64, armv7, mips, mips64, mipsel, mips64el, powerpc, powerpc64, powerpc64le, risc-v, s390x, WebAssembly |
Операционные системы | Windows, Linux, macOS, FreeBSD, NetBSD, Illumos, Haiku, Android, Redox, iOS, Fuchsia |
Лицензия | MIT или Apache 2.0 |
Расширения имени файла | .rs,.rlib |
Веб-сайт | www.rust-lang.org |
Под влиянием | |
Под влиянием | |
Ржавчина является несколько парадигм, универсальный язык программирования предназначен для выполнения и безопасности, особенно безопасного параллелизм. Rust синтаксически похож на C ++, но может гарантировать безопасность памяти, используя средство проверки заимствований для проверки ссылок. Rust обеспечивает безопасность памяти без сборки мусора, а подсчет ссылок не является обязательным. Rust был назван языком системного программирования, и в дополнение к высокоуровневым функциям, таким как функциональное программирование, он также предлагает механизмы для низкоуровневого управления памятью.
Первоначально Rust был разработан Грейдоном Хоаром из Mozilla Research при участии Дэйва Хермана, Брендана Эйха и других. Разработчики усовершенствовали язык при написании экспериментального движка браузера Servo и компилятора Rust. Он получил все большее распространение в промышленности, и Microsoft экспериментирует с языком для безопасных и критически важных для безопасности программных компонентов.
Rust был признан «самым любимым языком программирования» в опросе разработчиков Stack Overflow ежегодно с 2016 года, хотя в 2021 году его использовали только 7% респондентов.
Язык вырос из личного проекта, начатого в 2006 году сотрудником Mozilla Грейдоном Хоаром. Хоар заявил, что проект, возможно, был назван в честь грибов ржавчины и что это название также является подстрокой слова «надежный». Mozilla начала спонсировать проект в 2009 году и объявила о нем в 2010 году. В том же году работа перешла от начального компилятора (написанного на OCaml ) к компилятору с собственным хостингом на основе LLVM, написанному на Rust. Названный rustc, он успешно скомпилировался в 2011 году.
Первый пронумерованный пре-альфа-выпуск компилятора Rust состоялся в январе 2012 года. Rust 1.0, первый стабильный выпуск, был выпущен 15 мая 2015 года. После 1.0 стабильные точечные выпуски выпускаются каждые шесть недель, а функции разрабатываются в ночное время. Rust с ежедневными выпусками, а затем тестирование с бета-выпусками, которые длятся шесть недель. Каждые 2–3 года выпускается новое издание Rust. Это сделано для того, чтобы обеспечить легкую точку отсчета для изменений из-за частого характера графика выпуска Rust's Train, а также предоставить окно для внесения критических изменений. Редакции в значительной степени совместимы.
Помимо обычной статической типизации, до версии 0.4 Rust также поддерживал состояния типов. Система typestate смоделировала утверждения до и после программных операторов с помощью специального check
оператора. Расхождения могут быть обнаружены во время компиляции, а не во время выполнения, как это может быть в случае утверждений в коде C или C ++. Концепция состояния типов не была уникальной для Rust, поскольку она была впервые представлена на языке NIL. Состояния типов были удалены, потому что на практике они мало использовались, хотя той же функциональности можно добиться, используя семантику перемещения Rust.
Стиль объектной системы значительно изменился в версиях 0.2, 0.3 и 0.4 Rust. Версия 0.2 впервые представила классы, а версия 0.3 добавила несколько функций, включая деструкторы и полиморфизм за счет использования интерфейсов. В Rust 0.4 черты были добавлены как средство обеспечения наследования ; интерфейсы были объединены с трейтами и удалены как отдельная функция. Классы также были удалены и заменены комбинацией реализаций и структурированных типов.
Начиная с Rust 0.9 и заканчивая Rust 0.11, в Rust было два встроенных типа указателей : ~
и @
, упрощая модель основной памяти. Он повторно реализовал эти типы указателей в стандартной библиотеке как Box
и (теперь они удалены) Gc
.
В январе 2014 года, перед первой стабильной версией Rust 1.0, главный редактор Dr. Dobb's Эндрю Бинсток прокомментировал шансы Rust стать конкурентом C ++ и других перспективных языков D, Go., и Ним (затем Нимрод). По словам Бинстока, хотя Rust «широко рассматривался как удивительно элегантный язык», его внедрение замедлилось, поскольку он постоянно менялся между версиями.
Rust имеет интерфейс внешних функций (FFI), который может быть вызван, например, из языка C, и может вызывать C. Хотя вызов C ++ исторически был сложной задачей (с любого языка), в Rust есть библиотека CXX, позволяющая вызывать или из C ++, и «CXX имеет нулевые или незначительные накладные расходы».
В августе 2020 года Mozilla уволила 250 из 1000 своих сотрудников по всему миру в рамках корпоративной реструктуризации, вызванной долгосрочным воздействием пандемии COVID-19. Среди уволенных была большая часть команды Rust, а команда Servo была полностью расформирована. Событие вызвало опасения по поводу будущего Rust.
На следующей неделе команда ядра Rust признала серьезные последствия увольнений и объявила, что планы по созданию фонда Rust находятся в стадии реализации. Первой целью фонда было бы стать владельцем всех товарных знаков и доменных имен, а также взять на себя финансовую ответственность за их расходы.
8 февраля 2021 года пять компаний-учредителей ( AWS, Huawei, Google, Microsoft и Mozilla) официально объявили о создании Rust Foundation.
6 апреля 2021 года Google объявил о поддержке Rust в рамках Android Open Source Project в качестве альтернативы C / C ++.
Вот и "Привет, мир!" программа написана на Rust. println!
Макрос выводит сообщение на стандартный вывод.
fn main() { println!("Hello, World!"); }
Синтаксис ржавчины похож на C и C ++, с блоками кода, ограниченным фигурными скобками, и управление потоком ключевыми слов, таким как if
, else
, while
, и for
, хотя конкретный синтаксис для определения функций больше похож на Pascal. Несмотря на синтаксическое сходство с C и C ++, семантика Rust ближе к семантике языков семейства ML и языку Haskell. Почти каждая часть тела функции является выражением, даже операторы потока управления. Например, обычное if
выражение также заменяет тернарное условное выражение языка Си, идиому, используемую АЛГОЛОМ 60. Как и в Лиспе, функция не должна заканчиваться return
выражением: в этом случае, если точка с запятой опущена, последнее выражение в функции создает возвращаемое значение, как показано в следующей рекурсивной реализации факториальной функции:
fn factorial(i: u64) -gt; u64 { match i { 0 =gt; 1, n =gt; n * factorial(n-1) } }
Следующая итеративная реализация использует ..=
оператор для создания включающего диапазона:
fn factorial(i: u64) -gt; u64 { (2..=i).product() }
Более продвинутые функции в Rust включают использование общих функций для достижения полиморфизма типов. Ниже приведена программа на Rust для вычисления суммы двух вещей, для которых реализовано сложение с использованием универсальной функции:
use std::ops::Add; fn Sumlt;T: Addlt;Output = Tgt; + Copygt; (num1: T, num2: T) -gt; T { num1 + num2 } fn main() { let result1 = Sum(10,20); println!("Sum is: {:?}", result1); let result2 = Sum(10.23,20.45); println!("Sum is: {:?}", result2); }
Rust задуман как язык для систем с высокой степенью параллелизма и высокой безопасности, а также для программирования в целом, то есть создания и поддержания границ, сохраняющих целостность большой системы. Это привело к набору функций с упором на безопасность, контроль разметки памяти и параллелизм.
Rust безопасен для памяти. Он не допускает нулевые указатели, висячие указатели или гонку данных. Значения данных могут быть инициализированы только с помощью фиксированного набора форм, каждая из которых требует, чтобы их входные данные были уже инициализированы. Чтобы реплицировать указатели, которые являются действительными или NULL
, например, в структурах данных связанного списка или двоичного дерева, основная библиотека Rust предоставляет тип параметра, который можно использовать для проверки того, имеет ли указатель значение или. В Rust добавлен синтаксис для управления временем жизни, которое проверяется во время компиляции программой проверки заимствований. Небезопасный код может снять некоторые из этих ограничений с помощью ключевого слова. Some
None
unsafe
Rust не использует автоматическую сборку мусора. Память и другие ресурсы управляются посредством соглашения об инициализации получения ресурсов с дополнительным подсчетом ссылок. Rust обеспечивает детерминированное управление ресурсами с очень низкими накладными расходами. Rust поддерживает распределение значений в стеке и не выполняет неявную упаковку.
Существует концепция ссылок (с использованием amp;
символа), которая не включает подсчет ссылок во время выполнения. Безопасность таких указателей проверяется во время компиляции, предотвращая появление зависших указателей и других форм неопределенного поведения. Система типов Rust отделяет общие неизменяемые указатели формы amp;T
от уникальных изменяемых указателей формы amp;mut T
. Изменяемый указатель может быть приведен к неизменному указателю, но не наоборот.
В Rust есть система владения, в которой все значения имеют уникального владельца, а объем значения такой же, как и у владельца. Значения могут передаваться по неизменяемой ссылке, с использованием amp;T
, по изменяемой ссылке, с использованием amp;mut T
или по значению с использованием T
. Всегда может быть несколько неизменяемых ссылок или одна изменяемая ссылка (неявная блокировка чтения-записи ). Компилятор Rust применяет эти правила во время компиляции, а также проверяет правильность всех ссылок.
Система типов Rust поддерживает механизм, называемый чертами, вдохновленный классами типов в языке Haskell. Признаки аннотируют типы и используются для определения общего поведения между разными типами: например, числа с плавающей запятой и целые числа могут реализовывать признак «Добавить», потому что они оба могут быть добавлены; и любой тип, который можно распечатать как строку, реализует черты «Display» или «Debug». Эта возможность известна как специальный полиморфизм.
Rust использует вывод типа для переменных, объявленных с помощью ключевого слова let
. Такие переменные не требуют первоначального присвоения значения для определения их типа. Ошибка времени компиляции возникает, если какая-либо ветвь кода оставляет переменную без присваивания. Переменные, назначенные несколько раз, должны быть помечены ключевым словом mut
(сокращенно от изменяемого).
Функция может иметь общие параметры, что позволяет применять одну и ту же функцию к разным типам. Универсальные функции могут ограничивать универсальный тип для реализации определенного признака или признаков; например, функция «добавить один» может потребовать, чтобы тип реализовал «Добавить». Это означает, что типовая функция может быть проверена, как только она будет определена.
Реализация дженериков Rust аналогична типичной реализации шаблонов C ++: для каждого экземпляра создается отдельная копия кода. Это называется мономорфизацией и контрастирует со схемой стирания типов, обычно используемой в Java и Haskell. Стирание типов в Rust также доступно с помощью ключевого слова dyn
. Преимущество мономорфизации - это оптимизация кода для каждого конкретного случая использования; недостатком является увеличенное время компиляции и размер результирующих двоичных файлов.
В Rust пользовательские типы создаются с помощью struct
ключевого слова. Эти типы обычно содержат поля данных, такие как объекты или классы на других языках. impl
Ключевое слово может определить методы для структуры (данные и функции определяются отдельно в структурах) или реализовать признак для структуры. Признак - это договор о том, что в структуре реализованы определенные требуемые методы. Черты используются для ограничения общих параметров и потому, что черты могут предоставить структуре больше методов, чем определено пользователем. Например, признак Iterator
требует, чтобы next
метод был определен для типа. Как только next
метод определен, трейт предоставляет общие функциональные вспомогательные методы над итератором, например map
или filter
.
Объектная система в Rust основана на реализациях, чертах и структурированных типах. Реализации выполняют роль, аналогичную роли классов в других языках, и определяются с помощью ключевого слова impl
. Признаки обеспечивают наследование и полиморфизм; они позволяют определять методы и смешивать их с реализациями. Структурированные типы используются для определения полей. Реализации и трейты не могут определять сами поля, и только трейты могут обеспечивать наследование. Среди других преимуществ, это предотвращает проблемы с бриллиантом из множественного наследования, как и в C ++. Другими словами, Rust поддерживает наследование интерфейсов, но заменяет наследование реализации композицией ; см. композицию над наследованием.
Rust содержит большое количество компонентов, которые расширяют набор функций Rust и упрощают разработку Rust. Установкой компонентов обычно управляет rustup, установщик инструментальной цепочки Rust, разработанный проектом Rust.
Cargo - это система сборки и менеджер пакетов Rust. Cargo обрабатывает загрузку зависимостей и построение зависимостей. Cargo также действует как оболочка для clippy и других компонентов Rust. Это требует, чтобы проекты следовали определенной структуре каталогов.
Зависимости для пакета Rust указаны в файле Cargo. toml вместе с требованиями к версии, сообщая Cargo, какие версии зависимости совместимы с пакетом. По умолчанию Cargo получает свои зависимости из пользовательского реестра crates.io, но репозитории Git и пакеты в локальной файловой системе также могут быть указаны как зависимости.
Rustfmt - это программа для форматирования кода для Rust. Он принимает исходный код Rust в качестве входных данных и изменяет пробелы и отступы для создания отформатированного кода в соответствии с руководством по стилю Rust или правилами, указанными в файле rustfmt.toml. Rustfmt можно запускать как отдельную программу или в проекте Rust через Cargo.
Clippy - это встроенный в Rust инструмент линтинга для улучшения корректности, производительности и читаемости кода Rust. Он был создан в 2014 году и назван в честь одноименной функции Microsoft Office. По состоянию на 2021 год в Clippy действует более 450 правил, которые можно просматривать в Интернете и фильтровать по категориям. Некоторые правила по умолчанию отключены.
RLS - это языковой сервер, который предоставляет интегрированным средам разработки и текстовым редакторам дополнительную информацию о проекте Rust. Он обеспечивает проверку линтинга через Clippy, форматирование через Rustfmt, автоматическое завершение кода через Racer и другие функции. Развитие Racer было замедлено в пользу анализатора ржавчины.
Можно расширить язык Rust с помощью процедурного макро-механизма.
Процедурные макросы используют функции Rust, которые выполняются во время компиляции, для изменения потока токенов компилятора. Это дополняет механизм декларативных макросов (также известный как пример макросов), который использует сопоставление с образцом для достижения аналогичных целей.
Процедурные макросы бывают трех видов:
custom!(...)
#[derive(CustomDerive)]
#[custom_attribute]
println!
Макро является примером функции, как макро и serde_derive
является широко используемым библиотека для генерации кода для чтения и записи данных в различных форматах, таких как JSON. Атрибут макросов обычно используются для языка привязок, таких как extendr
библиотеки на наличие ржавчины привязки к R.
Следующий код показывает использование Serialize
, Deserialize
и Debug
получить процедурные макросы для выполнения чтения и записи в формате JSON, а также возможность форматирования структуры для отладки.
use serde_json::{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(amp;point).unwrap(); println!("serialized = {}", serialized); let deserialized: Point = serde_json::from_str(amp;serialized).unwrap(); println!("deserialized = {:?}", deserialized); }
Rust стремится «быть таким же эффективным и переносимым, как идиоматический C ++, без ущерба для безопасности». Поскольку Rust использует LLVM, любые улучшения производительности LLVM также переносятся на Rust.
Rust был принят крупными компаниями, занимающимися разработкой программного обеспечения. Например, Dropbox теперь написан на Rust, а некоторые компоненты - на Amazon, Facebook, Discord и Mozilla Foundation. Rust был третьим по популярности языком программирования в ежегодном опросе Stack Overflow 2015 года и занял первое место в 2016–2021 годах.
Формирование | 8 февраля 2021 г. ; 10 месяцев назад ( 2021-02-08) |
---|---|
Учредители | |
Тип | Некоммерческая организация |
Место расположения | |
Председатель | Шейн Миллер |
Исполнительный директор | Ребекка Румбул |
Веб-сайт | фонд.rust-lang.org |
Rust Фонд является некоммерческой организацией, членство включено в Делавэр, США, с основными целями поддержки сохранения и развитий языка, культивировать член команды Rust проекта и сообщество пользователей, управление технической инфраструктуры, лежащую в основе развития Rust, а также управление торговой маркой Rust.
Он был основан 8 февраля 2021 года пятью членами-учредителями (Amazon Web Services, Huawei, Google, Microsoft и Mozilla). Правление фонда возглавляет Шейн Миллер. С конца 2021 года его исполнительным директором и генеральным директором станет Ребекка Румбул. До этого временным исполнительным директором была Эшли Уильямс.
Конференции по Rust включают: