问题标签 [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.
c - 编写 VM - 格式良好的字节码?
我用 C 语言编写虚拟机只是为了好玩。跛脚,我知道,但幸运的是我在 SO 所以希望没有人会取笑:)
我写了一个非常快的虚拟机,它读取(我自己的)ASM 行并做一些事情。现在,我只有 3 条指令:add
, jmp
, end
. 一切都很好,能够喂线实际上很酷(这样做write_line(&prog[1], "jmp", regA, regB, 0);
然后运行程序:
我在 C 中使用操作码查找表(可能效率不高,但很优雅),一切似乎都正常。
我的问题更像是一个“最佳实践”问题,但我确实认为它有一个正确的答案。我正在使 VM 能够读取二进制文件(将字节存储在 中unsigned char[]
)并执行字节码。我的问题是:VM 的工作是确保字节码格式正确,还是编译器的工作只是确保它输出的二进制文件格式正确?
我之所以问这个问题,是因为如果有人编辑二进制文件并搞砸(删除它的任意部分等)会发生什么。显然,该程序将是错误的,并且可能无法正常工作。这甚至是VM的问题吗?我敢肯定,比我聪明得多的人已经找到了解决这些问题的方法,我只是好奇它们是什么!
lua - C++ 可以简化 Lua VM 的实现吗?
对于那些浏览过 Lua C VM 实现的人来说,使用 C++ 会显着简化实现吗?
c++ - 如何在自定义 VM 中实现尾调用
如何在自定义虚拟机中实现尾调用?
我知道我需要弹出原始函数的本地堆栈,然后是参数,然后推送新参数。但是,如果我弹出函数的本地堆栈,我应该如何推送新参数?他们刚刚从堆栈中弹出。
c++ - 注册管理提示
实现一个自定义虚拟机,我开始使用寄存器(这些将存储指针并且在为空时为 NULL)。但是,我开始意识到我实际上不知道如何管理基于寄存器的内存。比如,如果我所有的寄存器都用完了,而某些代码想要另一个,我该怎么办?最好不要仅仅创建一个新的。
这是在 C++ 中。
parsing - 带有单寄存器 VM 的解释器 - 可以评估所有数学。表达式?
我正在写一个解释器。我以前做过,但从未尝试过可以使用3 + 4 * 2 / ( 1 − 5 ) ^ 2 ^ 3
.
我的解析过程没有问题,实际上是关于我的虚拟机然后执行代码。
我的目标是一个快速的解释器,所以我决定不使用基于堆栈的 VM,在这种情况下你需要多个指令来进行乘法运算,例如(push、push、mul)
解析器生成的 VM 的“汇编”代码如下所示:
3 + 4 * 2 / ( 1 − 5 ) ^ 2 ^ 3
变成
(结果正确)
- 如您所见:每条指令都没有,一两个参数。结果寄存器保存最后一条指令的结果。就是这样。
具有这种结构的语言并且只有一个寄存器的 VM 可以计算每个数学表达式,例如 Python 或 PHP 可以吗?
如果没有堆栈是不可能的,我现在就重新开始!
c++ - 自定义 VM 中有多少个寄存器?
我正在设计一个自定义 VM,并且很好奇我应该使用多少个寄存器。最初,我有 255 个,但我有点担心每次调用函数时将 255 个指针(整个 KB)备份到堆栈或堆上,而其中大多数甚至不会被使用。我应该使用多少个寄存器?
c++ - JIT 编译器中的 ebp + 6 而不是 +8
我正在为好玩而编写的 VM 中实现一个简单的 JIT 编译器(主要是为了了解有关语言设计的更多信息)并且我遇到了一些奇怪的行为,也许有人可以告诉我原因。
首先,我为 C 和 C++ 定义了一个 JIT“原型”:
我有一个compile()
函数可以将内容编译到 ASM 中并将其粘贴到内存中的某个位置:
最后,我有了程序的主要部分:
如您所见,该compile()
函数有几个测试我运行,以确保我得到预期的结果,几乎一切正常,但我有一个问题......
在大多数教程或文档资源中,要获取传递的函数的第一个值(在整数的情况下),您需要执行[ebp+8]
第二个[ebp+12]
,依此类推。出于某种原因,我必须这样做[ebp+6]
等等[ebp+10]
。谁能告诉我为什么?
vm-implementation - Parrot VM 对最终用户有什么好处?
Parrot 虚拟机对最终用户(软件开发人员)有什么好处?
例如,如果我可以直接针对 Perl 或 Python 进行编程,我为什么还要在 Parrot 下为它们编程呢?
compiler-construction - 说中间代码在虚拟机中运行是否具有误导性
如果我理解我所读的内容是正确的,那么虚拟机本质上就是中间代码的编译器。但从来没有说过 Delphi(作为非托管代码的一个例子)在其编译器中运行。将虚拟机描述为编译器会不会更容易混淆?
.net - .NET VM 是编译器还是解释器?
.NET 的虚拟机是编译 CIL 字节码(然后在最低级别执行代码 - CPU 汇编程序),还是解释器(读取以下指令并执行它们)?