メインコンテンツまでスキップ
バージョン: 0.2.0 snapshot

導入する

Rust 1.88以降を使ってください。生成されたJavaScriptの実行と、TypeScriptの比較テストにはNode 22.18以降が必要です。RustのコンパイルにはNodeもTypeScriptも不要です。Nodeの開発用依存は、参照実装やテストを開発するときだけインストールしてください。

cargo build --locked --release
./target/release/dicks check examples/add.dicks
./target/release/dicks disasm examples/add.dicks
mkdir -p dist
./target/release/dicks build examples/add.dicks --out dist/add.mjs
node --input-type=module -e 'import("./dist/add.mjs").then(async m => console.log((await m.execute()).output))'

結果は [ '5' ] です。ソースは次のとおりです。

8=D~~
8=D~~~
8==D
8===D

fmt は1行に1命令を標準出力へ書き出します。入力を上書きせず、型ではなくトークンを検証します。build は入力自身を含め、既存の出力先を一切上書きしません。不要になったご自身の生成物だけを削除するか、新しい出力ファイル名を指定してください。check --json は検証成功時にシグネチャ、失敗時に診断を機械可読形式で標準出力へ書き出し、終了コードはそれぞれ0と1です。ファイルやCLIのエラーは標準エラー出力に書き出し、終了コード1で終了します。

シードのコマンドは check、lex、build、fmt、disasm です。JavaScriptエンジンは内蔵していません。静的な生成物はWorkers、NodeなどのES2022対応ホストで実行します。独立した参照評価器を使う場合は次を実行してください。

npm ci
npm run reference -- run examples/add.dicks
npm run check

セルフホストでビルドする​

最初のブートストラップ後は、RustやTypeScriptのコンパイラ処理を呼び出さずにアプリケーションをビルドできます。

npm run selfhost:bootstrap -- --out target/my-bootstrap
npm run selfhost:build -- examples/add.dicks --compiler target/my-bootstrap/stage3.mjs --out dist/selfhost-add.mjs

ブートストラップ用ディレクトリと出力ファイルには新しいパスを使ってください。アプリケーションのホストをインポートする場合は --hosts ABI.json を追加します。段階ごとの照合、リソース上限、復旧手順はセルフホストを参照してください。開発中の check、lex、fmt、disasm にも、保存したRustバイナリを使えます。

生成したコードを呼び出す​

import { execute, signature } from './add.mjs';
const result = await execute({
args: [],
allowedEffects: ['output'],
limits: { fuel: 1000 },
});
console.log(signature, result.output);

execute は常にPromiseを返します。内部で生成される純粋関数は同期処理です。結果は {stack, output, fuelUsed, hostCalls} で、stack 内のInt値はJSONの数値ではなく bigint です。出力はバッファに蓄積したテキストで、グローバルなコンソールへは書き込みません。HTTPクライアントへの出力方法は呼び出し側で決めます。実行に失敗した場合、途中までのバッファ出力は返しません。ただし、それ以前のホストの副作用は既に発生している可能性があります。

最小構成のWorkerは生成物を静的にインポートできます。

import { execute } from './dist/add.mjs';
export default {
async fetch() {
const result = await execute();
return Response.json({ output: result.output });
},
};

バンドルやデプロイの前に生成物をビルドしてください。この例はCloudflareのリソースを作成せず、Miniflare経由のローカルworkerdで検証しています。本番公開にはアプリケーション設定、アカウント、secret、課金、D1マイグレーション、ドメインを別途用意する必要があります。言語サイトは site/、レジストリは独立した dicks-lang/registry リポジトリで管理しています。

ホストを宣言する​

--hosts ABI.json にはUTF-8のJSON配列で宣言を渡します。

[{"id":1,"name":"random.int","inputs":["Int"],"outputs":["Int"],"effects":["random"],"async":false}]

マニフェストに含めるのはメタデータで、JavaScriptコードや秘密情報は含めません。宣言に一致するJavaScript実装を execute({hosts:[...]}) へ渡し、各エフェクトを allowedEffects で明示的に許可します。名前、ID、入出力の型、エフェクト配列、同期・非同期の動作はABIで照合します。CLIがホストコードを自動解決・インストールすることはありません。失敗時の動作と信頼境界はアーキテクチャを参照してください。