问题
I'm currently in the progress of learning Rust. I'm mainly using The Rust Programming Language book and this nice reference which relates Rust features/syntax to C++ equivalents.
I'm having a hard time understanding where the core language stops and the standard library starts. I've encountered a lot of operators and/or traits which seems to have a special relationship with the compiler. For example, Rust has a trait
(which from what I understand is like an interface) called Deref
which let's a type implementing it be de-referenced using the *
operator:
fn main() {
let x = 5;
let y = Box::new(x);
assert_eq!(5, x);
assert_eq!(5, *y);
}
Another example is the ?
operator, which seems to depend on the Result
and Option
types.
Can code that uses those operators can be compiled without the standard library? And if not, what parts of the Rust language are depending on the standard library? Is it even possible to compile any Rust code without it?
回答1:
The Rust standard library is in fact separated into three distinct crates:
- core, which is the glue between the language and the standard library. All types, traits and functions required by the language are found in this crate. This includes operator traits (found in core::ops), the Future trait (used by
async fn
), and compiler intrinsics. Thecore
crate does not have any dependencies, so you can always use it. - alloc, which contains types and traits related to or requiring dynamic memory allocation. This includes dynamically allocated types such as
Box<T>
,Vec<T>
andString
. - std, which contains the whole standard library, including things from
core
andalloc
but also things with further requirements, such as file system access, networking, etc.
If your environment does not provide the functionality required by the std
crate, you can choose to compile without it. If your environment also does not provide dynamic memory allocation, you can choose to compile without the alloc
crate as well. This option is useful for targets such as embedded systems or writing operating systems, where you usually won't have all of the things that the standard library usually requires.
You can use the #![no_std] attribute in the root of your crate to tell the compiler to compile without the standard library (only core
). Many libraries also usually support "no-std
" compilation (e.g. base64 and futures), where functionality may be restricted but it will work when compiling without the std
crate.
回答2:
When you're not using std
, you rely on core, which is a subset of the std
library which is always (?) available. This is what's called a no_std
environment, which is commonly used for some types of "embedded" programming. You can find more about no_std in the Rust Embedded book, including some guidance on how to get started with no_std
programming.
来源:https://stackoverflow.com/questions/61034534/can-rust-code-compile-without-the-standard-library