當前位置:首頁 » 編程語言 » java機器碼

java機器碼

發布時間: 2022-06-06 08:15:02

java語言源文件編譯生成的位元組碼和機器碼有什麼區別

位元組碼要根據不同的操作系統來轉換用機器碼後再在本操作系統上運行。

② 什麼是Java位元組碼

它是程序的一種低級表示,可以運行於Java虛擬機上。將程序抽象成位元組碼可以保證Java程序在各種設備上的運行
Java號稱是一門「一次編譯到處運行」的語言,從我們寫的java文件到通過編譯器編譯成java位元組碼文件(.class文件),這個過程是java編譯過程;而我們的java虛擬機執行的就是位元組碼文件。不論該位元組碼文件來自何方,由哪種編譯器編譯,甚至是手寫位元組碼文件,只要符合java虛擬機的規范,那麼它就能夠執行該位元組碼文件。

JAVA程序的運行

因為Java具有跨平台特性,為了實現這個特性Java執行在一台虛擬機上,這台虛擬機也就是JVM,Java通過JVM屏蔽了不同平台之間的差異,從而做到一次編譯到處執行。JVM位於Java編譯器和OS平台之間,Java編譯器只需面向JVM,生成JVM能理解的代碼,這個代碼即位元組碼,JVM再將位元組碼翻譯成真實機器所能理解的二進制機器碼。
位元組碼是怎麼產生的?

我們所編寫的程序都是.java格式,通常在執行的時候也許點擊一下eclipse的運行鍵就可以在控制台看到運行結果,但是也可以更酷一些,如果你裝了JDK,那就可以直接在以命令行的方式編譯運行你的.java文件,編譯後會形成.class文件,這個.class文件即位元組碼。
位元組碼怎麼解讀?

上圖是編譯好的位元組碼文件,即一堆16進制的位元組,如果使用IDE去打開,也許看到的是已經被反編譯的我們所熟悉的java代碼,但這才是純正的位元組碼

這里只介紹位元組碼由哪些部分組成, 具體的意思自行網路或者看文尾的連接, 有較為詳細的講解

上圖即位元組碼文件的組成部分, Class文件的結構不像XML等描述語言那樣鬆散自由。由於它沒有任何分隔符號,

所以,以上數據項無論是順序還是數量都是被嚴格限定的。哪個位元組代表什麼含義,長度是多少,先後順序如何,都不允許改變, 如上圖左側即每一部分規定的長度
魔數(Magic Number)

魔數是用來區分文件類型的一種標志,一般都是用文件的前幾個位元組來表示。
比如0XCAFE BABE表示的是class文件,那麼有人會問,文件類型可以通過文件名後綴來判斷啊?是的,但是文件名是可以修改的(包括後綴),那麼為了保證文件的安全性,將文件類型寫在文件內部來保證不被篡改。
至於為什麼是CAFE BABE估計大家也能猜到, 程序員與咖啡的不解之緣
版本號(Version)
版本號含主版本號和次版本號,都是各佔2個位元組。在此Demo種為0X0000 0033。其中前面的0000是次版本號,後面的0033是主版本號。通過進制轉換得到的是次版本號為0,主版本號為51。高版本的JDK能向下兼容以前版本的Class文件,但不能運行以後版本的Class文件,即使文件格式未發生任何變化. 這就是target參數的用處,可以在使用JDK 1.7編譯時指定-target 1.5
常量池(Constant Pool)
常量池是Class文件中的資源倉庫, 量池中主要存儲2大類常量:字面量和符號引用。字面量如文本字元串,java中聲明為final的常量值等等,而符號引用如類和介面的全局限定名,欄位的名稱和描述符,方法的名稱和描述符。常量池是一個表結構,在表的內容前有一個類型的計數器,表示常量池的長度
上面的表中描述了11中數據類型的結構,其實在jdk1.7之後又增加了3種(CONSTANT_MethodHandle_info,CONSTANT_MethodType_info以及CONSTANT_InvokeDynamic_info)。這樣算起來一共是14種
訪問標志(Access_Flag)
訪問標志信息包括該Class文件是類還是介面,是否被定義成public,是否是abstract,如果是類,是否被聲明成final。通過上面的源代碼,我們知道該文件是類並且是public。
0x 00 21:是0×0020和0×0001的並集。其中0×0020這個標志值涉及到位元組碼指令

類索引(This Class Name)
類索引用於確定類的全限定名
0×00 03 表示引用第3個常量,同時第3個常量引用第19個常量,查找得」com/demo/Demo」。#3.#19
父類索引(Super Class Name)
0×00 04 同理:#4.#20(java/lang/Object)
介面索引(Interfaces)
通過上邊位元組碼圖可以看到,這個介面有2+n個位元組,前兩個位元組表示的是介面數量,後面跟著就是介面的表。我們這個類沒有任何介面,所以應該是0000。果不其然,查找位元組碼文件得到的就是0000。
欄位表集合(fields)
欄位表用於描述類和介面中聲明的變數。這里的欄位包含了類級別變數以及實例變數,但是不包括方法內部聲明的局部變數。接下來就是2+n個欄位屬性。我們只有一個屬性a,所以應該是0001。查找文件果不其然是0001。
該區域含有欄位的訪問標志, 訪問許可權, 欄位的名稱索引, 欄位的描述符索引, 屬性表
描述符的作用就是用來描述欄位的數據類型、方法的參數列表和返回值。而屬性表就是為欄位表和方法表提供額外信息的表結構。對於欄位來說,此處如果將欄位聲明為一個static final msg = "aaa"的常量,則欄位後就會跟著一個屬性表,其中存在一項名為ConstantValue,指向常量池中的一個常量,值為的"aaa"。
方法(methods)
包含訪問標志表, 方法名索引 , 方法描述符索引, 屬性表數量,等
Attribute
0×0001 :同樣的,表示有1個Attributes了。
0x000f : #15(「SourceFile」)
0×0000 0002 attribute_length=2
0×0010 : sourcefile_index = #16(「Demo.java」)
SourceFile屬性用來記錄生成該Class文件的源碼文件名稱。

