java編譯時生成代碼 java編寫代碼

Java代碼到底是如何編譯成機(jī)器指令的

編譯器把一種語言規(guī)范轉(zhuǎn)化為另一種語言規(guī)范的這個過程需要哪些步驟?回答這個問題需要參照《編譯原理》,總結(jié)過程如下:

在寬城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,營銷型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè),寬城網(wǎng)站建設(shè)費(fèi)用合理。

1)詞法分析:讀取源代碼,一個字節(jié)一個字節(jié)的讀進(jìn)來,找出這些詞法中我們定義的語言關(guān)鍵詞如:if、else、while等,識別哪些if是合法的哪些是不合法的。這個步驟就是詞法分析過程。

詞法分析的結(jié)果:就是從源代碼中找出了一些規(guī)范化的token流,就像人類語言中,給你一句話你要分辨出哪些是一個詞語,哪些是標(biāo)點(diǎn)符號,哪些是動詞,哪些是名詞。

2)語法分析:就是對詞法分析中得到的token流進(jìn)行語法分析,這一步就是檢查這些關(guān)鍵詞組合在一起是不是符合Java語言規(guī)范。如if的后面是不是緊跟著一個布爾型判斷表達(dá)式。

語法分析的結(jié)果:就是形成一個符合Java語言規(guī)定的抽象語法樹,抽象語法樹是一個結(jié)構(gòu)化的語法表達(dá)形式,它的作用是把語言的主要詞法用一個結(jié)構(gòu)化的形式組織在一起。這棵語法樹可以被后面按照新的規(guī)則再重新組織。

3)語義分析:語法分析完成之后也就不存在語法問題了,語義分析的主要工作就是把一些難懂的,復(fù)雜的語法轉(zhuǎn)化成更簡單的語法。就如難懂的文言文轉(zhuǎn)化為大家都懂的百話文,或者是注釋一下一些不懂的成語。

語義分析結(jié)果:就是將復(fù)雜的語法轉(zhuǎn)化為簡單的語法,對應(yīng)到Java就是將foreach轉(zhuǎn)化為for循環(huán),還有一些注釋等。最后生成一棵抽象的語法樹,這棵語法樹也就更接近目標(biāo)語言的語法規(guī)則。

4)字節(jié)碼生成:將會根據(jù)經(jīng)過注釋的抽象語法樹生成字節(jié)碼,也就是將一個數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為另外一個數(shù)據(jù)結(jié)構(gòu)。就像將所有的中文詞語翻譯成英文單詞后按照英文語法組裝文英文語句。代碼生成器的結(jié)果就是生成符合java虛擬機(jī)規(guī)范的字節(jié)碼。

什么是Java代碼的編譯與反編譯?

Java代碼的編譯與反編譯

2017-02-21Hollis數(shù)盟

一、什么是編譯

1、利用編譯程序從源語言編寫的源程序產(chǎn)生目標(biāo)程序的過程。

2、用編譯程序產(chǎn)生目標(biāo)程序的動作。編譯就是把高級語言變成計算機(jī)可以識別的2進(jìn)制語言,計算機(jī)只認(rèn)識1和0,編譯程序把人們熟悉的語言換成2進(jìn)制的。編譯程序把一個源程序翻譯成目標(biāo)程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優(yōu)化;目標(biāo)代碼生成。主要是進(jìn)行詞法分析和語法分析,又稱為源程序分析,分析過程中發(fā)現(xiàn)有語法錯誤,給出提示信息。

二、什么是反編譯

計算機(jī)軟件反向工程(Reverseengineering)也稱為計算機(jī)軟件還原工程,是指通過對他人軟件的目標(biāo)程序(可執(zhí)行程序)進(jìn)行“逆向分析、研究”工作,以推導(dǎo)出他人的軟件產(chǎn)品所使用的思路、原理、結(jié)構(gòu)、算法、處理過程、運(yùn)行方法等設(shè)計要素,某些特定情況下可能推導(dǎo)出源代碼。反編譯作為自己開發(fā)軟件時的參考,或者直接用于自己的軟件產(chǎn)品中。

