问题标签 [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.
javascript - 是否有用 Python 编写的 JavaScript (ECMAScript) 实现?
是否有任何用纯Python 编写的 JavaScript (ECMAScript) 实现?即使它的实现很慢也没关系。
c - 如何将 C 函数公开给自定义虚拟机?
我正在开发一个我希望能够与 C 交互的虚拟机。反过来,将虚拟机功能暴露给 C 代码是相当容易的,我无法解决的是将 C 函数暴露给一个虚拟机。
我希望能够像这样在虚拟机上动态注册 C 函数:
然后在我的虚拟机中,将参数推送到堆栈,然后:
问题是在不知道函数需要多少参数以及什么类型的情况下,我不确定是否可以使用函数指针。
是否有可以在这种情况下使用的通用函数指针类型?有人可以引导我朝着正确的方向前进吗?
performance - 为什么很难用 JIT 编译器击败 AOT 编译器(在应用程序性能方面)?
我认为 JIT 编译器最终会在编译代码的性能方面击败 AOT 编译器,因为 JIT 的固有优势(只能使用运行时可用的信息)。一个论点是 AOT 编译器可以花费更多时间编译代码,但服务器 VM 也可能花费大量时间。
我确实理解 JIT 在某些情况下似乎确实击败了 AOT 编译器,但在大多数情况下它们似乎仍然落后。
所以我的问题是,阻止 JIT 编译器击败 AOT 编译器的具体、棘手的问题是什么?
编辑:
一些常见的论点:
- AOT 编译器可以花费更多时间进行高级优化->如果您运行服务器虚拟机数天,您可以花费相同的时间,如果不是更长的话。
- 字节码解释是有成本的->现在大多数 JIT 编译器都会缓存本机机器指令。
另一个编辑:
有关特定示例,请参阅本文:提高 Swing 性能:JIT 与 AOT 编译。从我从这篇文章中可以了解到,作者基本上是在说,当没有热点时,拥有运行时信息的优势会降低,因此没有 JIT 开销的 AOT 会胜出。但是40%??这似乎没有多大意义。仅仅是被比较的 JIT 编译器没有针对这种情况进行调整吗?或者它是更基本的东西?
dart - 有可用的 Dart VM 吗?
刚读到谷歌宣布对新的网络编程语言 Dart 进行早期预览的新闻。dartlang.org上的文档指出:
你将能够以多种方式运行 Dart 代码:
将 Dart 代码翻译成可以在任何现代浏览器中运行的 JavaScript:Chrome、Safari 5+ 和 Firefox 4+(即将推出更多浏览器支持)。
直接在服务器端的虚拟机中执行 Dart 代码
使用 Dartboard 在任何浏览器窗口中编写、修改和执行小型 Dart 程序
我很好奇是否已经有 VM 可用于运行 Dart 代码?无论如何都找不到它,也许它可以通过一些 beta 程序获得?
multithreading - 搜索良好的嵌入式和托管语言对
我正在寻找两种(一种?)语言。其中一个是主机,能够运行一些“环境”,第二个是可以用来编写在该环境中运行的“代理”的脚本。
一些细节:
主机应该能够运行多个“代理”(嵌入式语言线程),理想情况下能够限制每个线程一次执行的指令数量(尽管欢迎更复杂的控制方式)
嵌入式线程应该只能访问主机显式公开的对象
嵌入式线程应该被隔离。没有共享内存,所有通信都通过主机进行
嵌入式语言应该相当简单,具有动态类型
托管语言应该是相当高级的
性能不是主要问题
我在考虑 Python 是嵌入 Lua 的主机,例如Lunatic Python或一些 JVM 语言(Scala / Groovy ?),但我不确定嵌入式线程真正隔离的可能性(参见 2、3)。所以我正在寻找任何想法、框架、成功的实现等......
compiler-construction - 我可以在 Linux 上使用已安装的 parrot-devel 包中的 Parrot 编译器工具吗?
我有兴趣使用 Parrot VM 创建自己的语言。
我已经安装了 parrot-devel 包以及 parrot 和依赖项(使用 Linux Mint 11 下的 Synaptic 包管理器)。
我找到了一个教程(http://en.wikibooks.org/wiki/Parrot_Virtual_Machine/Squaak_Tutorial/Introduction)说要运行:
我最终在 /usr/lib/parrot/2.6.0/tools/dev/mk_language_shell.pl 找到了该脚本
这是我运行它时发生的事情:
现在我不知道包是否将这些文件放在正确的位置。我可以在它前面放一个“sudo”(?),但这可能忽略了我如何安装鹦鹉的一个真正问题。
问题:
我可以从我安装的这些包中使用 Parrot 编译器工具吗(而不是卸载包、克隆 git 存储库、学习如何从源代码制作 parrot 等)?
如果是这样,需要什么进一步的准备才能真正开始使用这些工具而不会出错?
lisp - 对 8 位系统上类似 lisp 语言的 VM 感兴趣
我正在寻找可以在 8 位微处理器上运行并支持动态语言的推荐虚拟机。我想要一个 VM 解决方案,因为我认为在代码密度、可移植性和拥有更小的解释器的能力方面有好处,从而为更大的程序留出了更多空间。
我的目标是在 6502 微处理器之类的东西上运行一个完整的 LOGO 解释器,遵循“Apple II 的 LOGO”语法。
我已经看到对PyMite、Java“微型版”的引用,当然现在可以使用 1970 年代的 UCSD p-System 源。
欢迎提出建议。
language-agnostic - 为什么基于寄存器的虚拟机优于基于堆栈的虚拟机?
为什么基于寄存器的虚拟机优于基于堆栈的虚拟机?
具体来说,在Parrot VM 的文档中,设计者解释了注册机的好处:
[...] 许多高级语言程序由嵌套的函数和方法调用组成,有时使用词法变量来保存中间结果。在非 JIT 设置下,基于堆栈的 VM 将多次弹出然后推送相同的操作数,而基于寄存器的 VM 将简单地分配正确数量的寄存器并对其进行操作,这可以显着减少操作量和 CPU 时间。
但是为什么相同的操作数被推了很多次?
android - Dalvik VM 如何在方法调用之间保存和恢复其寄存器?
从语义上讲,Dalvik VM 对每个方法都有一组新的寄存器,并且没有访问调用堆栈的指令。但就其实现而言,寄存器应该在方法调用时以某种方式保存,并在方法返回时恢复。Dalvik(谷歌的实现)如何做到这一点?