摘要:為什么要將字節碼翻譯為代碼字節碼是基于棧的一種編碼。最近在研究,由于的目的是對字節碼做優化,所以里面也有將字節碼翻譯為的邏輯。但是不明白為什么需要類型推導,目前我感覺將字節碼翻譯為完全不需要推導類型。
為什么要將Java字節碼翻譯為C代碼?
Java字節碼是基于棧的一種編碼。這種編碼方式十分方便解釋器的設計,但同時不利于程序分析,因此一些高效的代碼優化技術無法方便的Java字節碼上實現。
先大體說說Java字節碼的特點。目前版本的Java大概有200+的字節碼指令,其中大部分都是1字節指令,這也是為什么叫做字節碼。少部分指令是多字節或不定長指令。
對于解釋器來說,解釋指令時一般都是在操作兩個區域。一個是棧,一個是局部變量表。舉例來說,iload1指令,就是從局部變量表的1號槽位的數據放入操作數棧中,即*stack++ = locals[1]。
與C或者其他常用的編程語言不同的是,Java字節碼的操作數類型是隱含的,操作的類型的顯示的,而C語言中操作數類型都是顯示的,但是操作是多態的。比如“+”,在C語言中“+”兩邊的操作數類型可以是int型,可以是double。Java字節碼中iadd指令明確表示了要操作相加的兩個數一定是int型。但是當拋開iadd指令而直接觀測操作數棧時,并不知道棧上操作數的類型。
直接說結論。
Java字節碼在每一條指令執行時,操作數棧的深度,局部變量表的大小,以及它們上面的操作數類型都是可以確定的。而且,無論從何種路徑執行到某一條指令,操作數棧深度及操作數類型都是確定的[1]。Java虛擬機規范的4.10.2章節介紹了字節碼校驗的一個算法,可以參考。
以一個簡單的a=b+c的例子來說明這個翻譯過程。
對應的Java字節碼如下:
iload1 iload2 iadd istore1
我們可以暫時將操作數棧和局部變量表的每一個槽位看成一個局部變量。上面的代碼就翻譯為:
s0 = l1; s1 = l2; s0 = s0 + s1; l1 = s0;
其中局部變量的類型都是已知的。可以看到s0,s1跟Java操作數棧的功能一樣,是為了存放臨時的計算結果。上面的代碼完全可以化簡為“l1 = l1 + l2”。但前期沒有必要引入這種復雜性,這種化簡完全可以由后續的各種優化完成。
上面的例子實際上的存在一些問題的。雖然Java操作數棧和局部變量表里面存放的數據都是有類型,但是棧和局部變量表本身只是一個存儲空間罷了,并沒有規定里面必須存放什么類型的數據。所以每次在給棧空間或者局部變量賦值的時候,我們有必要新聲明一個局部變量。上面的例子翻譯為:
s0 = l1; s1 = l2; s0_1 = s0 + s1; l1_1 = s0;
通過數據流分析可以求出def-use,方便做上面的這種變量分裂,這里不詳細說了。
最近在研究Soot,由于Soot的目的是對字節碼做優化,所以里面也有將字節碼翻譯為Jimple的邏輯。但是不明白Soot為什么需要類型推導,目前我感覺將Java字節碼翻譯為Jimple完全不需要推導類型。
[1] Toba: Java For ApplicationsA Way Ahead of Time (WAT) Compiler
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69223.html
摘要:為什么要將字節碼翻譯為代碼字節碼是基于棧的一種編碼。最近在研究,由于的目的是對字節碼做優化,所以里面也有將字節碼翻譯為的邏輯。但是不明白為什么需要類型推導,目前我感覺將字節碼翻譯為完全不需要推導類型。 為什么要將Java字節碼翻譯為C代碼? Java字節碼是基于棧的一種編碼。這種編碼方式十分方便解釋器的設計,但同時不利于程序分析,因此一些高效的代碼優化技術無法方便的Java字節碼上實現...
摘要:本文已收錄修煉內功躍遷之路我們寫的方法在被編譯為文件后是如何被虛擬機執行的對于重寫或者重載的方法,是在編譯階段就確定具體方法的么如果不是,虛擬機在運行時又是如何確定具體方法的方法調用不等于方法執行,一切方法調用在文件中都只是常量池中的符號引 本文已收錄【修煉內功】躍遷之路 showImg(https://segmentfault.com/img/bVbuesq?w=2114&h=12...
Hello World!應用程序 下面列出的小節提供了編譯和運行一個簡單的Hello World!應用程序的詳細說明,第一部分提供了關于使用NetBeans IDE入門的信息,集成開發環境極大地簡化了軟件開發過程。NetBeans IDE運行在下面列出的所有平臺上,其余部分提供了特定于平臺的指示,用于在沒有集成開發環境的情況下啟動。如果遇到問題,一定要參考常見問題部分,它為新用戶遇到的許多問題提供...
摘要:建模語言建模語言是可用于表達信息或知識或系統的任何人造語言,該結構由一組一致的規則定義,目標是可視化,推理,驗證和傳達系統設計。將這些文件安排到不同的地方稱為源代碼樹。源代碼樹的結構通常反映了軟件的體系結構。 大綱 軟件構建的一般過程: 編程/重構 審查和靜態代碼分析 調試(傾倒和記錄)和測試 動態代碼分析/分析 軟件構建的狹義過程(Build): 構建系統:組件和過程 構建變體...
閱讀 3577·2021-11-24 10:19
閱讀 3710·2021-09-30 09:47
閱讀 1282·2019-08-30 15:56
閱讀 780·2019-08-29 15:11
閱讀 893·2019-08-29 13:43
閱讀 3557·2019-08-28 18:25
閱讀 2149·2019-08-26 13:27
閱讀 1427·2019-08-26 11:44