问题标签 [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 回答
314 浏览

programming-languages - 哪些编程语言可以让我操纵方法中的指令序列?

我有一个即将到来的项目,其中一个核心要求是改变方法在运行时的工作方式。请注意,我不是在谈论更高级别的 OO 概念,例如“一种方法与另一种方法的影子”,尽管实际效果是相似的。

我追求的关键属性是:

  • 我必须能够修改方法,以便添加新表达式、删除现有表达式或修改其中发生的任何表达式。

  • 修改方法后,对该方法的后续调用将调用新的操作序列。(或者,如果语言绑定方法而不是每次都评估,请为我提供一种取消绑定/重新绑定新方法的方法。)

  • 理想情况下,我想操作语言的原子单元(例如,“foo在对象上调用方法bar”)而不是直接操作程序集(例如“将这三个参数弹出到堆栈上”)。换句话说,我希望能够高度确信我构造的操作在语言中具有语义意义。但我会拿走我能得到的。

如果您不确定候选语言是否符合这些标准,这里有一个简单的试金石:

你能写另一种方法吗clean

  • 接受一个方法m作为输入

  • 返回另一个m2执行相同操作的方法m

  • 是否m2与 相同m,但不包含对您的语言中的 print-to-standard-out 方法的任何调用(puts、System.Console.WriteLn、println 等)?

我现在想做一些初步研究,找出最强的候选人是什么。拥有一个庞大而活跃的社区对我来说与实现我想做的事情的实用性一样重要。我知道这里可能有一些未伪造的领域,因为直接操作字节码通常不是需要公开的操作。

我有哪些选择?如果可能,您能否提供一个使用您推荐的一种或多种语言的玩具示例,或者指向我最近的一个示例?


更新:我这样做的原因是我想编写一个能够在运行时修改自身以响应新信息的程序。这种修改超越了单纯的参数或可配置数据,而是全面的、进化的行为变化。(不,我不是在写病毒。;))

0 投票
1 回答
386 浏览

functional-programming - 在每种语言基础上的 JVM 中选择加入尾调用支持?

虽然看起来不会将尾调用优化作为一种​​常见的优化技术添加,尤其是在 Sun 被收购之后,但从技术上讲,让运行在 VM 上的语言决定它们的编译器是否tailcall在字节码?

例如。Java、Groovy 可以决定不使用该指令,而 Scala 或 Clojure 等更多功能语言可以发出它,HotSpot VM 只会优化标有tailcall?

0 投票
7 回答
8545 浏览

c - 用 C 语言实现的干净、独立的 VM,编译代码大小在 100-200K 之间?

我正在寻找具有以下功能的虚拟机:

  • 编译后的代码占用空间小(低于 200K)。
  • 没有外部依赖。
  • Unicode(或原始)字符串支持。
  • 干净的代码/组织良好。
  • C(99) 代码,而不是 C++。
  • 类似 C/Java 的语法
  • 运算符/按位:AND/OR 等。
  • 线程支持。
  • 通用/便携式字节码。字节码应该可以在不同的机器上工作,即使它是在具有不同字节序等的不同架构上编译的。
  • 准系统,没有什么花哨的必要。只有基本的语言支持。
  • 词法分析器/解析器和编译器与 VM 分开。我将把虚拟机嵌入到一个程序中,然后独立编译字节码。

到目前为止,我已经回顾了LuaSquirrelNekoPawnIo、 AngelScript ......唯一一个有点接近规范的是 Lua,但语法很糟糕,它没有按位支持,而且代码风格一般很烂。Squirrel 和 IO 大多是巨大的。Pawn 是有问题的,它很小,但是字节码不是跨平台的,并且实现有一些严重的问题(例如,字节码根本没有经过验证,甚至标头 AFAIK 也没有)。

我很想在那里找到一个合适的选择。

谢谢!

更新: Javascript 解释器是……解释器。这是基于字节码的 VM 的 VM 问题,因此需要编译器/字节码 vm 分离。JS 是解释型的,很少由 JIT 编译。我不一定要 JIT。此外,目前所有的 ECMAScript 解析器都很小。

0 投票
1 回答
1342 浏览

compiler-construction - 将 LLVM/CLANG 用于自定义字节码 VM 的程序的大小是多少?

我正在评估自定义 VM 的不同可能性,并在另一个问题中省略了 LLVM。由于我仍在评估嵌入式语言 VM,因此我现在无法自己测试/检查。我想知道有关 LLVM/CLANG 的以下信息:

  • 它在 Windows 上是否得到很好的支持?还是索拉里斯?(跨平台对我来说是一个加分项)
  • 如果我想用类 C 语言编写自己的/自定义 VM,我需要在项目中包含什么?(LLVM/CLANG 部分或组件等)
  • 出于显而易见的原因(不编写解释器),我会将编译器与 VM 分开。所需组件的大小是多少?我可以在程序中构建它们而不是动态链接到它们吗?
  • 我可以避免 JIT 吗?我想要一个字节码虚拟机,它不一定会转换为本机代码。这在平台不支持 JIT 时会有所帮助(例如,具有限制内存权限且不允许 wx/rwx 内存映射的系统)。

