我々は、オブジェクト・テーブルを使用し、何が起こるかを見るためにファロのVMを変更したい大学のプロジェクトとして、コンテキストデバッグインタプリタVMプリミティブ
を変更します。
pharo-vm clone from githubとVMMakerを使用します。 VMの構築はうまくいきます。始めるため
我々はインクリメント整数を返すというプリミティブを追加しました:
InterpreterPrimitives>>primitiveIntegerIncrement
"increments an integer"
self pushInteger: self popInteger + 1 .
と
MaxPrimitiveIndex := 576.
"... and so on ..."
(575 primitiveFail)
(576 primitiveIntegerIncrement))
応じStackInterpreter class>>initializePrimitiveTable
を変更し、それが動作します。
問題
我々はすでにSmalltalkImageで、実行をテストするために私たちは、コンパイルし、それが動作しませんでした確認する必要がありませんしたいVMに変更を加える。以下のような
何か:
StackInterpreter test: '1 inc'
およびプリミティブが間違っているか、エラーが発生した場合、私はデバッグすることができます。もちろんもっと多くのことをする必要がありますが、これをどのように達成できますか?我々は
カテゴリ
VMMaker-InterpreterSimulation
クラスStackInterpreterSimulator
を試してみました何。コメントでコードをしようと
DoIt ^(StackInterpreterSimulator new openOn: Smalltalk imageName) test
エラー:
はdisplayForm := 'Display has not yet been installed' asDisplayText form.
延ByteStringは理解していない
asDisplayText
(CogVMSimulator new openOn: Smalltalk imageName) test (InterpreterSimulator new openOn: Smalltalk imageName) test
エラー:
PrimitiveFailed: primitive #basicNew: in Array class failed
私はまた、このスクリーンキャストを見つけたが、それは外側だけ使用してGBDからVMをデバッグします:http://vimeo.com/22485382#
私たちのプロジェクトは、ここでホストされている:我々は、オブジェクト表を実装し始め
http://smalltalkhub.com/#!/~kirstin/PharoObjectTable
現状。属性のルックアップはオブジェクトテーブルを通過できます。完全なオブジェクト・テーブルのサポートと直接ポイントの使用は非常に難しいです。なぜなら、どこでもポインタが期待されるからです。したがって、オブジェクトテーブルへのポインタを使用して、ルックアップがいつOTを通過するかを識別します。また、すべてのオブジェクト作成プリミティブを見つけて、新しいオブジェクトをテーブルに追加しました。
参考のため、RoarVMを見てみたいですが、通常はオブジェクトテーブルがありますが、次のものがないバリアントもあります:https://github.com/smarr/RoarVM/tree/features/without-object-テーブルCogVMと比較して、JITコンパイラはなく、一般的には遅いです。しかし、それはまだ物事に接近する方法についてのいくつかの洞察を与えるかもしれません。 – smarr