三、Java類的編譯與反編譯

我們在最初學(xué)習(xí)Java的時候,會接觸到兩個命令:javac和java,那個時候我們就知道,javac是用來編譯Java類的,就是將我們寫好的helloworld.java文件編譯成helloworld.class文件。

class文件打破了C或者C++等語言所遵循的傳統(tǒng),使用這些傳統(tǒng)語言寫的程序通常首先被編譯,然后被連接成單獨(dú)的、專門支持特定硬件平臺和操作系統(tǒng)的二進(jìn)制文件。通常情況下,一個平臺上的二進(jìn)制可執(zhí)行文件不能在其他平臺上工作。而Javaclass文件是可以運(yùn)行在任何支持Java虛擬機(jī)的硬件平臺和操作系統(tǒng)上的二進(jìn)制文件。

那么反編譯呢,就是通過helloworld.class文件得到j(luò)ava文件(或者說是程序員能看懂的Java文件)

四、什么時候會用到反編譯

1、我們只有一個類的class文件,但是我們又看不懂Java的class文件,那么我們可以把它反編譯成我們可以看得懂的文件。

2、學(xué)習(xí)Java過程中,JDK的每個版本都會加入越來越多的語法糖,有些時候我們想知道Java一些實(shí)現(xiàn)細(xì)節(jié),我們可以借助反編譯。

五、反編譯工具

1、javap

2、Jad:官網(wǎng)(墻裂推薦)

客戶端:

可以在官網(wǎng)下載可執(zhí)行文件,找到對應(yīng)的操作系統(tǒng)的對應(yīng)版本,然后進(jìn)行安裝使用。

因?yàn)槲沂褂玫氖莑inux操作系統(tǒng),所以我下載的是Linux版本的工具,這個工具下載好之后會有一個執(zhí)行文件,只要在執(zhí)行文件所在目錄執(zhí)行./jadhelloworld.class就會在當(dāng)前目錄下生成helloworld.jad文件,該文件里就是我們很熟悉的Java代碼

Eclipse插件:

下載地址在官網(wǎng)下載插件的jar包,然后將jar包放到eclipse的plugins目錄下‘在打開Eclipse,Eclipse-Window-Preferences-Java,此時你會發(fā)現(xiàn)會比原來多了一個JadClipse的選項(xiàng),單擊,在Pathtodecompiler中輸入你剛才放置jad.exe的位置,也可以制定臨時文件的目錄。當(dāng)然在JadClipse下還有一些子選項(xiàng),如Debug,Directives等,按照默認(rèn)配置即可?;九渲猛戤吅?,我們可以查看一下class文件的默認(rèn)打開方式,Eclipse-Window-Preferences-General-Editors-FileAssociations我們可以看到class文件的打開方式有兩個,JadClipse和Eclipse自帶的ClassFileViewer,而JadClipse是默認(rèn)的。全部配置完成,下面我們可以查看源碼了,選擇需要查看的類,按F3即可查看源碼

java程序編譯后會產(chǎn)生字節(jié)碼還是機(jī)器碼?

java編譯后的是字節(jié)碼。

字節(jié)碼,為java源代碼編譯完成后,由JVM轉(zhuǎn)換成的文件,可以在任何裝有JVM的系統(tǒng)上,轉(zhuǎn)化相應(yīng)的機(jī)器語言。

機(jī)器碼:即機(jī)器語言,表示的就是運(yùn)行字節(jié)碼文件后的二進(jìn)制序列。

java編譯問題? java通過編譯工具寫代碼生成xx.java文件,通過運(yùn)行命令提示符執(zhí)行ja

要是你嫌用cmd執(zhí)行麻煩的話,你可以去下載相應(yīng)的java開發(fā)工具。如Ecplise或者M(jìn)yEcplise。這些都是可以直接用于java 的開發(fā),其中的道理跟cmd利用javac編譯 java運(yùn)行。只不過其中省略了cmd的步驟,而開發(fā)程序自動幫你完成了javac.xxxx.java和java xxxx這兩步。對,javac是對java程序進(jìn)行一次編譯,生成class文件,然后在運(yùn)行.

Java編譯器如何生成重載和覆蓋方法代碼

舉個簡單的例子,展示了多態(tài)性(Polymorphism):重載(Overloaded)和覆蓋(Overridden)。

多態(tài)性意味著方法可以在不同的時刻表現(xiàn)出不同的形式。在編譯期間,這被稱為方法重載。重載允許相關(guān)的方法可以使用相同的方法名訪問。有時候這被稱為ad hoc polymorphism,與parametric polymorphism 不同。

輸出:

intstringoverriden int

從編譯器的角度講,如何生成能夠正確調(diào)用的函數(shù)的代碼?

靜態(tài)重載(Static overloading)不難實(shí)現(xiàn)。當(dāng)處理一個重載方法的聲明時,一個新的綁定會被映射到一個不同的實(shí)現(xiàn)。在處理類型檢查的過程中,編譯器會分析參數(shù)的實(shí)際類型,然后決定使用哪個方法。

動態(tài)重載(Dynamic overloading )允許運(yùn)行時根據(jù)實(shí)際參數(shù)的類型來選擇函數(shù)的不同實(shí)現(xiàn)。這是動態(tài)調(diào)度(dynamic dispatch)的一種形式。

動態(tài)調(diào)度也被用來實(shí)現(xiàn)方法覆蓋。被覆蓋的方法的調(diào)用由運(yùn)行期間實(shí)際對象的類型決定的。

如何在CMD編譯和運(yùn)行JAVA代碼?

要想編譯和運(yùn)行java文件,很簡單,只需要兩個命令:

(1)javac:作用:編譯java文件;使用方法: javac Hello.java ,如果不出錯的話,在與Hello.java 同一目錄下會生成一個Hello.class文件,這個class文件是操作系統(tǒng)能夠使用和運(yùn)行的文件。

(2)java: 作用:運(yùn)行.class文件;使用方法:java Hello,如果不出錯的話,會執(zhí)行Hello.class文件。注意:這里的Hello后面不需要擴(kuò)展名。

下面舉例說明:

假設(shè)我有一個Hello.java文件放在D:\javatest 文件夾下。

打開cmd命令窗口,會出現(xiàn)C:\user\lenovo 這里出現(xiàn)的是系統(tǒng)用戶名,這里我們需要將路徑轉(zhuǎn)移到j(luò)ava文件所在目錄。

緊接著輸入 D:回車,會出現(xiàn)一下界面:

這時候我們需要定位到j(luò)ava文件所在目錄(這里是javatest目錄),接著輸入 cd javatest 回車。

此時進(jìn)入到D:\javatest目錄中,此時的Hello.java文件就在這里

這時候我們就可以用javac命令編譯啦,輸入javac Hello.java回車

這里如果沒有任何提示表示編譯成功,此時打開d:\javatest文件夾你會發(fā)現(xiàn)此時多了一個名為Hello.class的文件,這就是操作系統(tǒng)能夠運(yùn)行的文件。

接著輸入 java Hello回車,你就會看到文件被運(yùn)行的結(jié)果。

這里有幾個要注意的問題

第一:Hello.java中的內(nèi)容是一個類,這個類的名字與.java文件名字必須完全一致。如果不一致將出錯。這里當(dāng)你通過eclipse創(chuàng)建一個類文件的時候你就會理解的更清楚了,這里不贅述。

第二:javac 和 java 命令的使用方法要注意,格式。

第三:要使用這兩命令,必須配置好環(huán)境變量。

本文名稱:java編譯時生成代碼 java編寫代碼
文章鏈接:http://muchs.cn/article26/hhedjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站設(shè)計、服務(wù)器托管、移動網(wǎng)站建設(shè)、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司