Глоссарий
Абстрактное синтаксическое дерево (Abstract syntax tree)
‘Абстрактное синтаксическое дерево’ или ‘AST’ - это промежуточное представление структуры программы, когда компилятор компилирует ее.
Выравнивание (Alignment)
Выравнивание значения определяет, по каким адресам предпочтительно начинаются значения. Всегда является степенью двойки. Ссылки на значение должны быть выровнены. Подробнее.
Двоичный интерфейс приложения (Application binary interface, ABI)
Двоичный интерфейс приложения (ABI) определяет, как скомпилированный код взаимодействует с другим скомпилированным кодом. С помощью extern блоков и extern fn, строки ABI влияют на:
- Соглашение о вызовах (Calling convention): Как передаются аргументы функции, возвращаются значения (например, в регистрах или в стеке) и кто отвечает за очистку стека.
- Раскрутка стека (Unwinding): Разрешена ли раскрутка стека. Например, ABI
"C-unwind"разрешает раскрутку через границу FFI, в то время как ABI"C"- нет.
Арность (Arity)
Арность относится к количеству аргументов, которые принимает функция или оператор.
Например, f(2, 3) и g(4, 6) имеют арность 2, а h(8, 2, 6)
имеет арность 3. Оператор ! имеет арность 1.
Массив (Array)
Массив, иногда также называемый массивом фиксированного размера или встроенным массивом, - это значение, описывающее коллекцию элементов, каждый из которых выбирается по индексу, который может быть вычислен во время выполнения программы. Он занимает непрерывную область памяти.
Ассоциированный элемент (Associated item)
Ассоциированный элемент - это элемент, который ассоциирован с другим элементом. Ассоциированные элементы определяются в реализациях и объявляются в трейтах. Только функции, константы и псевдонимы типов могут быть ассоциированными. Противопоставляется свободному элементу.
Покрывающая реализация (Blanket implementation)
Любая реализация, где тип появляется непокрытым. impl<T> Foo for T, impl<T> Bar<T> for T, impl<T> Bar<Vec<T>> for T и impl<T> Bar<T> for Vec<T> считаются покрывающими реализациями. Однако impl<T> Bar<Vec<T>> for Vec<T> не является покрывающей реализацией, так как все экземпляры T, которые появляются в этой impl,
покрыты Vec.
Ограничение (Bound)
Ограничения - это ограничения на тип или трейт. Например, если ограничение наложено на аргумент, который принимает функция, типы, передаваемые в эту функцию, должны соблюдать это ограничение.
Комбинатор (Combinator)
Комбинаторы - это функции высшего порядка, которые применяют только функции и ранее определенные комбинаторы для предоставления результата из своих аргументов. Они могут быть использованы для управления потоком управления модульным образом.
Крейт (Crate)
Крейт - это единица компиляции и линковки. Существуют разные типы крейтов, такие как библиотеки или исполняемые файлы. Крейты могут ссылаться и линковаться с другими библиотечными крейтами, называемыми внешними крейтами. Крейт имеет самодостаточное дерево модулей, начиная с неназванного корневого модуля, называемого корнем крейта. Элементы могут быть сделаны видимыми для других крейтов, помечая их как публичные в корне крейта, включая через пути публичных модулей. Подробнее.
Диспетчеризация (Dispatch)
Диспетчеризация - это механизм определения того, какая конкретная версия кода фактически выполняется, когда это связано с полиморфизмом. Две основные формы диспетчеризации - статическая диспетчеризация и динамическая диспетчеризация. Rust поддерживает динамическую диспетчеризацию через использование трейт-объектов.
Тип с динамическим размером (Dynamically sized type)
Тип с динамическим размером (DST) - это тип без статически известного размера или выравнивания.
Сущность (Entity)
Сущность - это языковая конструкция, на которую можно ссылаться каким-либо образом в исходной программе, обычно через путь. Сущности включают типы, элементы, обобщенные параметры, переменные привязки, метки циклов, времена жизни, поля, атрибуты и линты.
Выражение (Expression)
Выражение - это комбинация значений, констант, переменных, операторов и функций, которая вычисляется в единственное значение, с побочными эффектами или без них.
Например, 2 + (3 * 4) - это выражение, которое возвращает значение 14.
Свободный элемент (Free item)
Элемент, который не является членом реализации, такой как свободная функция или свободная константа. Противопоставляется ассоциированному элементу.
Фундаментальные трейты (Fundamental traits)
Фундаментальный трейт - это трейт, добавление реализации которого для существующего типа является критическим изменением.
Трейты Fn и Sized являются фундаментальными.
Фундаментальные конструкторы типов (Fundamental type constructors)
Фундаментальный конструктор типа - это тип, для которого реализация покрывающей реализации над ним
является критическим изменением. &, &mut, Box и Pin являются фундаментальными.
Всякий раз, когда тип T считается локальным, &T, &mut T, Box<T> и Pin<T>
также считаются локальными. Фундаментальные конструкторы типов не могут покрывать другие типы.
Всякий раз, когда используется термин “покрытый тип”,
T в &T, &mut T, Box<T> и Pin<T> не считается покрытым.
Обитаемый тип (Inhabited)
Тип является обитаемым, если у него есть конструкторы и, следовательно, он может быть инстанциирован. Обитаемый тип не “пуст” в том смысле, что могут существовать значения этого типа. Противоположность Необитаемому.
Собственная реализация (Inherent implementation)
Реализация, которая применяется к номинальному типу, а не к паре трейт-тип. Подробнее.
Собственный метод (Inherent method)
Метод, определенный в собственной реализации, а не в реализации трейта.
Инициализированный (Initialized)
Переменная инициализирована, если ей было присвоено значение и с тех пор из нее не было перемещено. Все остальные места памяти считаются неинициализированными. Только небезопасный Rust может создать место памяти без его инициализации.
Локальный трейт (Local trait)
trait, который был определен в текущем крейте. Определение трейта является локальным
или нет независимо от примененных аргументов типа. Учитывая trait Foo<T, U>,
Foo всегда локальный, независимо от типов, подставленных для T и U.
Локальный тип (Local type)
struct, enum или union, которые были определены в текущем крейте.
На это не влияют примененные аргументы типа. struct Foo считается локальным, но
Vec<Foo> - нет. LocalType<ForeignType> является локальным. Псевдонимы типов не
влияют на локальность.
Модуль (Module)
Модуль - это контейнер для нуля или более элементов. Модули организованы в дерево, начиная с неназванного модуля в корне, называемого корнем крейта или корневым модулем. Пути могут быть использованы для ссылки на элементы из других модулей, что может быть ограничено правилами видимости. Подробнее
Имя (Name)
Имя - это идентификатор или метка времени жизни или цикла, которая ссылается на сущность. Привязка имени - это когда объявление сущности вводит идентификатор или метку, связанную с этой сущностью. Пути, идентификаторы и метки используются для ссылки на сущность.
Разрешение имен (Name resolution)
Разрешение имен - это процесс во время компиляции связывания путей, идентификаторов и меток с объявлениями сущностей.
Пространство имен (Namespace)
Пространство имен - это логическая группировка объявленных имен на основе вида сущности, на которую ссылается имя. Пространства имен позволяют появлению имени в одном пространстве имен не конфликтовать с тем же именем в другом пространстве имен.
Внутри пространства имен имена организованы в иерархию, где каждый уровень иерархии имеет свою собственную коллекцию именованных сущностей.
Номинальные типы (Nominal types)
Типы, на которые можно ссылаться путем напрямую. В частности перечисления, структуры, объединения и типы трейт-объектов.
Dyn-совместимые трейты (Dyn-compatible traits)
Трейты, которые могут быть использованы в типах трейт-объектов (dyn Trait).
Только трейты, которые следуют определенным правилам, являются dyn-совместимыми.
Ранее они были известны как объектно-безопасные трейты.
Путь (Path)
Путь - это последовательность из одного или более сегментов пути, используемая для ссылки на сущность в текущей области видимости или других уровнях иерархии пространств имен.
Прелюдия (Prelude)
Прелюдия, или The Rust Prelude, - это небольшая коллекция элементов - в основном трейтов - которые импортируются в каждый модуль каждого крейта. Трейты в прелюдии являются повсеместными.
Область видимости (Scope)
Область видимости - это область исходного текста, где именованная сущность может быть упомянута этим именем.
Проверяемое выражение (Scrutinee)
Проверяемое выражение - это выражение, которое сопоставляется в выражениях match и
похожих конструкциях сопоставления с образцом. Например, в match x { A => 1, B => 2 },
выражение x является проверяемым выражением.
Размер (Size)
Размер значения имеет два определения.
Первое - это то, сколько памяти должно быть выделено для хранения этого значения.
Второе - это смещение в байтах между последовательными элементами в массиве с этим типом элемента.
Это кратное выравниванию, включая ноль. Размер может меняться
в зависимости от версии компилятора (по мере внесения новых оптимизаций) и целевой
платформы (аналогично тому, как usize варьируется в зависимости от платформы).
Срез (Slice)
Срез - это представление с динамическим размером в непрерывную последовательность, записываемое как [T].
Его часто видят в его заимствованных формах, либо изменяемых, либо разделяемых. Тип разделяемого
среза - &[T], в то время как тип изменяемого среза - &mut [T], где T представляет
тип элемента.
Оператор (Statement)
Оператор - это наименьший самостоятельный элемент языка программирования, который командует компьютеру выполнить действие.
Строковый литерал (String literal)
Строковый литерал - это строка, хранящаяся непосредственно в конечном бинарном файле, и поэтому будет
действительна для продолжительности 'static.
Его тип - заимствованный строковый срез с продолжительностью 'static, &'static str.
Строковый срез (String slice)
Строковый срез - это самый примитивный строковый тип в Rust, записываемый как str. Его
часто видят в его заимствованных формах, либо изменяемых, либо разделяемых. Тип разделяемого
строкового среза - &str, в то время как тип изменяемого строкового среза - &mut str.
Строковые срезы всегда являются действительным UTF-8.
Трейт (Trait)
Трейт - это языковой элемент, который используется для описания функциональностей, которые тип должен предоставлять. Он позволяет типу давать определенные обещания о своем поведении.
Обобщенные функции и обобщенные структуры могут использовать трейты для ограничения типов, которые они принимают.
Турбо-рыба (Turbofish)
Пути с обобщенными параметрами в выражениях должны префиксировать открывающие скобки с ::.
В сочетании с угловыми скобками для обобщений это выглядит как рыба ::<>.
Как таковой, этот синтаксис в разговорной речи называется синтаксисом турбо-рыбы.
Примеры:
#![allow(unused)] fn main() { let ok_num = Ok::<_, ()>(5); let vec = [1, 2, 3].iter().map(|n| n * 2).collect::<Vec<_>>(); }
Этот префикс :: требуется для устранения неоднозначности обобщенных путей с множественными сравнениями в списке, разделенном запятыми.
См. бастион турбо-рыбы для примера, где отсутствие префикса было бы неоднозначным.
Непокрытый тип (Uncovered type)
Тип, который не появляется как аргумент другого типа. Например,
T непокрыт, но T в Vec<T> покрыт. Это актуально только для
аргументов типа.
Неопределенное поведение (Undefined behavior)
Поведение во время компиляции или выполнения, которое не специфицировано. Это может привести к, но не ограничивается: завершению или повреждению процесса; неправильным, некорректным или непреднамеренным вычислениям; или платформенно-специфичным результатам. Подробнее.
Необитаемый тип (Uninhabited)
Тип является необитаемым, если у него нет конструкторов и, следовательно, он никогда не может быть инстанциирован.
Необитаемый тип “пуст” в том смысле, что нет значений этого типа. Канонический
пример необитаемого типа - тип never !, или перечисление без вариантов
enum Never { }. Противоположность Обитаемому.