<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                **class文件格式與dex文件格式的異同** - 本質上他們都是一樣的,dex是從class文件演變而來的 - class文件存在許多冗余信息,dex會去除冗余,并整合 **Dalvik 虛擬機字節碼和JVM 字節碼的區別**: **一、程序結構不同** JVM字節碼由“.class”文件組成, 每個文件一個class。JVM在運行的時候為每一個類裝載字節碼。相反的,Dalvik 程序只包含一個“.dex”文件, 這個文件包含了程序中所有的類。如圖1所示為生成.dex 文件的過程。 :-: ![](https://box.kancloud.cn/afe0b63fcd7559e31b7da14d75069c0b_654x312.jpg) 圖1 生成.dex的過程 Java編譯器創建了JVM字節碼之后,**Dalvik的dx 編譯器刪除“.class”文件, 重新把它們編譯成Dalvik字節碼,然后把它們寫進一個“.dex”文件中。這個過程包括翻譯、重構、解釋程序的基本元素(常量池、類定義、數據段)**。常量池描述了所有的常量,包括引用、方法名、數值常量等。類定義包括了訪問標志、類名等基本信息。數據段中包含各種被DVM執行的函數代碼以及類和 函數的相關信息(例如Dalvik 虛擬機所需要的寄存器數量、局部變量表、操作數堆找大小),還有實例變量。 **二、寄存器結構不同** **Dalvik虛擬機是基于寄存器的,但是JVM 是基于堆棧的**。JVM 字節碼中,局部變量會被放入局部變量表中,繼而被壓入堆棧供操作碼進行運算,當然JVM也可以只使用堆棧而不顯式地將局部變量存入變量表中。Dalvik虛擬機字節碼中,局部變量會被賦給65536個可用的寄存器中的任何一個, Dalvik虛擬機指令直接操作這些寄存器,而不是訪問堆棧中的元素。 **三、指令集不同** **Dalvik虛擬機有218個操作碼,而Java虛擬機有200個,并且二者本質上完全不同**。比如,Java 虛擬機有10 多個操作碼用于堆棧和本地變量表的數據轉移而Dalvik虛擬機完全沒有。Dalvik虛擬機指令要比Java指令更長, 因為它們經常包含了寄存器的源地址和目標地址。因此**Dalvik 虛擬機需要更少的指令**。平均來講,**Dalvik虛擬機字節碼程序指令數要比Java少30%,但是程序要大35%左右**。 **四、常量池結構不同** **JVM字節碼中許多. class 文件中重復常量池**,比如重復引用函數的名字。dx編譯器消除了這些重復。**Dalvik 虛擬機使用了一個常量池供所有的class同時引用**。除此之外, dx 通過內聯技術消除了一些常量。在實際中,整數、長整數、單精度和雙精度浮點常量在這個過程中消失了。 **五、模糊不清的基本類型不同** JVM的整數賦值和單精度浮點賦值采用不同的操作碼,長整數賦值和雙精度賦值也不同;而Dalvik虛擬機使用相同的操作碼來對整數和浮點進行賦值。 **六、空引用不同** Dalvik虛擬機字節碼并沒有一個特定的空類型,而是用常量0來取代。這樣,反編譯時,常量0的模糊不清的含義就應當被正確地區分。 **七、類型引用的不同** Java 字節碼對對象引用的比較和空類型比較使用不同的操作碼,而Dalvik虛擬機只用了一個操作碼來進行簡化。因此如果做反編譯,就必須還原比較對象的類型信息。 **八、數組原始類型的存儲不同** Dalvik 虛擬機使用不明確的操作碼來進行數組操作(比如aget 和aget-wide),而JVM在這點上是明確的。因此如果要做反編譯,數組類型信息必須還原。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看