上下文
作为一个大学项目,我们想要改变pharo vm以使用对象表,看看会发生什么。
我们使用pharo-vm clone from github和VMMaker。构建VM工作正常。
为了开始,我们添加了一个返回增量Integer的原语:
InterpreterPrimitives>>primitiveIntegerIncrement
"increments an integer"
self pushInteger: self popInteger + 1 .
并相应修改StackInterpreter class>>initializePrimitiveTable
MaxPrimitiveIndex := 576.
"... and so on ..."
(575 primitiveFail)
(576 primitiveIntegerIncrement))
它有效。
问题
当我们对VM进行更改时,我们想要在SmalltalkImage中进行测试运行,这样我们就不需要编译并看到它不起作用。
类似的东西:
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。我们还找到了所有对象创建原语,并向表中添加了新对象。
答案 0 :(得分:4)
您的项目有多长,您有多少人?对我来说,你尝试做的是相当多的工作。你对低级行为有很好的了解吗?
要回答你的问题,这里的主要问题是cog模拟器没有在pharo vm fork中维护。这是因为pharo工作人员中没有人使用模拟器。我们只使用gdb的外部调试。实际上,pharo人主要使用VM插件,VM的核心主要由Eliot Miranda维护和开发,该工作在Squeak上。因此,当VM核心出现错误时,我们会向他汇报。
对于您的项目,您必须至少分两步:
步骤1:使对象表与堆栈VM一起使用
第2步:使JIT与对象表一起使用
请注意,对于第2步,我建议不要更改对象访问其标题的方式,因此具有类似VW的对象表,其中您在对象表中的对象表上具有固定大小的标题,以及字段堆中的对象(可能是头扩展名)。
因此,首先使用StackVMSimulator并构建StackVM。当一切都可行(包括上下文)时,你可以考虑攻击JIT。最近Guillermo Polito将Stack VM移植到构建过程中(参见PharoSVMBuilder而不是PharoVMBuilder),一个人报告了这个构建器的问题,但是你可以稍微破解它以使其工作。
现在让模拟器在Pharo 2.0上运行(这是您拥有的生成器图像的Pharo版本),您必须打开monticello浏览器并从Eliot的分支中合并Cog包(repo MCHttpRepository位置:'http:/ / source.queque.org / VMMaker'),但不是最新的Cog,与当前的pharo-vm VMMaker包大约相同,因为Eliot分支的最新Cog和VMMaker不稳定。
另一种选择是从艾略特的构建图像开始,并从pharo分支合并。以下是有关如何构建吱吱声发展图像的信息(http://www.mirandabanda.org/cogblog/build-image/)。
然后艾略特给了我这个剧本一次:
| cos |
cos := CogVMSimulator newWithOptions: #(Cogit SistaStackToRegisterMappingCogit).
cos desiredNumStackPages: 8.
cos openOn: 'my/favourite.image'.
cos openAsMorph; toggleTranscript; halt; run
您不需要SistaStackToRegisterMappingCogit选项。我猜一些与StackVMSimulator类似的脚本应该可以工作。
最后有一些关于模拟器的文档,但它只适用于CogSimulator(这些文档希望你已经知道StackSimulator是如何工作的,只是给你一些关于如何在JIT中使用它的提示): http://www.mirandabanda.org/cogblog/2008/12/12/simulate-out-of-the-bochs/ 在一个名为“Cog VM(第x部分)”的视频中,x为1到6,Eliot展示了他如何使用模拟器来反汇编x86,打印堆栈并检查堆。
另一个提示,请在pharo邮件列表(pharo用户或pharo dev)上提出您的问题,因为这里没有人会注意到您的问题(幸运的是,这次有人向我指出了您的问题)。
如果你设法在Pharo 2.0中运行模拟器,请告诉pharo邮件列表,有些人(对我而言)对它很感兴趣。我计划在某个时候这样做。
祝你好运!反正很好的项目。答案 1 :(得分:1)
我上一次尝试使用模拟器的时间大约是一年前,而且我没有让它工作。 但是,有一些补丁,我认为这些补丁从未被集成,可能会有所帮助:
问题107包含针对asDisplayText
问题的补丁。