③ java編譯後產生 位元組碼,還是 機器碼能不能簡單解釋一下

java虛擬機是可運行java位元組碼的假象計算機 java的跨平台性也是相對與其他編程語言而言的
先介紹一下c語言的編譯過程吧
先是C語言源程序也就是。c的文件
經過C編譯程序編譯後生成windows可執行文件exe文件
然後在windows中執行。。
再介紹java的編譯過程
先是java源程序 擴展名為。java的文件
由java編譯程序將java位元組碼文件 就是class文件
然後在java虛擬機中執行。。

④ java語言為什麼使用的java虛擬機而不是直接翻譯成機器代碼(即和C語言一樣)

目前常用的系統或者平台其實沒有幾個,這種跨平台性,在我看來真的是浪費了。C/C++可以高效率運行是因為直接編譯成機器碼,按說Java語法的也可以的啊,只是它選擇了虛擬機來搞快平台,用喜歡的語法,翻譯成機器碼,豈不是和C/C++一樣的效率了。

⑤ java程序編譯後會產生位元組碼還是機器碼

Java編譯後是位元組碼,C/C++以前全都是是機器碼。
電腦只能運行機器碼。Java在運行的時候把位元組碼變成機器碼。
C/C++在編譯的時候直接編譯成機器碼。

不過現在微軟的Visual Studio C++ 2005以後的C++也可以編譯成位元組碼,用CLR運行是轉換成機器碼(和Java差不多)。

⑥ 為什麼要學習java

目前最火熱的三種語言
1.python
憑借著人工智慧的東風,python語言一路水漲船高,在2019年最新的計算機語言中排名第一。
2.C語言
對比C++,C語言是功能減少的簡化版本,這使C語言能夠在內存有限的大量硬體設備中運行。
3.Java語言
Java是目前最為廣泛的網路編程語言。
為什麼我們要學習Java?
1.Java的應用范圍很廣。
在近三年的計算機編程語言中,java分別在2017年、2018年排名第一,在2019年排名第三,是目前當之無愧的最流行的編程語言之一。
80%以上的高端企業級應用都使用JAVA平台。Java在通信及網路、金融、電子政務、手機游戲和嵌入式設備及消費類電子產品等領域受到企業青睞。
2.Java的跨平台性。
由於計算機只能識別機器碼,因此高級語言源代碼想要在計算機上運行需要被編譯成機器碼。而同樣的語義在不同的計算機平台擁有不同的機器碼,因此不同的平台需要特定的編譯器。不同的編譯器也導致同樣功能的程序在不同的平台表達需要不同的源代碼,這樣就會導致企業的開發成本過高。
針對這種情況,Java創造了一種位元組碼文件,通過一種編譯器將Java源代碼編譯成位元組碼文件,然後計算機平台特定的Java虛擬機(JVM)將位元組碼文件解釋為機器碼。如此就實現了Java的跨平台特性,大大降低了企業的開發成本。
3.Java語言簡單易學。
Java是一門強類型語言,語言結構嚴謹,對於初學者來說十分友好。
4.基於面向對象編程更符合人類的思維方式,便於人類編寫。
Java引入了類的概念,類是用來創建對象的模板,它包含被創建的對象的狀態描述和方法的定義。
5.Java是一門很好的輔助性語言。
Java已經有超過十年的歷史,許多編程語言都有借鑒它的編程思想和設計模式,當你精通Java語言之後,學習其他語言也會方便很多。

⑦ java虛擬機的機器碼保存在什麼文件中

.class為文件後綴名的文件。

⑧ 「java解釋器就是把在java虛擬機上運行的目標代碼(位元組碼)解釋成為具體平台的機器碼」這種理解對嗎

你的說法是正確的
java解釋器就是java虛擬機,是jdk或jre目錄下bin目錄中的java.exe文件

⑨ JAVA源文件需要先解釋成位元組碼文件,在編譯成對應機器碼並運行

為了保持它跨平台的特性,java源文件先編譯成一種中間碼,在運行的時候再實時編譯成目標平台的機器碼

熱點內容
抽獎源碼帶後台 發布:2025-02-08 20:33:54 瀏覽:225
歐博中央空調原始密碼是多少 發布:2025-02-08 20:33:47 瀏覽:335
運動使人快樂緩解壓力 發布:2025-02-08 20:27:01 瀏覽:98
linux命令大文件 發布:2025-02-08 20:25:06 瀏覽:897
C蟻群演算法 發布:2025-02-08 20:21:25 瀏覽:513
私人搭建伺服器能幹嘛 發布:2025-02-08 20:21:24 瀏覽:596
網吧怎麼通過伺服器玩網路游戲 發布:2025-02-08 19:59:52 瀏覽:914
文檔編輯加密 發布:2025-02-08 19:56:31 瀏覽:392
phpmysql存儲過程實例 發布:2025-02-08 19:54:40 瀏覽:161
淘寶賣的地下城腳本 發布:2025-02-08 19:41:40 瀏覽:63