LemonHX

LemonHX

CEO of Limit-LAB 喜欢鼓捣底层的代码,意图改变世界
twitter
tg_channel

銀の弾はありません:LemonVMのデザインの欠陥の反省と将来の展望。

image.png

起源#

LemonVM を作成しているとき、最初のバージョンでは Rust 言語を採用しました。当時、Rust 言語を使用することで、少なくとも VM を作成する際にメモリの安全性を保証できると考えていました。しかし、現実は、このような低レベルの大規模プロジェクトを作成する際に、メモリの安全性を静的に保証することは不可能であることを教えてくれました。特に、ガベージコレクションを実装する必要がある場合、メモリの使用量を推定できることはできません。そのため、私のコードは Unsafe で満ちており、Rust の最大の利点であるメモリの安全性を失ってしまいました。

その後、命令セットの設計ミスと大きな夢を描いたため、最初のバージョンの LemonVM はまったく使える段階に到達できませんでした。また、ローカルのソースコードは驚異的な 1 万行に達していたため、しっかりと再設計することにしました。そのため、第 2 版の旅を始めました。

もう一度やり直す#

第 2 版が始まった後、元の命令セットとバイトコードのロード部分を大幅に再構築しました。最初のバージョンは LUA の VM を参考にしましたが、LUA の VM は LUA 言語が非常に小さいため、VM の機能が少なく、特に複雑な作業には対応できませんでした。そのため、第 2 版では JVM を直接参考にしました。ただし、JVM はレジスタベースのバイトコードではなく、スタックベースのバイトコードであるため、Dalvik 版の実行と JVM のロードモデルを参考にしました。これにより、第 2 版を作成しました。

@HoshinoTented と私のサンプルプログラムを通じて、LemonVM の第 2 版の効率が Python の 50 倍であることがわかりました。これは明らかにどこかで大きなオーバーヘッドが発生していることを意味します。調査の結果、私が実装した部分で大量のヒープメモリの割り当てと Naive な GC の使用が原因であることがわかりました。また、Rust の Iter と Rust の Match が CPU の分岐予測に非常に大きな影響を与え、実行効率が非常に低下していることもわかりました。最適化の方法は次のとおりです。

  • すべての命令の実装を書き直す
  • すべてのヒープ割り当てを手動で管理する
  • Rust の標準ライブラリの使用を避ける
  • 分岐フローをより細かく制御する

最初の方法は現在プロトタイプ段階であるため、スキップできます。2 番目の方法は Rust ではほぼ不可能であり、3 番目の方法も同様です。4 番目の方法は、Rust には Goto や Label as Var がないため、分岐予測を制御することができず、命令のディスパッチを手動で最適化することもできません。

レモンが頭に上がった#

そこで、レモンは「再設計」を再設計し始めました。この回では、開発言語として C 言語を直接採用しました。確かに、これらの 4 つの問題はすべて解決されましたが、より大きな問題に直面しました。開発効率が非常に低くなり、C には標準ライブラリがないため、パフォーマンスに敏感でない Use case では、ハッシュテーブルやベクターなどの基本的なデータ構造を自分で実装する必要がありました。これにより、私の作業は非常に遅くなりました。さらに、C のビルドツールはまったく... 不快でした。同時に、拡張を開くことは、一部のクソ MSVC ではコンパイルできなくなることを意味し、クロスプラットフォームの初心を失ってしまいました。非常に不快な気持ちになりましたので、最近は新しい解決策を試しています。まず、パフォーマンスに敏感で標準ライブラリに高度に依存する(バイトコードのロード、GC、スレッドプールなど)部分を Rust で完成させ、次に C 言語を使用してコアロジックを最適化します(命令のディスパッチ、CPU の分岐予測の最適化、レジスタマッピング、スタックマッピングなど)。なぜなら、Rust で X64 モードで ASM を書くことは、MOVABSQ を書くためにコンパイラの顔色を見る必要があるからです。


将来の低レベルプログラミング言語への展望#

冰冰は今日、低レベルプログラミング言語としては goto や label が必要だと興奮して私に話しました。私は今まで非常に統一されていると思っていましたが、高レベル言語としては、高度な抽象化が必要です。これらの抽象化は言語の低レベルの特性を破壊する可能性があります。そして、私と冰冰は F * 言語が言語を格子状に分割して低レベルの操作を行うことによって、大きなインスピレーションを得たことに気付きました。

Unsafe Rust は十分に安全ではありません。Safe Rust は十分に安全ではありません。

したがって、将来的には、言語の低レベルの特性をどれだけ使用するかを制御できる言語を開発できることを望んでいます。そして、C のようにコンパイラの顔色を見るのではなく、Rust を学んで GOTO さえ持っていないような奇妙なものを作ることはありません。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。