22

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

  • 编译后的代码占用空间小(低于 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 解析器都很小。

4

7 回答 7

6

您说您已经审查过NekoVM,但不要提及为什么它不适合您。

它是用 C 而不是 C++ 编写的,VM 低于 10kLOC,编译后的大小约为 100kB,编译器是一个单独的可执行文件,可生成可移植字节码。该语言本身具有类似 C 的语法、位运算符,并且它不是线程敌对的。

于 2011-03-12T02:02:42.820 回答
3

最后,经过这么长时间,没有一个答案真正做到了。我最终分叉了LUA。截至今天,不存在具有上述要求的独立虚拟机......很遗憾;(

尽管如此,Pawn 还是相当不错的,只要代码没有问题。

于 2011-04-28T05:17:37.283 回答
3

杰瑞脚本

  • 需要少于 64 KB 的 RAM
  • ~160 KB 二进制大小
  • 用 C99 编写
  • 基于虚拟机
  • 有字节码预编译

IoT JavaScriptJerryScript与 libuv(nodejs 风格)粘合在一起——它可能更容易使用。

线程可能不在您想要的状态。ECMAScript 最近在不同线程和共享的跨线程缓冲区中添加了关于后台工作人员的内容 - 不确定JerryScript中它的故事- 可能还没有,但谁知道 - 他们有一个如何做到这一点的蓝图,可能不远。

于 2017-04-12T15:43:06.320 回答
1

试试嵌入虚拟机。

http://www.clifford.at/embedvm/

http://svn.clifford.at/embedvm/trunk/

这是一些代码的示例,一个猜谜游戏。编译器是用 lex+yacc 用 C 构建的:

global points;

function main()
{
    local num, guess;
    points = 0;
    while (1)
    {
        // report points
        $uf4();

        // get next random number
        num = $uf0();
        do {
            // read next guess
            guess = $uf1();
            if (guess < num) {
                // hint to user: try larger numbers
                $uf2(+1);
                points = points - 1;
            }
            if (guess > num) {
                // hint to user: try smaller numbers
                $uf2(-1);
                points = points - 1;
            }
        } while (guess != num);

        // level up!
        points = points + 10;
        $uf3();
    }
}

没有任何线程支持。但是虚拟机中没有全局状态,所以很容易在同一个进程中运行多个副本。

API 很简单。通过回调访问 VM RAM。您的主循环重复调用embedvm_exec(vmdata),它执行单个操作并返回。

VM 占用空间很小,已用于 8 位微控制器。

于 2012-04-10T19:16:49.120 回答
1

对于一些非常“准系统”的东西:

http://en.wikibooks.org/wiki/Creating_a_Virtual_Machine/Register_VM_in_C

授予的,更多的是对该主题的简短介绍。

然而,它可能至少满足以下几个所需的标准:

  • 编译后的代码占用空间小(低于 200K)... 很明显,检查一下;
  • 没有外部依赖...检查;
  • 干净的代码/组织良好的...检查;
  • C(99) 代码,而不是 C++ ...检查;
  • 类似 C/Java 的语法...检查一下。
于 2014-04-14T09:44:36.213 回答
0

选项是使用最小的东西并扩展它。mini-vm代码不到 200 行,包括注释,它有一个自由许可证 (MIT),它是用 C 编写的。开箱即用它支持 0 操作,但它很容易扩展。包含的示例编译器只是一个简单的计算器。但是可以很容易地想象添加比较、分支、内存访问和主管调用以将其带到您想去的地方。易于扩展的虚拟机对于开发特定领域的语言特别有用,并且让多种语言针对您的 mini-vm 风格将是直接的,而不必实现多个编译器(或移植它们。QuakeC 编译器只是 lcc,并且很容易重新定位)。

线程支持必须是一个扩展,核心 VM 在多处理器 pthread 场景(重量级线程)中不能很好地发挥作用。奇怪的是,mini-vm 每个重量级线程可以有一个 pc(程序计数器),但会在使用相同上下文的所有线程之间共享寄存器。不过,运行单独的上下文将是线程安全的。

我跳过了对语言要求的回答,因为问题开始于要求一个准系统 VM。但同时需要类似 C/Java 的语法,除了说明这个冲突之外,不知道如何解决这个冲突。

于 2017-03-04T01:54:40.397 回答
-1

尝试在代码中嵌入 JavaScript 解释器。

http://www.mozilla.org/js/spidermonkey/

于 2011-03-12T01:18:14.067 回答