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

ライブラリと言語の拡張

dicks コマンドは、複数ファイルの静的リンクと、ローカル・同梱・レジストリの完全一致バージョンのパッケージを扱います。モジュール、標準ライブラリ、レジストリを参照してください。バージョン範囲とジェネリック型システムは未実装です。以下に記す残りの方針は今後の課題です。コンパイラ自身のセルフホストは実現しており、検証方法を後半で説明します。

ライブラリをモジュールとして扱う​

ライブラリはテキストマクロとして展開せず、モジュールとしてコンパイルするべきものです。実行可能なソースファイルは、引き続き記号だけの .dicks に限定します。人間が読めるパッケージ名、名前付きエクスポート、ドキュメント、依存メタデータ、コンパイラ診断は、実行されないマニフェストやツール側で扱います。マニフェストの公開名をソースの関数IDへ対応させ、リンク時にモジュール内のIDを再配置します。これにより、ソースの記号制限を保ちながら、ライブラリを探しやすくし、安定したAPIを提供できます。

実装済みのパッケージ構成は、このモデルに従います。

package metadata + exact dependency lock
sources/*.dicks
exports: public name -> local function ID + typed signature + effect declaration
compatibility: language version + target runtime ABI version
integrity: canonical source and interface hashes

現在のマニフェストのスキーマはmodules.mdに記載しています。リンカーは、重複したエクスポート、未解決のID、互換性のないシグネチャ、ABIの不一致、選択した言語バージョンが対応しない呼び出しの循環、エフェクトの権限昇格を拒否します。基本の検査器は、リンクしたモジュール全体へ間接的なエフェクトを伝播します。将来バイナリーインターフェースを導入する場合も、同じ検査が必要です。

依存解決は、不変の内容ダイジェストと決定的な順序を持つ、完全一致のlockを生成します。キャッシュは使用前に検証し、オフラインでも使えます。公開レジストリはCloudflare Workers・D1・R2で動作し、公開トークンの名前空間を制限して、バージョンを不変にします。インストールスクリプトや、参照先が動くバージョン範囲には対応しません。

DaaSは、整形・検証・レスポンスのライブラリを静的にリンクしたDicksモジュールとして使います。HTTPのルーティング、認可、DBのアプリケーション処理もDicksです。安全な乱数、D1のステートメント、通信は、明示的に許可するプラットフォームのプリミティブです。独立したDaaSリポジトリで、結合テストとデプロイの境界を管理します。

型システムの拡張予定​

バージョン0.2では、不変の名目的なリスト・レコード、Result、網羅的なパターン分岐を実装しています。今後はパラメーター多相、バイト列、名前付きフィールド、任意の代数的バリアントを検討します。通常の操作の失敗は型付きResult値で表し、実行上限の枯渇、不変条件の違反、不正なホスト境界はトラップとして残す方針です。

不変の値と明示的なエフェクトを基本とする方針です。変更可能な参照、所有権、並行処理、再帰、FFIを加える場合は、実装の前に別名参照・寿命・失敗時のモデルを文書化する必要があります。コンパイラをRustで書いたことだけを理由に、Rustのメモリーの意味を約束してはいけません。並行処理を実装して仕様を定める前に、データ競合がないと宣伝することもできません。

コンパイラの変更には、仕様の例、拒否すべき型のテスト、Rustと参照実装の一致、対象ランタイムでの実行テスト、移行手順が必要です。型やオペコードの追加は、言語バージョンの互換性に関わります。既存の飛距離や長さを、黙って別の意味に読み替えてはいけません。

構文の拡張に先立つツールの整備​

この言語のソースは、意図的に読みにくくしています。それを補うために、整形器、逆アセンブラー、型付きスタックの調査、ファイルをまたぐ定義ジャンプと診断のLSP、意味に沿ったステップ実行デバッガーを用意します。VS Code拡張とプロトコルのコマンドは開発ツールを参照してください。プラットフォームの入出力や生成JavaScriptのデバッグは、今後の課題です。

バイナリーや中間生成物では、コンパクトな整数やセクションテーブルを使えます。これらは出力であり、任意のJavaScriptを言語ソースに隠すための別経路ではありません。生成側への信頼とは独立して、生成物を検証する必要があります。Wasmバックエンドは将来の候補で、既存の機能ではありません。

セルフホスト​

記号だけの完全なコンパイラは、自身の構文解析・検査・コード生成まで行えるようになりました。Rustはブートストラップのシードと独立した比較実装として残ります。stage 1(Rustでビルド)、stage 2(自己ビルド)、stage 3(自己再ビルド)の出力は、バイト単位で一致させます。生成した両段階で、同じ正常・異常・Workersの適合性テストを実行します。

コンパイラの状態は、名目的なレコードの中にある整数ページの永続リストです。Resultによるエントリープロトコルで受け渡します。ホストは入出力を運ぶだけで、変更可能な実行状態は保持しません。セルフホストコンパイラに不具合があっても、保存したRustシードから復旧できます。

再現性と相互検証は信頼性を高めますが、それだけでtrusting-trust攻撃を排除するものではありません。コンパイラをブートストラップしても、本番アプリケーションを再デプロイすることはありません。