當前位置:首頁 » 編程軟體 » 一次編譯到處運行語言

一次編譯到處運行語言

發布時間: 2022-07-17 17:55:11

Ⅰ 為什麼說java是「一次編譯到處運行

因為Java運行的時候只需要安裝一個虛擬機,就可以了,而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所謂的與系統無關,就是為每種不同類型的機器寫了不同的jre,說白了,就像一個人到某個公司找一個人為自己做翻譯。某個公司為你提供的不是一個翻譯,而是根據你在不同的國家為你自動匹配不同的翻譯,而你自己仍然說自己的話,java就是在不同的機器上針對自己的java語言作出不同的翻譯,保證效果不變,從而達到相同的效果。
就好像你說拼音「阿」
到英國就給你翻譯成「a」
到日本就給你翻譯成「あ」

Ⅳ 關於編程語言 一次編譯 處處運行問題

java的這個特性也是做了一些犧牲的,在效率方面。這種解釋性的語言,第一次編譯為位元組碼,運行的時候,逐條地編譯為本地代碼執行,效率肯定不及編譯型語言。
編譯型的語言,雖然沒有java的平台無關性,但是運行效率高,有其適用的場合,比如一般的伺服器端都是用的c或者c++去處理上百萬的客戶端請求。
java語言得益於現在硬體的飛速升級,以至於它的效率問題不是那麼低明顯了。

總之呢,在計算機的世界裡,有得必有失,不可能魚和熊掌兼得(或許有,不過很少)。
要麼時間換空間,要麼空間換時間,要麼就是像java這樣,犧牲運行效率達到Written Once, run anywhere!

Ⅳ Java語言是如何做到可移植性強、跨平台、「一次編譯到處運行」的呢

因為java代碼是運行在JVM上的,不同的平台有不同的JVM,如Windows和Mac上的運行同一款游戲,他們的實現方式肯定不一樣,但你都能讀取游戲的存檔文件。你不需要知道JVM在不同平台的實現方式,但他們解析java的class文件是一樣的邏輯,就是這樣java實現跨平台的。

Ⅵ java如何實現一次編譯到處運行

  • JAVA之所以能實現一次編譯,到處運行,是因為JAVA在每個系統平台上都有JAVA虛擬機(JVM),JAVA編譯的中間文件class是由JAVA虛擬機在運行時動態轉換為對應平台的機器代碼.

  • Java是一種可以撰寫跨平台應用程序的面向對象的程序設計語言。Java 技術具有卓越的通用性、高效性、平台移植性和安全性,廣泛應用於PC、數據中心、游戲控制台、科學超級計算機、行動電話和互聯網,同時擁有全球最大的開發者專業社群。

  • Java 由四方面組成:

  1. Java編程語言,即語法。

  2. Java文件格式,即各種文件夾、文件的後綴。

  3. Java虛擬機(JVM),即處理*.class文件的解釋器。

  4. Java應用程序介面(Java API)。

Ⅶ java的"一次編譯,到處運行"的機制是如何實現的

JVM是一個java虛擬機,所謂的java虛擬機就是和普通的虛擬機一樣,擁有自己的CPU,RAM之類的。我們所使用的操作系統是Windows的操作系統,Windows操作系統支持的可執行文件是EXE文件,也就是說在Windows的操作系統上只有EXE的文件是可以直接被操作系統解釋為底層機器語言並進行運行的。而java虛擬機可以支持的是.class的可執行文件,在java的虛擬機中遇到.class的文件就可以直接翻譯成java虛擬機所能是別的底層機器語言並進行執行。這就是JVM的機制,正是因為java的這種機制才實現了java的跨平台,在不同的平台上安裝能夠在相應平台上運行的虛擬機,然後在java虛擬機中運行java的源程序,「一次編譯,多次執行」就此實現了。
所以java的跨平台是離不開虛擬機的支持的。虛擬機充當著java源程序和操作系統之間的中間,不同的操作系統只需要尋找相應的中介就可以實現在不同的操作系統上運行。而java的編譯只是吧.java文件編譯為.class位元組碼文件而已,然後把位元組碼交給虛擬機去執行。
虛擬機在執行的時候是讀一句位元組碼文件人後解釋一句給操作系統聽,這就是為什麼java是解釋型的語言。
所謂的編譯型的語言是指這種語言被編譯之後生成的是可以直接供操作系統執行的010101文件,像C,C++都是編譯型的,java因為中間有JVM這么個東西所以是解釋型的。

Ⅷ 如何通俗易懂解釋 Java 語言所謂「一次編寫,到處運行」的特性

使用JAVA語言開發的程序,無論在什麼環境下編譯的,可以在任何運行有java虛擬機的平台上運行。

比如在windows下開發的java程序,可以直接拿到linux的jvm上運行而不需要修改代碼或者重新編譯。

Ⅸ 為什麼大家都說Java,可以一次編譯,到處運行呢

java 可以打成jar 包 放到任意的平台上去運行

Ⅹ 如何理解Java「一次編譯到處運行」的特性

簡單地說Java的跨平台性就是指,編譯後的Java程序可直接在不同的平台上運行而不用重新編譯,這一特性使得Java隨著Web應用的普及而迅速普及起來。而Java的跨平台性是如何實現的呢?這就要理解Java虛擬機和位元組碼的概念。
實際上,編譯後的Java代碼並不是傳統的二進制代碼(如Windows下的.exe文件),而是Java位元組碼,這種位元組碼文件是不能直接在操作系統上執行的。要想在一個操作系統上運行一個Java程序必須有一個中間環節來負責將Java位元組碼解釋成二進制碼,這個中間環節就是Java虛擬機(簡稱JVM)。由於目前大多數操作系統已經實現了JVM,所以Java輕松實現跨平台性。
這是之前我在黑馬程序員培訓Java時候,老師講解的,感覺老師講的很好,分享給你,你要是學Java,推薦系統學習,去黑馬程序員。

熱點內容
linux下ntp伺服器搭建 發布:2024-09-08 08:26:46 瀏覽:742
db2新建資料庫 發布:2024-09-08 08:10:19 瀏覽:171
頻率計源碼 發布:2024-09-08 07:40:26 瀏覽:778
奧迪a6哪個配置帶後排加熱 發布:2024-09-08 07:06:32 瀏覽:101
linux修改apache埠 發布:2024-09-08 07:05:49 瀏覽:209
有多少個不同的密碼子 發布:2024-09-08 07:00:46 瀏覽:566
linux搭建mysql伺服器配置 發布:2024-09-08 06:50:02 瀏覽:995
加上www不能訪問 發布:2024-09-08 06:39:52 瀏覽:811
銀行支付密碼器怎麼用 發布:2024-09-08 06:39:52 瀏覽:513
蘋果手機清理瀏覽器緩存怎麼清理緩存 發布:2024-09-08 06:31:32 瀏覽:554