2017-03-05 129 views

回答

3

這是一個由Sasada Koichi編寫的稱爲YARV的字節碼解釋器。

下面是它的外觀一個例子:

puts RubyVM::InstructionSequence.compile("1+1").disasm 
== disasm: #<ISeq:<compiled>@<compiled>>================================ 
0000 trace   1            ( 1) 
0002 putobject_OP_INT2FIX_O_1_C_ 
0003 putobject_OP_INT2FIX_O_1_C_ 
0004 opt_plus   <callinfo!mid:+, argc:1, ARGS_SIMPLE>, <callcache> 
0007 leave 

延伸閱讀:

雖然MRI沒有JIT的是,有紅寶石+ OMR項目,這是試圖添加一個JIT編譯器基於Eclipse OMR

+0

哇!十分有趣!我不知道它是從語言本身提供的。 – user6245072

+0

我剛剛爲你添加了一些信息:-) –

+0

我仍然不明白字節碼解釋器和JIT編譯器之間有什麼區別。剛剛在軟件工程中問了一個關於它的問題。感謝您的回答! – user6245072

5

注:術語 「MRI」 令人困惑。它的意思是「Matz的Ruby /參考實現/解釋器」。但是,MRI已經退休,不再開發或維護。

MRI是一個純粹的AST行走解釋器,沒有編譯涉及任何地方。

令人困惑的是:Matz寫了一個新的實現,但這叫做MRuby,而不是MRI。而實際上是現在叫做MRI不是由Matz寫的。所以,最好不要使用這個術語,而要具體說明你正在談論的是哪個實現。

人們現在稱爲MRI的實現名稱實際上是YARV(另一個Ruby VM),它由Koichi Sasada編寫。它由一個將Ruby源代碼編譯爲YARV字節碼的前期編譯器和一個解釋所述字節碼的解釋器組成。因此,它是一個完全典型的字節碼VM,與Python的CPython,PHP的Zend Engine,Lua VM,Rubinius的舊版本,ECMAScript的SpiderMonkey的舊版本等等完全相同。

有一個關於將YARV字節碼中的JIT編譯器添加到本地機器代碼到YARV 3的VM的討論,然後YARV 3將使該VM成爲混合模式執行引擎。

Matz目前的實現MRuby也是一個字節編碼的虛擬機。

爲了完整性,這裏有一些其他的Ruby實現的,首先是目前生產就緒的,然後一對夫婦的歷史意義的國家:

  • 了Rubinius:編譯Ruby源代碼Rubinius的字節然後將字節碼轉交給由字節碼解釋器和基於LLVM的JIT編譯器組成的混合模式執行引擎;他們最近引入或正在爲JIT編譯器引入單獨的中間代理(IR),因此解釋器使用Rubinius字節碼,但JIT編譯器在編譯器IR中運行。 Rubinius也屬於「歷史上有趣的」類別,因爲它是第一個成功的Ruby實現,其中很大一部分是在Ruby中實現的;之前還有其他項目,但Rubinius是第一個可以投入生產的項目。
  • JRuby:主模式是一個混合模式執行引擎,由一個AST行走解釋器和一個JIT編譯器組成,它首先將AST轉換爲IR,然後再將它編譯爲JVM字節碼。另一種模式是提前將Ruby源代碼編譯爲JVM字節碼的AOT編譯器。
  • Opal:一種將Ruby源代碼編譯爲ECMAScript源代碼的前期編譯器。
  • MagLev:基於GemStone/S Smalltalk VM的實現。不幸的是,我不太瞭解它,我相信它將Ruby源代碼編譯爲GemStone/S字節碼,然後GemStone/S VM是一個帶有字節碼解釋器和JIT編譯器的標準混合模式VM。

一些不再保持,但歷史上有趣的實現:

  • 黃玉:使用RPython/PyPy VM框架的實現; PyPy框架很有趣,因爲它包含跟蹤JIT編譯器,與其他JIT編譯器不同,除了解釋器並編譯用戶程序,而是在解釋用戶程序時編譯解釋器。這基本上意味着JIT只能由PyPy開發人員編寫一次,每個使用PyPy框架的語言實現者只需編寫一個簡單的字節碼解釋器就可以免費獲得一個優化的本機JIT編譯器。
  • XRuby:Ruby的第一個靜態AOT編譯器,爲JVM實現。 IronRuby:它開始時是一個沒有解釋器的純JIT編譯器,但後來又添加了一個解釋器,因爲事實證明,這實際上改進了的性能(這與解釋器速度較慢的流行神話相反)。 unholy:概念驗證的AOT編譯器,它將YARV字節碼編譯爲CPython字節碼;這被Google的App Engine首次推出並且只支持Python時的幸運僵局所破壞,它的想法是,您可以使用YARV將Ruby源代碼編譯爲YARV字節碼,使用unholy將YARV字節碼編譯爲CPython字節碼,編譯將CPython字節碼轉換爲使用反編譯的Python源代碼,然後將Python源代碼上傳到GAE以運行您的閃亮的新Ruby應用程序。
  • 榮譽獎去:tinyrb,metaruby,Ruby.NET,紅太陽,HotRuby,BlueRuby,SmallRuby

幾個有趣的目前的研究項目有:

  • 的JRuby +松露:此項目正在使用Oracle Labs的Truffle AST解釋器框架重新實現JRuby的內部構件;這個版本在啓用Graal的JVM(另一個Oracle Labs研究項目)上運行時,能夠獲得與Java相似的性能,有時甚至達到(並超過)C。
  • Ruby + OMR:IBM打破了其J9 JVM轉換爲可獨立重用的,獨立於語言的VM實現者構建塊,並在Eclipse開放源代碼許可證下作爲Eclipse Open Managed Runtime發佈。這不是一個學術項目:IBM J9的Java 8版本實際上是使用OMR實現的。 Ruby + OMR項目是OMR開發人員的概念驗證,用OMR代替YARV的垃圾回收器,並將OMR的JIT編譯器,分析器和調試器添加到YARV中。這是相當令人印象深刻的如何語言無關的所有東西真的是,整個補丁小於10000行,這不僅是膠水代碼,它實際上包括所有所需的OMR組件。(還有一個等價的Python + OMR項目,但是這仍然非公開)

最後但並非最不重要的,你有時會聽到關於「禮」。 Rite被用作十多年來完全重寫MRI的代號。 Matz說,當他寫MRI時,他實際上並不知道語言實現的任何內容,所以他想第二次「正確」(得到它?)。與此同時,還有很多關於Ruby 2.0的討論,希望解決語言中一些長期存在的設計缺陷。這兩者被集中在一起,所以Rite被稱爲Ruby 2.0的新實現。然而,YARV出現了,並且非常好,Matz決定他不需要寫自己的VM,他基本上決定「YARV是Rite」。

但現在,他確實編寫了自己的虛擬機,這就是爲什麼你有時會聽到MRuby(或其VM組件)被稱爲「Rite」。