実行領域
Lambda C スクリプトは明確に区切られた境界の内側で動作します。FFI(ホストが登録した関数群)と サンドボックスモード(ポインタアクセス制限)という2つのスイッチが、その境界の大きさと形を決定します。このページでは、その境界を明示します。
2 つの軸
| sandbox OFF | sandbox ON | |
|---|---|---|
| FFI なし | 計算 + 任意メモリアクセス | 純粋計算 |
| FFI あり | フル統合 + ベアメタル抜け穴 | 統合済(推奨) |
各象限はそれぞれ異なる性格を持ちます。
第1象限: 純粋計算
sandbox ON、FFI なし
最小の Lambda C。スクリプトはあらゆるインメモリ計算を実行できますが、外界には一切触れられません。
利用可能なもの:
- C 言語サブセット全機能:
int、double、struct、union、enum、typedef、関数ポインタ、すべての制御構文(if、while、for、switch、goto)。 - 数学組込関数:
sin、cos、tan、asin、acos、atan、atan2、sinh、cosh、tanh、exp、log、log10、pow、sqrt、ceil、floor、fabs、fmod。 - 文字列・メモリ:
strcmp、strncmp、strcpy、strcat、strncat、strlen、memcpy、memset、atoi、sprintf、sscanf。 - ヒープ(arena):
malloc、free、heap_mark、heap_release。 - 検索・整列:
qsort、rx_search、amatch、bf_search、bm_search。 - 出力:
printf等 ── ただし、ホストが stdout シンクを配線している場合のみ。ベアメタルでシンクが無ければ、これらは黙って no-op になります。
利用不可:
- あらゆるハードウェアアクセス(GPIO、ADC、PWM、SPI、I2C、センサ、アクチュエータ)。
- 実時刻取得(
clock、millis、timeは組込関数として存在するが、ホストの配線がないと壁時計の値を返さない)。 - ファイルシステム、ネットワーク、シリアル。
- VM 管理領域の外側へのポインタアクセス ── サンドボックスがブロック。
実態: スクリプトは sqrt(2) を計算してローカル変数に正解を入れることはできますが、その答えを外界に伝える手段がありません。アルゴリズムを単独で検証するには便利ですが、組み込み製品としては単独では成立しません。
第2象限: + 任意メモリアクセス
sandbox OFF、FFI なし
第1象限と同じ機能に加えて、スクリプトは任意のポインタ値を参照解決できます:
int *gpio = (int *)0x40020000;
*gpio = 1;
理論上は FFI バインディングなしで MMIO レジスタを直接叩けますが、実用性は乏しいです ── アドレスを正確に知らねばならず、型安全なマーシャリングも、状態検証も、ホストへのエラー報告もなく、ハードウェアマッピングが変わった瞬間に破綻します。この象限は存在しますが、本番コードはここに住んでいません。
第3象限: 統合済 ── 本番運用の推奨構成
sandbox ON、FFI あり
スクリプトはホスト登録済み FFI 関数を呼び出せ(型付き・検証付き・整数ID経由で約100nsのディスパッチ)、かつ raw ポインタによる VM 管理領域外へのアクセスは禁じられます。
実プロダクトが住むのはこのレイヤーです。ホストが FFI として公開したものはすべて到達可能 ── GPIO、センサ、アクチュエータ、実時刻、通信バス、RTOS プリミティブ、ドメイン固有呼び出し。スクリプト側のバグは VM データを破壊し得ても、OS メモリ・MMIO・他タスクには到達しません。ホストの FFI 実装は依然として安全境界として機能し、各呼び出しを物理状態に対して検証します。
ほとんどの組み込み製品でリリース時に採用すべき構成です。
第4象限: フル権限
sandbox OFF、FFI あり
最大の表現力。スクリプトは FFI と raw ポインタアクセスの両方を持ちます。以下のような場面で有用です:
- バイトコードが完全に信頼できる場合(自社の本番ビルド)。
- 性能要件の厳しい内側ループが FFI で露出していないメモリに触る必要がある場合。
- 開発ツール・シミュレータ・デバッグビルドなど、ベアメタル抜け穴が必要なケース。
トレードオフは、スクリプト側のバグが任意のメモリを破壊し得ること。ソースまで自社管理下にある信頼バイトコード専用です。
なぜこれが重要か
4象限を上から下まで読むと、パターンは明白です:
Lambda C 単体はサンドボックス化された計算機にすぎません。プロダクトとして生きるのは、ターゲットハードウェア向けのホスト側 FFI 層が組み上がった後です。
その FFI 層 ── GPIO バインディング、センサドライバ、タイマフック、安全インタロック ── こそが、共同開発・カスタマイズ案件の本体です。Lambda C はバイトコード VM、コンパイラ、そして契約上のフレームを提供します。残る作業は統合であり、それは設計上プロジェクトごとに固有です。
もしあなたの製品が第1象限(純粋計算)の中だけで完結するなら、Lambda C 単体で十分かもしれません ── ただしその場合は Lua、mruby、お好みの組み込みインタープリタでも同等に機能します。Lambda C を選ぶ理由は 第3象限 にあり、第3象限に独力で到達するのが難しい理由は、私たちがパートナーとして存在する理由と同じものです。
詳しくは ライセンスとお問い合わせ をご覧ください。