问题标签 [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 投票
5 回答
177 浏览

javascript - 目前正在采用哪些技术来加速下一代 javascript 引擎?

我对当前的 javascript 引擎有相当多的了解。在此期间出现了哪些技术?请提供免费信息的链接。

编辑:

澄清一下,我正在寻找正在实施或最近被考虑用于提高 javascript 执行速度的新技术。

0 投票
1 回答
198 浏览

input - 在虚拟机中实现 I/O 的更好方法?

我正在编写一个虚拟机——不是像 Virtualbox 这样的现有架构模拟器,而是像 JVM 或 BEAM 这样的东西——有自己的指令集、内存模型等。最终我计划实现一个非常小而简单的(但图灵完备的)高级语言,可以编译成它的字节码,只是为了好玩。

当然,机器必须支持一些 I/O,但我不想将其仅限于使用 stdin/stdout 进行操作。我想像模块化的“虚拟设备”这样的东西,它可以实现为共享库,以便 VM 可以在运行时加载它们并通过标准接口与它们通信。这样,例如,我们可以为标准输入/输出、图形(想象一个让您的 VM 程序在 SDL 窗口内绘制内容的虚拟设备)甚至网络拥有“虚拟设备”。

问题是:为 VM 编写的程序应该如何与虚拟设备通信?我决定模仿与实际硬件一起使用的技术,并了解了基于端口的 I/O 和内存映射 I/O。但是,我不确定其中哪一个更适合我的目标。您能否建议哪个更好,或者甚至指出一种完全不同的处理输入/输出的技术?

提前致谢。

0 投票
2 回答
1072 浏览

vm-implementation - 交叉编译与虚拟机

澄清

当我提到交叉编译时,我的意思是从一种语言到另一种语言(想想 GWT),而不是从主机平台到目标平台。

背景

我正在开发一种交叉编译为 Java 的阿拉伯语编程语言,这为我节省了特定于平台的麻烦。现在我不得不搁置它并出于各种原因转向交叉编译到C。

我想开发一个单独的库,在编译时将其替换为运行它的系统的等效库。

例如,如果程序员用阿拉伯语编程语言编写一个GUI绘图函数并编译,在Windows下编译会交叉编译成win32代码,在Gnome下编译GTK+,在KDE下编译Qt等。图书馆也是如此。

问题

是否值得通过所有这些麻烦来结束编译的可执行文件,或者我最好使用虚拟机方法?选择其中一个的优点和缺点(从语言开发人员的角度而不是使用该语言的程序员的角度)?还有其他我需要考虑的因素吗?

任何进一步阅读的参考链接将不胜感激:)

0 投票
4 回答
445 浏览

compiler-construction - VM for Scheme 支持并行化

我用 Java 编写了一个Scheme 评估器,它执行了一些并行化技巧。目前除了我以外的任何人都无法使用它,但我得到了一些结果。

前端和中端对于我的目的来说还可以,是我想要专注的部分,但我的后端很糟糕。它未经优化,速度缓慢或缺乏适当的尾调用优化。

因此,我想针对现有的虚拟机。有人知道这个候选人吗?它不一定是企业级虚拟机,但至少应该

  • (相对)容易从 Scheme 中定位
  • (合理地)便携
  • 开箱即用地支持并行结构
0 投票
2 回答
2086 浏览

assembly - 是否存在 Lua 5.1 汇编程序?

出于无聊,我研究 Lua 5.1 VM 操作码已有一段时间了。

我想尝试编码一些东西!

那么有没有现有的方法可以将 Lua 程序集组装成字节码?

0 投票
8 回答
6094 浏览

java - 什么是 VM,为什么动态语言需要 VM?

因此,例如,Python 和 Java 有一个 VM,而 C 和 Haskell 则没有。(如我错了请纠正我)

想着线路两边都有哪些语言,找不到原因。Java 在很多方面都是静态的,而 Haskell 提供了很多动态特性。

0 投票
2 回答
472 浏览

c - 虚拟机查杀性能中的函数调用

我用 C 编写了一个虚拟机,它有一个调用表,其中填充了指向提供 VM 操作码功能的函数的指针。当虚拟机运行时,它首先解释一个程序,为提供的操作码在调用表中创建对应于适当函数的索引数组。然后它遍历数组,调用每个函数直到它到达末尾。

每条指令都非常小,通常是一行。非常适合内联。问题是编译器不知道何时调用虚拟机的任何指令,因为它是在运行时决定的,所以它不能内联它们。函数调用和参数传递的开销正在扼杀我的虚拟机的性能。关于如何解决这个问题的任何想法?

0 投票
6 回答
2214 浏览

performance - 在 C 虚拟机中实现寄存器

我用 C 语言编写了一个虚拟机作为一个爱好项目。此虚拟机执行与 Intel 语法 x86 程序集非常相似的代码。问题是这个虚拟机使用的寄存器只是名义上的寄存器。在我的 VM 代码中,寄存器的使用与 x86 寄存器一样,但机器将它们存储在系统内存中。在 VM 代码中使用寄存器而不是系统内存没有性能改进。(我认为仅局部性会在一定程度上提高性能,但实际上并没有改变。)

在解释程序时,此虚拟机将指令的参数存储为指针。这允许虚拟指令将内存地址、常量值、虚拟寄存器或几乎任何东西作为参数。

由于硬件寄存器没有地址,我想不出一种方法将我的虚拟机寄存器实际存储在硬件寄存器中。在我的虚拟寄存器类型上使用 register 关键字不起作用,因为我必须获取指向虚拟寄存器的指针才能将其用作参数。有没有办法让这些虚拟寄存器的性能更像它们的本地对应物?

如有必要,我非常乐意钻研组装。我知道 JIT 编译此 VM 代码可以让我利用硬件寄存器,但我也希望能够将它们与我的解释代码一起使用。

0 投票
7 回答
23266 浏览

assembly - 如何在 x86 汇编中编写自修改代码

我正在考虑为我最近一直在研究的爱好虚拟机编写 JIT 编译器。我知道一点汇编,(我主要是一名 C 程序员。我可以阅读大多数汇编,参考我不理解的操作码,并编写一些简单的程序。)但我很难理解几个例子我在网上找到的自修改代码。

这是一个这样的例子:http ://asm.sourceforge.net/articles/smc.html

提供的示例程序在运行时做了大约四种不同的修改,没有一个被清楚地解释过。Linux 内核中断多次使用,不作解释或详细说明。(作者在调用中断之前将数据移动到多个寄存器中。我假设他正在传递参数,但根本没有解释这些参数,让读者猜测。)

我正在寻找的是自修改程序代码中最简单、最直接的示例。我可以查看并使用它来了解如何编写 x86 程序集中的自修改代码,以及它是如何工作的。您是否可以指出我的任何资源,或者您可以提供的任何示例来充分证明这一点?

我正在使用 NASM 作为我的汇编程序。

编辑:我也在 Linux 上运行这段代码。

0 投票
1 回答
278 浏览

python - python vm每次都编译方法吗?

如果我有一个在模块中的几个地方调用的函数,虚拟机是否仅在第一次执行该函数时将其编译为本机代码,而不是在其他调用中使用已兑现的代码?(如 .NET jit 编译器)