例如,我知道 clamav 防病毒软件使用由 LLVM/clang 支持的字节码来支持动态/运行时签名。但是,我不知道是否有现成的工具来实现这个和/或指导您完成实现这样一个事情的过程的教程或文档。

谢谢!:)

0 投票
3 回答
180 浏览

java - 使用 Java VM,如何处理对象引用

在 Java 应用程序的执行过程中,对象引用是由运行时使用还是在编译时被剥离?

我想我可以反编译类文件,看看它们是如何用作局部变量和成员变量的。

当您不需要时创建对象引用是浪费还是编译器会删除不需要的引用?

例如

最终字符串 abc = "abc"; 方法(ABC);

相对于:

方法(“ABC”);

0 投票
4 回答
1173 浏览

compiler-construction - 机器代码是否需要运行时环境?MoSync SDK

谁能解释MoSync的运行时架构?

VM Core 不是问题。我认为它是在 java vm 中运行并逐行解释代码的虚拟机。

但是 Recompiler Core 是如何工作的呢?那是一种在本机代码中运行时编译应用程序的 Ahead-Of-Time 编译器吗?但是后来我看不懂图片。或者我是否可能需要运行时的其他模块,即使它是机器代码?

谢谢

0 投票
2 回答
1143 浏览

python - 在 x86 上以汇编方式实现的虚拟机

我只是想知道这里是否有人写过或知道在哪里可以找到用 x86 程序集编写的简单虚拟机,最好是 Fasm,但只要它简单或至少有很好的注释,任何东西都可以作为示例。先感谢您。

0 投票
6 回答
7589 浏览

parsing - 自定义编程语言:如何?

希望这个问题不会太复杂或模糊。我知道我想在我的脑海里,所以交叉手指我可以在文本中理解这一点。

我正在寻找一种具有我自己的规范语法的语言,所以我假设我需要自己创建一个。在过去的几天里,我一直在阅读有关编译器、词法分析器、解析器、汇编语言、虚拟机等方面的内容,并且我正在努力根据实现目标所需的内容来整理所有内容(文件附在底部一些规格)。从本质上讲,我对具体需要使用哪些工具来前进感到非常困惑。

一点背景知识:制作的语言有望用于实现基于文本的多人 MUD 服务器。因此,它需要简单的内置功能来创建/维护客户端 TCP/IP 连接、非阻塞 IO、通过 SQL 或类似方式访问数据库。我也对安全性感兴趣,因为我不希望为这种语言编写的代码在没有专业软件的情况下被普通公众窃取和使用。这可能意味着它应该编译为目标代码

那么,创建符合这些规范的语言的最佳选择是什么

我的结论如下。这只是我最有根据的猜测,所以如果你认为我走错了方向,请与我竞争。我主要只是为了看看当专家来发表评论时我有多困惑。

  1. 为了代码安全,我应该想要一种可以在虚拟机中编译和运行的语言。如果我这样做,我将有很多工作要做,不是吗?自己写一个虚拟机,汇编语言在底层,然后在高层,代码库自己处理IO,sockets等,而不是使用现有的模块?

  2. 我只是很困惑。

  3. 我不确定我是否有道理。

如果有人可以让我的大脑平静一点,我将由衷地感激!或者,如果我偏离了路线并且有更简单的方法可以做到这一点,请告诉我!

0 投票
1 回答
195 浏览

c# - C++ - 如何消除宏?(将应用程序移植到 ie c# 中)

我创建了简单的虚拟机,并且为了创建指令字节和开关,我使用 c++ 宏,它看起来像这样(这是简化的示例):

然后有一个巨大的开关:

你怎么能看到有很多代码毫不费力地生成(只有 10 种类型的变量 - 8 个整数和 2 个浮点数 - 以及 4 个函数,它的 10*10*4 行代码),但将来我想移动它是不支持宏的语言(我在考虑 c# 或 Java)。我想出的唯一想法是制作代码生成器,它将生成代码以粘贴到 vm 代码中,但是代码将不可读,并且很难更改和维护。也许你有一些很棒的想法要分享?:)

0 投票
3 回答
2203 浏览

smalltalk - What's the difference of Squeak/Pharo/Newspeak Smalltalk VMs?

I saw 3 different VMs while learning about Smalltalk. They are Squeak/Pharo/Newspeak. What's the difference between them?