Tag: vm implementation

VM /解释器的性能改进策略?

我用C语言编写了一个简单的VM,使用简单的指令切换,无需任何指令解码,但性能非常糟糕。 对于简单的aritmetic操作,对于相同的操作,VM比本机C代码慢大约4000倍。 我测试了一组长度为1000万的数组,第一组由程序指令组成,随机+ – * /操作,2个数组保存随机整数,第三个数组是操作目标存储。 我期待看到算术性能下降3-4倍,所以`4000x真的让我感到震惊。 即使是最慢的解释语言似乎也能提供更高的性能。 所以,我的方法出错了,如何在不使用JIT编译到机器代码的情况下提高性能? 实施是……基本上我能想到的最简单: begin: { switch (*(op+(c++))) { case 0: add(in1+c, in2+c, out+c); goto begin; case 1: sub(in1+c, in2+c, out+c); goto begin; case 2: mul(in1+c, in2+c, out+c); goto begin; case 3: div(in1+c, in2+c, out+c); goto begin; case 4: cout << "end of program" << endl; goto end; default: […]

现代VM如何处理内存分配?

我正在研究用C编写的简单堆栈机器,主要用于学习目的。 在使用malloc/free进行内存操作之后,我认为从现代虚拟机中读取一些特定于内存分配的代码是个好主意。 我下载了Lua源代码并开始阅读它。 过了一会儿,我意识到涉及很多宏的东西,我找不到真正的内存分配完成的代码(即malloc调用)。 find . -exec grep -i “malloc” ‘{}’ \; -print 它只打印了一些名称中包含malloc单词的Lua宏。 Lua VM(和编程语言)根本不使用malloc ! 所以这引出了一个问题:现代VM如何处理内存分配? Lua如何从堆中分配内存? 除了malloc之外,还有什么方法可以进行分配吗? 其他方法的优缺点是什么? 我也想知道安全地处理分配的内存的最佳实践,设计模式等。 我在Lua的源代码中看到,在分配内存之前有很多间接。 我在哪里可以了解这些东西?