« 闲话 java | 返回首页 | 基于并行处理的垃圾回收方法 »

实现一个系统堆栈无关的虚拟机

最初设计虚拟机时,bytecode 中的函数调用会产生一个 native code 上的实际的函数调用。似乎这样写比较容易。但是这样做,想实现bytecode单步运行却很困难。只有另开一个线程监护跑虚拟机的线程,在每步运行后可以挂起,而不破坏相关的堆栈。

所以,我想实现一个系统堆栈无关的虚拟机。

把虚拟机改造一下其实是很容易的。实际上,每次虚拟机中的函数调用,堆栈上保存的只有调用点,堆栈顶的位置,而需要多少个返回值。

当前运行中的函数体也需要保留下来,因为我的整套虚拟机的内存管理是 gc 的,包括 bytecode 本身。不记录函数体对象,很可能让函数体本身在一个 gc 中灰飞烟灭。

这样一共是四个参数,单独建一个 table 模拟堆栈放即可。这个堆栈我以前就创建了,只不过只放了函数体对象而已。稍加修改就可以适应新的需求。

在考虑做这个新的虚拟机运行方式的版本时,我考虑了一个问题。如果支持单步运行,那么bytecode运行效率就会下降。为了解决这个问题,我决定保留以前的运行方式。用继承的方法,给虚拟机增加新的运行方式。

由于考虑到,我在单步跟踪环境下,调用 C 函数,C函数中又可能以非单步运行方式回调虚拟机中的函数。我必须保证两种运行方式的堆栈内存布局一致。但是在使用系统堆栈的连续执行方式下,虚拟机内堆栈大部分信息都填nil即可。

有了系统堆栈无关的运行模式,日后加 coroutine 将会非常简单。

原来以为以上工作做起来会比较麻烦,今天晚上试了一下,只花了2小时就搞定了:)
如果有时间,用 .net 做个 IDE 玩玩。到今天为止,整套脚本都实现完毕了,虚拟机和编译器皆工作正常。脚本可以实现有限的 OO 特性。主观臆测,运行效率不差于 lua 。期望在实测中超过 lua 。

肯定强过 lua 的一点是,这个虚拟机是基于真正的内存整理的 gc 算法,应该比较适合服务器程序的长时间工作。数据持久化工作也相对容易。

Comments

想通读一下老大的blog,发现本篇竟然没人留言,索性我踩一脚吧。。

Post a comment

非这个主题相关的留言请到:留言本