設計上の選択と検証
競合する性質を、すべて同時に最大化できる設計はありません。目指すのは、判断の理由と検証方法、残る負担を明らかにすることです。この表はよくある不満に対するDicks Languageの対応であり、他言語を一括して評価するものではありません。
| よくある問題 | 実装済みの対応 | 根拠 | 残る負担・未実装のもの |
|---|---|---|---|
| 暗黙の型変換と実行の後半で起きる型エラー | 厳密な静的スタック型と明示的な変換 | 拒否すべき入力の検査器テスト、Rust・参照実装のシグネチャ一致 | 基本型と名目的なList/Record/Result。ジェネリクスは計画段階 |
| 整数の桁あふれと精度の欠落 | BigIntによる検査付きInt64、正確なJSON変換のガード | オーバーフロー、除算、安全なJSON整数のテスト | BigIntの負担。完全な数値型の体系はない |
| 通常の値のnullエラー | 基本型を暗黙にnull許容にしない | ホスト・エントリー境界の厳格な検査 | Jsonにはnullを含められる。明示的なResultは実装済みで、Optionの省略記法はない |
| 変更可能な状態の共有 | 不変の基本値と複製・凍結したJSON、フレームごとのスロット | 変更・アクセサー・分岐代入のテスト | 信頼したホストは自身の状態を変更できる。並行処理のモデルは未定義 |
| 見えない入出力や依存の副作用 | 明示的なABIのインポートと間接的なエフェクト、実行時の許可検査 | 直接・間接のホストテスト、未使用インポートの除外 | ホスト宣言の正直さは信頼対象。ホスト用サンドボックスはない |
| 成否不明のタイムアウト後の書き込み再試行 | 自動再試行をせず、不明な結果を明示 | ホストの失敗・呼び出し回数のテスト | アプリケーションの冪等性とトランザクションは必要 |
| 無制限のループと入力解析 | fuelに加え、ソース・トークン・入れ子・スタック・ホスト・テキストの上限 | 不正ソースのテスト群、空ループ、上限のフィクスチャ | fuelと実時間は異なる。ホストは信頼対象 |
| 本番の巨大なインタープリターや起動処理 | 構造化JavaScriptの事前生成と静的インポート | 単独生成物の実行とeval不使用の検査 | 各生成物にランタイムを含む。サイズや性能の優位性は主張しない |
| 再現しないビルド出力 | 生成物に時刻・パスを含めず、依存を固定 | バイト単位の再ビルド一致テスト | リモートの完全一致バージョンと内容ダイジェストに対応。バージョンをまたぐ再現性は保証しない |
| エラー箇所の調査の難しさ | 安定した診断コード、上限付きの位置情報、LSP、意味に沿ったステップ実行 | 不正ソースの差分検査、エディターのプロトコルテスト | 意図的なソースの読みにくさは残る。プラットフォーム入出力のデバッグには明示的なフィクスチャが必要 |
| 依存の増加とサプライチェーンへの露出 | 小さなRustシードの依存範囲、コミットしたlock | cargo・npmの固定依存の検証 | Serdeとツールチェーンには依存する。完全性は公開者への信頼を証明しない |
| ソースの可読性 | 整形器、解読した命令、型付きスタックの遷移、呼び出し先の表示 | CLIと整形のフィクスチャ | ソースは意図的に読みにくい。この選択を「解決済み」とはしない |
| プラットフォームへの固定 | 狭いホストABIと静的なES2022ターゲット | NodeとローカルCloudflare workerdでの実行 | ネイティブ・Wasmバックエンドや、プラットフォームに依存しないパッケージの生態系はまだない |
性能を主張する前に必要な根拠
コンパイル時間、生成物のバイト数、コールド・ウォーム時のリクエスト時間、同時実行時のスループット、CPU時間、ホスト呼び出し回数、p50/p95/p99を測ります。同じ処理と出力で、直接のJavaScript実装とTypeScriptインタープリターを比較してください。純粋な計算とD1・通信の時間を分け、シードと負荷を固定して、バージョン、上限、ウォームアップ、サンプル数、失敗率を記録します。スクリプトと生の結果を公開し、Rustで実装したという理由でリクエスト速度を推測しないでください。
最適化では、整数の検査、エフェクトの順序、観測可能なエラー、宣言したリソース計上の契約を保つ必要があります。明記した負荷で測定できた改善だけが、性能の主張の根拠になります。
設計の参考資料
以下の資料を設計の参考にしています。それぞれの意味をすべて実装したと主張するものではありません。
- WebAssemblyの命令検証:型付きスタックと構造化制御の検証。
- ECMAScript BigInt:出力先の整数表現。言語側でInt64の範囲制限を追加します。
- Rustの回復可能なエラー:本番のpanicにせず、コンパイラのエラーを明示します。
- Rustのブートストラップ:セルフホストに向けた段階の区別。
- Cloudflare WorkersのWebAssembly対応:将来のバックエンドの参考であり、実装済みのWasmバックエンドではありません。