2009-12-29 126 views

回答

2

不與MRI解釋器,沒有。

一些較新的虛擬機正在處理桌面上的位置,但這些虛擬機在這一點上並未廣泛使用(甚至無法使用)。

3

儘管Ruby的1.9 YARV VM是一個字節碼編譯器,但我不認爲它可以將字節碼轉儲到磁盤。你可能想看看替代編譯器Rubinius,我相信它有這個能力。你應該注意到,雖然這個字節碼pyc文件(和我想象的紅寶石等價物)可以很容易「反編譯」。

38

我在這個問題寫了much more detailed answer to this questionCan Ruby, PHP, or Perl create a pre-compiled file for the code like Python?

答案是:這取決於。 Ruby 語言沒有關於編譯爲字節碼和/或運行字節碼的規定。它也沒有指定字節碼格式。原因很簡單:如果語言實現者被迫使用特定的字節碼格式,或者甚至是字節碼,那麼語言實現者就會受到太多的限制。例如,XRuby和JRuby編譯爲JVM字節碼,Ruby.NET和IronRuby編譯爲CIL字節碼,Cardinal編譯爲PAST,SmallRuby編譯爲Smalltalk/X字節碼,MagLev編譯爲GemStone/S字節碼。對於所有這些實現,使用任何其他字節碼格式都比他們當前使用的字節碼格式簡單愚蠢,因爲它們的整個要點與使用相同字節碼格式的其他語言實現進行互操作。

Simlar for MacRuby:它編譯爲本地代碼,而不是字節碼。同樣,使用字節碼會很愚蠢,因爲其中一個目標是在iPhone上運行Ruby,這幾乎需要本地代碼。

當然還有MRI,它是一個純粹的AST行走腳本解釋器,因此沒有字節碼格式。

這就是說,有一些紅寶石實現它允許編譯和加載字節碼。例如,Rubinius允許這樣做。 (的確,具有,因爲它的Ruby編譯器是用Ruby編寫的,所以編譯器必須先編譯爲Rubinius字節碼,以解決Catch-22的問題。)

YARV也可以保存並加載字節碼,儘管加載功能目前被禁用,直到實現字節碼驗證程序,該字節碼驗證程序阻止用戶加載可能崩潰或以其他方式破壞解釋程序的操作字節碼。

但是,當然,它們都有自己的字節碼格式,並且不理解對方的(也不是tinyrb或RubyGoLightly的...)。另外,這些格式都不能被JVM或CLR理解,反之亦然。不過,正如Mark指出的那樣,總是可以反向設計字節碼,特別是在像CPython,PyPy,Rubinius,YARV,tinyrb,RubyGoLightly這樣的情況下,字節碼格式是特別的旨在與源語言非常接近。

一般來說,以這種方式保護代碼是不可能的。原因很簡單:您希望機器能夠執行代碼。 (否則,首先要寫什麼?)但是,爲了執行代碼,機器必須瞭解的代碼。由於機器比人類笨多了,因此任何機器可以理解的代碼都可以被人理解,不管代碼是以源代碼形式,字節碼,彙編,本地代碼還是打卡卡組。

只有一個可行的技術解決方案:如果您控制整個執行管道,即構建您自己的CPU,您自己的計算機,您自己的操作系統,您自己的編譯器,您自己的解釋器等,並使用強大的加密保護所有這些,然後只有然後可能你能夠保護你的代碼。但是,例如,微軟發現了Xbox 360的困難之處,即便是這樣做,並僱傭了這個星球上一些最聰明的密碼學家和數學家,但並不能保證成功。

唯一真正的解決方案是不是一個技術問題,而是一個社會一個:只要你寫你的代碼,它是自動受版權法充分保護,無需你做一個單一的東西。而已。您的代碼受到保護。

+0

工具部署在Apache Tomcat或JBoss是有沒有字節相關的服務表現的影響/成本代碼生成? – 2011-07-05 18:31:54

+0

@ Myth17:理論上是的,但在實踐中,它幾乎完全可以忽略不計。 – 2012-02-23 08:47:13

+0

在iPhone上運行Ruby不是MacRuby的目標之一 - 因此,名稱** Mac ** Ruby。對於iOS開發,有許多同樣的人開發的[RubyMotion](http://www.rubymotion.com/)。 – anthropomorphic 2013-08-23 15:55:09

0

如果你使用JRuby中,你可以編譯Ruby代碼轉換成Java的.class文件(包括你的Rails的東西)與執行這些(開放) jdk開箱!

你甚至可以編譯完成的東西變成一個.war文件與一個名爲「鶯」

https://rubygems.org/gems/warbler/

相關問題