问题标签 [vm-implementation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
2580 浏览

c - 编写 VM - 格式良好的字节码?

我用 C 语言编写虚拟机只是为了好玩。跛脚,我知道,但幸运的是我在 SO 所以希望没有人会取笑:)

我写了一个非常快的虚拟机,它读取(我自己的)ASM 行并做一些事情。现在,我只有 3 条指令:add, jmp, end. 一切都很好,能够喂线实际上很酷(这样做write_line(&prog[1], "jmp", regA, regB, 0);然后运行程序:

我在 C 中使用操作码查找表(可能效率不高,但很优雅),一切似乎都正常。

我的问题更像是一个“最佳实践”问题,但我确实认为它有一个正确的答案。我正在使 VM 能够读取二进制文件(将字节存储在 中unsigned char[])并执行字节码。我的问题是:VM 的工作是确保字节码格式正确,还是编译器的工作只是确保它输出的二进制文件格式正确?

我之所以问这个问题,是因为如果有人编辑二进制文件并搞砸(删除它的任意部分等)会发生什么。显然,该程序将是错误的,并且可能无法正常工作。这甚至是VM的问题吗?我敢肯定,比我聪明得多的人已经找到了解决这些问题的方法,我只是好奇它们是什么!

0 投票
3 回答
921 浏览

lua - C++ 可以简化 Lua VM 的实现吗?

对于那些浏览过 Lua C VM 实现的人来说,使用 C++ 会显着简化实现吗?

0 投票
2 回答
419 浏览

c++ - 如何在自定义 VM 中实现尾调用

如何在自定义虚拟机中实现尾调用?

我知道我需要弹出原始函数的本地堆栈,然后是参数,然后推送新参数。但是,如果我弹出函数的本地堆栈,我应该如何推送新参数?他们刚刚从堆栈中弹出。

0 投票
1 回答
120 浏览

c++ - 注册管理提示

实现一个自定义虚拟机,我开始使用寄存器(这些将存储指针并且在为空时为 NULL)。但是,我开始意识到我实际上不知道如何管理基于寄存器的内存。比如,如果我所有的寄存器都用完了,而某些代码想要另一个,我该怎么办?最好不要仅仅创建一个新的。
这是在 C++ 中。

0 投票
1 回答
210 浏览

parsing - 带有单寄存器 VM 的解释器 - 可以评估所有数学。表达式?

我正在写一个解释器。我以前做过,但从未尝试过可以使用3 + 4 * 2 / ( 1 − 5 ) ^ 2 ^ 3.

我的解析过程没有问题,实际上是关于我的虚拟机然后执行代码。

我的目标是一个快速的解释器,所以我决定不使用基于堆栈的 VM,在这种情况下你需要多个指令来进行乘法运算,例如(push、push、mul)

解析器生成的 VM 的“汇编”代码如下所示:

3 + 4 * 2 / ( 1 − 5 ) ^ 2 ^ 3

变成

(结果正确)

  • 如您所见:每条指令都没有,一两个参数。结果寄存器保存最后一条指令的结果。就是这样。

具有这种结构的语言并且只有一个寄存器的 VM 可以计算每个数学表达式,例如 Python 或 PHP 可以吗?

如果没有堆栈是不可能的,我现在就重新开始!

0 投票
4 回答
805 浏览

c++ - 自定义 VM 中有多少个寄存器?

我正在设计一个自定义 VM,并且很好奇我应该使用多少个寄存器。最初,我有 255 个,但我有点担心每次调用函数时将 255 个指针(整个 KB)备份到堆栈或堆上,而其中大多数甚至不会被使用。我应该使用多少个寄存器?

0 投票
2 回答
416 浏览

c++ - JIT 编译器中的 ebp + 6 而不是 +8

我正在为好玩而编写的 VM 中实现一个简单的 JIT 编译器(主要是为了了解有关语言设计的更多信息)并且我遇到了一些奇怪的行为,也许有人可以告诉我原因。

首先,我为 C 和 C++ 定义了一个 JIT“原型”:

我有一个compile()函数可以将内容编译到 ASM 中并将其粘贴到内存中的某个位置:

最后,我有了程序的主要部分:

如您所见,该compile()函数有几个测试我运行,以确保我得到预期的结果,几乎一切正常,但我有一个问题......

在大多数教程或文档资源中,要获取传递的函数的第一个值(在整数的情况下),您需要执行[ebp+8]第二个[ebp+12],依此类推。出于某种原因,我必须这样做[ebp+6]等等[ebp+10]。谁能告诉我为什么?

0 投票
1 回答
647 浏览

vm-implementation - Parrot VM 对最终用户有什么好处?

Parrot 虚拟机对最终用户(软件开发人员)有什么好处?

例如,如果我可以直接针对 Perl 或 Python 进行编程,我为什么还要在 Parrot 下为它们编程呢?

0 投票
3 回答
387 浏览

compiler-construction - 说中间代码在虚拟机中运行是否具有误导性

如果我理解我所读的内容是正确的,那么虚拟机本质上就是中间代码的编译器。但从来没有说过 Delphi(作为非托管代码的一个例子)在其编译器中运行。将虚拟机描述为编译器会不会更容易混淆?

0 投票
1 回答
4446 浏览

.net - .NET VM 是编译器还是解释器?

.NET 的虚拟机是编译 CIL 字节码(然后在最低级别执行代码 - CPU 汇编程序),还是解释器(读取以下指令并执行它们)?