Salt Systems Language: Z3 Theorem Proving and MLIR Codegen

Salt Systems Language: Z3 Theorem Proving and MLIR Codegen

SaltはZ3定理証明をコンパイラに直接統合します

Saltは、ガベージコレクタのランタイムオーバーヘッドや借用チェッカーの複雑さを伴わずに、メモリ安全性と関数契約に関する数学的な確実性を提供するために設計されたシステムプログラミング言語です。Microsoft ResearchのZ3 SMTソルバーをコンパイルプロセスに組み込むことで、Saltは開発者がビルド時に検証されるrequires()事前条件とensures()事後条件を定義することを可能にします。

Z3ソルバーが条件が成立することを証明できる場合、対応するランタイムチェックは完全に省略され、そのチェックのために発行される命令はゼロになります。Z3が違反を見つけた場合、コンパイラは具体的な反例を報告します。ソルバーがタイムアウトした場合(各義務に対して100msの制限)、コンパイラは安全なランタイムチェックを発行するフォールバック処理を行います。

高性能アーキテクチャとMLIR codegen

Saltは、TensorFlowやPyTorchを支えるインフラストラクチャと同じMLIR (Multi-Level Intermediate Representation)を利用することで、clang -O3と同等のパフォーマンスを実現します。

自動ループタイリング

MLIR affine dialectを通じて、Saltは手動で調整されたタイルサイズを必要とせずに自動ループタイリングを実装しています。これにより、、一般行列乗算のような計算量に依存するタスクがCと同等の速度で実行可能になります。600行のSalt実装であるBasalt Llama 2推論エンジンでは、行列乗算は高い効率を維持するためにaffine optimizerを通じてタイリングされます。

Arena Memory Model

Saltは、従来のガベージコレクションと借用チェッカーを、アリーナベースのメモリモデルに置き換えます。すべての割り当ては特定の領域内で発生し、領域全体が一括で解放されます。コンパイラは、いかなる参照もそのアリーナより長く生存しないことを静的に検証するため、手動のfree()呼び出しや複雑な lifetime アノテーションを必要としません。

実世界の導入事例とベンチマーク

この言語は、いくつかの高性能システムを構築するために使用されており、さまざまなドメインにおける汎用性を示しています。

  • KeuOS: x86ハードウェア上で起動する、Saltでゼロから書かれたマイクロカーネルです。16コアSMP、Chase-Lev work-stealing、およびzero-trap socket APIを特徴としています。ベンチマークでは、null syscallが102サイクル(Linuxより7.4倍高速)、IPC ping-pongが297サイクルであることを示しています。
  • Lettuce: 567行のSaltで構成される、Redis互換のインメモリデータストアです。zero-copy RESP parserとkqueue event loopを利用して、テストされた並行性レベル(1–100クライアント)においてRedisを凌駕しています。 r
  • Basalt: すべての計算カーネルが、配列アクセスが範囲内であることをZ3で証明するZ3 proofを伴うLlama 2推論エンジンです。
  • FACET: すべてのピクセル書き込みがフレームバッファ内であることをZ3で検証する2Dレンダリングエンジンで、457 fpsを実現しています。

言語の使いやすさとツール

Saltは、ボイラープレートを削減し、可読性を向上させるために、いくつかの構文上の特徴を導入しています。

  • Pipe Operator: |>演算子はデータを左から右へ流し、|?>はエラーを伝播させます。これは、Cに見られる冗長なエラーハンドリングパターンや、Rustのtrait-boundの儀式を置き換えるものです。
  • F-strings: ヒープ割り当てやフォーマット指定子を必要とせずに、式を埋め込むことができる型安全な文字列フォーマットです。
  • Package Management: spツールは、プロジェクトの作成、ビルド、および依存関係の管理をハンドルします。コンテンツアドレス指定によるキャッシュを利用して、ソースコードが変更されていない限り、何も再ビルドされません。安全性契約はパッケージ境界を越えて検証されます。ライブラリが特定の条件を要求する場合、コンパイラはダウンストリームパッケージにおけるすべての呼び出し箇所でその条件を検証します。

技術的な制限とコミュニティの文脈

Saltは、大幅なパフォーマンスと検証能力を示していますが、著者は、これが現在は生産環境向けの言語ではなく、研究品質のプロジェクトであることを指摘しています。標準ライブラリは不完全であり、Z3の文字列や量化子のサポートは部分的です。さらに、Z3パスからのエラーメッセージは、時として不透明です。

コミュニティの議論では、他の形式検証言語との比較が強調されています。例えば、SPARK (Adaのサブセット) は、1980年代から安全性が重要な航空宇宙および防衛プロジェクトで使用されており、VerusはRustをZ3で拡張して同様の検証目的に使用されています。批判的な意見として、現在のドメインキュメントと言語仕様が整合性を欠いていること、およびプロジェクトが主要な開発者以外の広範なコミュニティのベータテスターが不足していることが指摘されています。

Sources