Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第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を依存として加え、字句解析、構文解析、コンパイル、構築、呼び出しの順を実行します。

次の章ではその順を分解します。