3

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

 2 years ago
source link: https://blog.codingnow.com/2005/12/stack_less_vm.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

云风的 BLOG

思绪来得快去得也快,偶尔会在这里停留

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

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

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

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

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

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

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

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

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

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

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

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

云风 提交于 December 10, 2005 02:33 AM | 固定链接

Comments

留个言,证明自己就是废物

Posted by: gameconfig111 | (2) November 5, 2021 09:46 PM

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

Posted by: gaser | (1) February 25, 2011 05:35 PM

Post a comment

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

名字:

Email 地址:

为了验证您是人类,请将六加一的结果(阿拉伯数字七)填写在下面:

URL:

记住我的信息?

留言:
(不欢迎在留言中粘贴程序代码)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK