Может ли код Rust компилироваться без стандартной библиотеки? - PullRequest
6 голосов
/ 04 апреля 2020

В данный момент я изучаю Rust. В основном я использую книгу по языку программирования Rust и эту замечательную справку , которая связывает свойства / синтаксис Rust с эквивалентами C ++.

Мне трудно понять, где останавливается основной язык и запускается стандартная библиотека. Я встречал много операторов и / или черт, которые, кажется, имеют особые отношения с компилятором. Например, Rust имеет trait (который, как я понимаю, похож на интерфейс), называемый Deref, который позволяет разыменовать тип, реализующий его, используя оператор *:

fn main() {
    let x = 5;
    let y = Box::new(x);

    assert_eq!(5, x);
    assert_eq!(5, *y);
}

Другим примером является оператор ?, который, кажется, зависит от типов Result и Option.

Может ли код, использующий эти операторы, быть скомпилирован без стандартной библиотеки? А если нет, то какие части языка Rust зависят от стандартной библиотеки? Можно ли вообще скомпилировать любой код Rust без него?

Ответы [ 2 ]

10 голосов
/ 05 апреля 2020

Стандартная библиотека Rust фактически разделена на три отдельных ящика:

  • core, который является связующим звеном между языком и стандартной библиотекой. Все типы, черты и функции требуемые языком находятся в этом ящике. Это включает в себя признаки оператора (находятся в core::ops), Future (используется async fn) и встроенные функции компилятора . Ящик core не имеет каких-либо зависимостей, поэтому вы всегда можете его использовать.
  • alloc, который содержит типы и признаки, относящиеся к динамическим динамикам или требующие их. c выделение памяти. Это включает в себя динамически распределяемые типы, такие как Box<T>, Vec<T> и String.
  • std, которые содержат всю стандартную библиотеку, включая элементы из core и alloc, но также и с дополнительными требованиями, такими как доступ к файловой системе, работа в сети и т. Д. c.

Если ваша среда не обеспечивает функциональность, требуемую для ящика std, вы можете выбрать компилировать без него. Если ваша среда также не обеспечивает динамическое выделение памяти c, вы можете выбрать компиляцию без alloc ящика. Эта опция полезна для таких целей, как встроенные системы или операционные системы для записи, где обычно не хватает всего того, что обычно требуется стандартной библиотеке.

Вы можете использовать #![no_std]* Атрибут 1045 * в root вашего ящика указывает компилятору компилироваться без стандартной библиотеки (только core). Многие библиотеки также обычно поддерживают компиляцию «no- std» (например, base64 и futures), где функциональность может быть ограничена, но она будет работать при компиляции без std ящик.

3 голосов
/ 05 апреля 2020

Когда вы не используете std, вы полагаетесь на core, который является подмножеством библиотеки std, которая всегда (?) Доступна. Это то, что называется no_std средой, которая обычно используется для некоторых типов "встроенного" программирования. Вы можете найти больше информации о no_std в книге Rust Embedded, включая некоторые инструкции по как начать с программирования no_std.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...