2011-03-12 104 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中有什麼故事 - 可能還沒有,但是誰知道 - 他們有一個如何去做的藍圖,可能不遠。