2009-07-30 51 views
28

在最近問到的一個問題中,我的簡單回答突出了我對Java,JVM以及代碼如何編譯和運行的誤解。這使我想要把我的理解降到更低的層次。對於像彙編這樣的低層次理解,我沒有任何問題,字節碼和JVM如何混淆我。面向對象的代碼如何在低級別上被分解,這一點在我看來是失敗的。我想知道是否有人對如何瞭解Java的JVM,字節碼和底層功能有任何建議。是否有任何實用程序允許您直接編寫和運行字節碼,因爲我相信通過使用某些東西獲得經驗是增加理解它的最佳途徑?此外,並閱讀關於這個主題的建議,將不勝感激。瞭解Java字節碼和JVM

編輯:次要問題。因此,我有一個小問題,答案給了我一個有趣的想法,以瞭解jvm,只用一種可讀的語法編寫一個非常簡單的語言(如brainf ** k或ook)的合理性(也許我甚至可以開發它最終支持oo)編譯成字節碼是?這會是一個很好的學習經歷嗎?

+2

+1給了brainf ** k爲屬性'簡單';-) – 2009-07-30 15:40:33

+0

我猜「簡單」是用在一個小複雜度的意義上,並非易用性;) – SasQ 2015-06-09 21:31:55

回答

29

建議閱讀:the JVM spec

您可能還想玩BCEL--還有其他庫可以用來操作字節碼,但這可能是最知名的。

+0

我不知道這樣的規範甚至存在。這真的很有幫助。 – 2009-07-30 15:08:00

11

Apache BCEL將允許您分析和處理來自字節碼的.class文件。

javap將允許您反彙編現有的.class文件。這對於打開快速測試課程來理解封面下面的真實情況特別有用。

1

瞭解Java/JVM的架構:閱讀Wikipedia,規格和源代碼。

對於理解面向對象的代碼是如何在低級別完成:嘗試模仿像繼承/多態性/封裝功能,像C.

一個低級語言在C語言中,你可以通過實現上述目標,例如,函數指針和嵌套結構的組合。

+0

我真的很喜歡這第二個建議。我想我可能不得不試圖想出一個優雅的方式來做到這一點。我知道一些真正複雜的多態和繼承,但他們都是真正低效率的技術,我可能不會真正算作模擬功能。 – 2009-07-30 15:00:16

+0

在C語言中添加了更多關於這樣做的信息。當你對語言有很好的理解以及指針如何工作時,實際上並不難。 – 2009-07-30 16:06:10

+0

@MikeMcQuaid:在C中實現閉包怎麼樣? – SasQ 2015-06-09 21:38:02

3

我通過閱讀the ASM tutorial瞭解到,並且對圖書館本身進行了諷刺。

恕我直言,ASM比BECL好。

BCEL已被使用 成功的幾個項目,如 編譯,優化, 混淆器,代碼生成器和 分析工具。 不幸的是, 在過去幾年沒有太多的發展 。請隨時致電 幫忙或您可能想要 查看ASM項目 objectweb。 - http://jakarta.apache.org/bcel/

+3

ASM項目:http://asm.ow2.org/ – sova 2010-12-16 07:07:21

+0

如果你真的想手動編寫字節碼,Krakatau比ASM好得多。 – Antimony 2013-08-04 16:26:56

+0

對不起,鏈接'ASM教程'已經死了 – zionpi 2013-08-28 12:33:06