第31章. 組み込みオリエンテーション
この章の目的
この章を読み終える頃には、この第9部が何を扱うのか、誰のためのものなのかが分かり、最小限のKeleusmaホストをコンパイルして走らせた状態になります。この章を読み終える頃には、この第9部が何を扱うのか、誰のためのものなのかが分かり、最小限のKeleusmaホストをコンパイルして走らせた状態になります。
誰のためのものか
第1部から第8部はKeleusmaの言語を学ぶ人のために書かれました。この部はそれとは別です。これは、Rustプログラムの中にKeleusmaを組み込みたいRust開発者のためのものです。Rustの実用的な知識を前提にしています — cargo、依存関係、トレイト、クロージャ、Result、です。前の部までの音楽というフレームはここでは脇に置きます。ここの文章は淡々とした技術的なものです。第1部から第8部はKeleusmaの言語を学ぶ人のために書かれました。この部はそれとは別です。これは、Rustプログラムの中にKeleusmaを組み込みたいRust開発者のためのものです。Rustの実用的な知識を前提にしています — cargo、依存関係、トレイト、クロージャ、Result、です。前の部までの音楽というフレームはここでは脇に置きます。ここの文章は淡々とした技術的なものです。
この部の作業例はピアノロールです。第8部ではピアノロールを楽曲の側から見ました。この部はその裏のホストを組み立てます。この部の作業例はピアノロールです。第8部ではピアノロールを楽曲の側から見ました。この部はその裏のホストを組み立てます。
ホストとスクリプト
Keleusmaのデプロイメントは2つの半分でできています。
- スクリプトは
.kelプログラムです。有界で、検証済みのロジックを担当します。スクリプトは.kelプログラムです。有界で、検証済みのロジックを担当します。 - ホストはRustプログラムです。スクリプトをコンパイルし、検証し、仮想マシンを構築し、その仮想マシンを動かし、スクリプトが呼ぶネイティブ関数を提供します。ホストはRustプログラムです。スクリプトをコンパイルし、検証し、仮想マシンを構築し、その仮想マシンを動かし、スクリプトが呼ぶネイティブ関数を提供します。
ホストがKeleusmaを組み込んでいる場所です。この部のすべてはホスト側のコードです。ホストがKeleusmaを組み込んでいる場所です。この部のすべてはホスト側のコードです。
最小限のホスト
ホストはkeleusmaを依存に持つ普通のRustバイナリプロジェクトです。Cargo.tomlには1行必要です。ホストはkeleusmaを依存に持つ普通のRustバイナリプロジェクトです。Cargo.tomlには1行必要です。
[dependencies]
keleusma = "0.2"
下のsrc/main.rsが完全なホストです。1行のスクリプトをコンパイルし、VMを構築し、走らせて、結果を表示します。下のsrc/main.rsが完全なホストです。1行のスクリプトをコンパイルし、VMを構築し、走らせて、結果を表示します。
use keleusma::compiler::compile;
use keleusma::lexer::tokenize;
use keleusma::parser::parse;
use keleusma::vm::{DEFAULT_ARENA_CAPACITY, Vm, VmState};
use keleusma::{Arena, Value};
const SCRIPT: &str = "fn main() -> Word { 60 + 7 }";
fn main() {
let tokens = tokenize(SCRIPT).expect("lex");
let program = parse(&tokens).expect("parse");
let module = compile(&program).expect("compile");
let arena = Arena::with_capacity(DEFAULT_ARENA_CAPACITY);
let mut vm = Vm::new(module, &arena).expect("verify");
match vm.call(&[]).expect("call") {
VmState::Finished(Value::Int(n)) => println!("result: {}", n),
other => panic!("unexpected: {:?}", other),
}
}
cargo runで実行します。出力は次のとおりです。
result: 67
この部のあとの各章はこの骨組みの上に積み上がります。次の章で構築の段階を詳しく見ます。残りの章ではネイティブ関数、再開プロトコル、アリーナのサイズ、バイトコードの読み込み、ホットスワップ、コストモデルを足していき、最後にピアノロールホストの全体を見て終わります。この部のあとの各章はこの骨組みの上に積み上がります。次の章で構築の段階を詳しく見ます。残りの章ではネイティブ関数、再開プロトコル、アリーナのサイズ、バイトコードの読み込み、ホットスワップ、コストモデルを足していき、最後にピアノロールホストの全体を見て終わります。
この章のまとめ
- この部は、ホストプログラムにKeleusmaを組み込むRust開発者向けです。
- Keleusmaのデプロイメントはホストとスクリプトです。ホストがRustの側です。Keleusmaのデプロイメントはホストとスクリプトです。ホストがRustの側です。
- 最小限のホストは
keleusmaを依存として加え、字句解析、構文解析、コンパイル、構築、呼び出しの順を実行します。最小限のホストはkeleusmaを依存として加え、字句解析、構文解析、コンパイル、構築、呼び出しの順を実行します。
次の章ではその順を分解します。