詳しいところはドキュメントを読みましょう事案なのですが、今作っているプログラムで次のような文言がはじめて出てきて、どういうことか整理しておきたいのでメモ程度に残しておきます。
出てきたアトリビュートは下記です:
#![no_std]
以下、あいまいな理解の元、ドキュメントを読んだメモ程度に記事を書くので、間違っている点などはご指摘ください。ちなみに利用環境は Rust の nightly であることを前提としています。no_std
は stable ビルドでも動きます。
no_std
は Rust の標準ライブラリを OFF にしてくれる?
Rustの標準ライブラリは多くの便利な機能を提供している一方で、 スレッド、ネットワーク、ヒープアロケーション、その他の多くの機能をホストシステムが提供していることを前提としています。 一方で、それらの機能を提供していないシステムも存在します。しかし、Rustはそれらの上でも利用することができます! それは、Rustに標準ライブラリを利用しないということを #![no_std] アトリビュートを利用して伝えることで可能となります。
ということです。クレートのトップに no_std
をつけることによって、Rust 標準のライブラリを完全に OFF にしてくれるようです。具体的には、下記はコンパイルエラーになります。
#![no_std] fn main() { println!("Hello, World!") }
結果は、次のように println
マクロが見つからないと怒られて終了します。標準ライブラリをすべて落としているので、当然の挙動ではあります。
error: cannot find macro `println!` in this scope --> src/main.rs:3:5 | 3 | println!("Hello, World!") | ^^^^^^^ error: aborting due to previous error
どういった文脈で使用したか?
具体的には OS を作成する際に、スクリーン上に文字列を表示するまでの段階で使用することになりました。通常 OS を作成する際には VGA (の、Text Buffer) を用いてスクリーン上に文字列を表示するようです。そこに stdout などを使ってしまう Rust の println マクロなどの標準ライブラリは必要がないので読み込まないようにしておくといったところでしょうか。
あとは、組み込みOSなどの文脈で使用することも考えられます。
次回は lang_items
ならびに no_mangle
などのアトリビュートの話を書く予定です。このあたり、結構日本語文献も少ないですし、自分の知見のためにもしっかり書いておきたいですね。