在Python中,如果我想給出一個沒有源代碼的應用程序,我可以將它編譯成字節碼.pyc,有沒有辦法在Ruby中做類似的事情?像Python一樣,可以將Ruby編譯爲字節碼嗎?
回答
不與MRI解釋器,沒有。
一些較新的虛擬機正在處理桌面上的位置,但這些虛擬機在這一點上並未廣泛使用(甚至無法使用)。
儘管Ruby的1.9 YARV VM是一個字節碼編譯器,但我不認爲它可以將字節碼轉儲到磁盤。你可能想看看替代編譯器Rubinius,我相信它有這個能力。你應該注意到,雖然這個字節碼pyc文件(和我想象的紅寶石等價物)可以很容易「反編譯」。
我在這個問題寫了much more detailed answer to this question 「Can 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的困難之處,即便是這樣做,並僱傭了這個星球上一些最聰明的密碼學家和數學家,但並不能保證成功。
唯一真正的解決方案是不是一個技術問題,而是一個社會一個:只要你寫你的代碼,它是自動受版權法充分保護,無需你做一個單一的東西。而已。您的代碼受到保護。
簡短的回答是 「YES」,
這將解決您的問題。
這裏是如何編譯Ruby代碼:
如果你使用JRuby中,你可以編譯Ruby代碼轉換成Java的.class文件(包括你的Rails的東西)與執行這些(開放) jdk開箱!
你甚至可以編譯完成的東西變成一個.war文件與一個名爲「鶯」
- 1. python distutils可以編譯CUDA代碼嗎?
- 2. 將字符串編譯爲Ruby字節碼以獲得更好的性能 - 就像Python中的compile()
- 3. 像asp.net一樣編碼PHP - 可能嗎?
- 4. perl可以像python一樣乘以一個字符串嗎?
- 5. 我可以在字節碼中編譯我的R包嗎?
- 6. 你可以像VB一樣嚴格地編譯VB.NET嗎?
- 7. 預編譯頭可以像庫一樣使用嗎?
- 8. 可以將ruby腳本預編譯爲二進制文件嗎?
- 9. 將整個Python標準庫編譯爲字節碼是否可行且可行?
- 10. 是否可以將LLVM字節碼轉換爲Java字節碼?
- 11. 可能反編譯R字節碼?
- 12. 我可以使用Xuggler將視頻/音頻編碼爲字節數組嗎?
- 13. 爲什麼python在解釋之前將源代碼編譯成字節碼?
- 14. ASP.NET MVC可以像Ruby on Rails一樣返回JavaScript響應嗎?
- 15. 可以像java jar文件一樣添加ruby gem/module嗎?
- 16. 是否有可能本機編譯Python(超越pyc字節碼)?
- 17. 試圖抓住C字節碼...... GNU/gcc可以生成像Clang/LLVM這樣的C字節碼嗎?
- 18. JavaScript字節碼編譯器?
- 19. 是否可以緩存JSP字節碼以避免重新編譯爲Tomcat?
- 20. php可以檢測4字節編碼的utf8字符嗎?
- 21. 我可以爲WinCE編譯Dalvik嗎?怎麼樣?
- 22. 我們可以讓ASP.NET MVC項目像ASP.NET 2.0一樣即時編譯嗎?
- 23. 是否有可能使用pypy將Java字節碼編譯爲本地代碼?
- 24. R像Python一樣編碼(「ord」和「chr」)
- 25. python在網絡上,它是否編譯爲字節碼或者它更像PHP?
- 26. 如何重新編譯Python 2.5字節碼爲2.7?
- 27. 使用Unicode字符集編譯的Windows應用程序可以使用編譯爲多字節的DLL嗎?
- 28. libpcap可以編譯爲iPhone/armv6嗎?
- 29. 可以Cython編譯爲EXE嗎?
- 30. 一個編譯器,編譯到達爾維克字節碼?
工具部署在Apache Tomcat或JBoss是有沒有字節相關的服務表現的影響/成本代碼生成? – 2011-07-05 18:31:54
@ Myth17:理論上是的,但在實踐中,它幾乎完全可以忽略不計。 – 2012-02-23 08:47:13
在iPhone上運行Ruby不是MacRuby的目標之一 - 因此,名稱** Mac ** Ruby。對於iOS開發,有許多同樣的人開發的[RubyMotion](http://www.rubymotion.com/)。 – anthropomorphic 2013-08-23 15:55:09