2011-03-12 97 views
20

我正在寻找一个虚拟机具有以下特点:用C语言实现并且编译代码大小在100-200K以下的干净的独立VM?

  • 小编译代码足迹(下200K)。
  • 没有外部依赖性。
  • Unicode(或原始)字符串支持。
  • 清洁代码 /组织良好。
  • C(99)代码,NOT C++。
  • C/Java-like syntax
  • 运算符/位:AND/OR等
  • 线程支持。
  • 通用/便携式字节码。字节代码应该可以在不同的机器上工作,即使它是在不同的架构上编译,具有不同的字节顺序等。
  • 准星,没什么奇特的必要。只有基本的语言支持。
  • 与VM分开的Lexer /解析器和编译器。我将在程序中嵌入虚拟机,然后独立编译字节码。

到目前为止,我已经审核LuaSquirrelNekoPawnIo,AngelScript,而哪些谈到有点接近规范是Lua中,但语法是可怕的只有一个,它没有按位支持和代码风格通常很糟糕。大多数松鼠和IO是巨大的。典当是有问题的,它很小,但字节码不是跨平台的,并且实现有一些严重的问题(前字节码根本没有验证,甚至没有头AFAIK)。

我很想找到一个合适的选项。

谢谢!

更新: Javascript口译员是......口译员。这是一个基于字节码的虚拟机的VM问题,因此是编译器/字节码虚拟机分离的要求。 JS被解释,并且很少被JIT编译。我不需要JIT。而且,目前所有的ECMAScript解析器都很小。

+5

“的语法是可怕的”不作为猜测你确实是想要什么样的语言非常有帮助。 – 2011-03-12 01:01:36

+1

@larsmans:他声明他在寻找什么样的语言:“C /类Java语法” – 2011-03-12 01:05:13

+0

正如我所说的,C/Java类语法。老实说,我不需要类继承/复杂的OO支持,但是Lua的语法是一个破坏者。我希望对来自C或Java背景的开发人员有吸引力。与Pawn/Squirrel的语法类似,上述“额外糖果”无效。 – soze 2011-03-12 01:05:25

回答

2

终于在这段时间没有真正的答案。我结束了分叉LUA。截至今天没有自包含虚拟机上面的要求存在......这是一个遗憾;(

然而,典当是相当不错,如果只有代码是不是那种问题

+5

你的Lua叉子是免费的吗?或者你能分享你制作的MOD吗? – lhf 2011-05-10 12:26:09

+0

Soze,我也会对此感兴趣 – Blub 2012-11-06 12:55:38

+1

根据各自的站点:Lua源代码包含大约20000行C,在Linux下,使用所有标准Lua库构建的Lua解释器需要182K,Lua库需要243K。 Squirrel编译器和虚拟机一起装入大约7k行的C++代码,并且只增加大约100kb-150kb的可执行文件大小。那么你为什么说松鼠是'巨大的'? – 2013-03-01 00:24:46

-1

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

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

+0

SpiderMonkey的不与我公司提供的标准资格 – soze 2011-03-12 01:24:38

+0

@soze。哪些错过? – 2011-03-12 01:26:37

+0

如果你读了SpiderMonkey的功能集和它的要求,你会发现它不是一个字节码VM,肯定远远超过在编译后的代码大小200K,字节码编译器(之间没有任何间隔,因为有没有......这是一个代码语法/词法分析器实现),它不是准系统,用例完全不同。 – soze 2011-03-12 01:32:55

6

你说你已经回顾NekoVM,但没有提到为什么它不适合你。

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

+0

这取决于我想避免的Boehm GC(“没有外部依赖性”)在我的评论中,alloc.c中的API似乎不是微不足道的以取代某些东西此外,据我所知,Boehm GC的tinygc版本不支持必要的API:( – soze 2011-03-12 03:40:36

+0

由于NekoVM的嵌入式语言看起来很像Javascript,因此使用Google V8而不是NekoVM是明智之举。使用V8(node.js)考虑文档,支持和现有虚拟机 – Tim 2013-01-17 14:22:27

+1

@Tim V8不满足OP的其他要求,它是用C++编写的,并且具有更大的(4MB)编译代码大小 – ephemient 2013-01-17 20:15:46

1

尝试EmbedVM

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

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

这里是一些代码,一个猜谜游戏的例子,编译器以C使用lex + yacc的:

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位微控制器。

+0

不幸的是没有UTF-8支持等等。虽然虚拟机本身非常好。 – soze 2015-08-13 11:22:16

1

对于一些很“准系统”:

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

更简短的介绍比什么都重要的话题,理所当然的。

然而,它可能至少满足这几个方案的期望标准:

  • 小编译代码足迹(200K以下)...检查,很明显;
  • 没有外部依赖项...检查;
  • 干净的代码/组织良好...检查;
  • C(99)code,NOT C++ ... check;
  • C /类似Java的语法...检查。
+0

不在范围内。 C是所需的语法,而不是实现语言。 – soze 2015-08-13 11:23:09

0

选项是使用最小化并扩展它。 mini-vm是200行以下的代码,包括注释,它有一个自由许可证(MIT),它是用C语言编写的。开箱即用,它支持0个操作,但它很容易扩展。包含的示例编译器只是一个简单的计算器。但人们可以轻易想象添加比较,分支机构,内存访问和管理员调用以将其带到想要去的地方。一个易于扩展的虚拟机对于开发特定于领域的语言特别有用,并且拥有多种语言来定位您的mini-vm的风格将是非常直接的,除了必须实现多个编译器(或者将它们移植到端口之外,QuakeC编译器仅仅是lcc,并且很容易重定向)。

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

我在跳过回答语言的要求,因为问题开始要求准系统虚拟机。但同时要求C/Java像语法,不知道如何解决冲突,而不是说明这种冲突。

2

JerryScript

  • 需要小于64 KB的RAM
  • 〜160 KB二进制大小
  • 写入C99
  • VM基于
  • 具有字节代码预编译

IoT JavaScript胶水JerryScript与libuv(nodejs风格) - 它可能更容易玩。

线程可能不是有你想要的状态。最近在ECMAScript中添加了围绕单独线程和共享,跨线程缓冲区的后台工作人员 - 不知道JerryScript中有什么故事 - 可能还没有,但是谁知道 - 他们有一个如何去做的蓝图,可能不远。