當前位置:首頁 » 編程軟體 » java程序源程序的編譯

java程序源程序的編譯

發布時間: 2023-04-10 19:12:37

① 什麼是java代碼的編譯與反編譯

Java代碼的編譯與反編譯

2017-02-21Hollis數盟

一、什麼是編譯

1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。

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

二、什麼是反編譯

計算機軟體反向工程(Reverseengineering)也稱為計算機軟體還原工程,是指通過對他人軟體的目標程序(可執行程序)進行「逆向分析、研究」工作,以推導出他人的軟體產品所使用的思路、原理、結構、演算法、處理過程、運行方法等設計要素,某些特定情況下可能推導出源代碼。反編譯作為自己開發軟體時的參考,或者直接用於自己的軟體產品中。

三、Java類的編譯與反編譯

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

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

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

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

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

2、學習Java過程中,JDK的每個版本都會加入越來越多的語法糖,有些時候我們想知道Java一些實現細節,我們可以藉助反編譯。

五、反編譯工具

1、javap

2、Jad:官網(牆裂推薦)

客戶端:

可以在官網下載可執行文件,找到對應的操作系統的對應版本,然後進行安裝使用。

因為我使用的是linux操作系統,所以我下載的是Linux版本的工具,這個工具下載好之後會有一個執行文件,只要在執行文件所在目錄執行./jadhelloworld.class就會在當前目錄下生成helloworld.jad文件,該文件里就是我們很熟悉的Java代碼

Eclipse插件:

下載地址在官網下載插件的jar包,然後將jar包放到eclipse的plugins目錄下『在打開Eclipse,Eclipse->Window->Preferences->Java,此時你會發現會比原來多了一個JadClipse的選項,單擊,在Pathtodecompiler中輸入你剛才放置jad.exe的位置,也可以制定臨時文件的目錄。當然在JadClipse下還有一些子選項,如Debug,Directives等,按照默認配置即可。基本配置完畢後,我們可以查看一下class文件的默認打開方式,Eclipse->Window->Preferences->General->Editors->FileAssociations我們可以看到class文件的打開方式有兩個,JadClipse和Eclipse自帶的ClassFileViewer,而JadClipse是默認的。全部配置完成,下面我們可以查看源碼了,選擇需要查看的類,按F3即可查看源碼

② 正面哪個命令可能編譯Java源程序

正面javac命令可能編譯Java源程序。
1、首先使用記事本編輯一段簡單的Java代碼。
2、然後保存為HelloWorld.java文件(注意類名需要和文件名保持一致)。
3.打開cmd命令行。
4.進入HelloWorld.java所在的目錄。

③ java的源程序怎麼進行編譯

public class HelloWorld {
public static void main(String[ ] args){
System.out.println("Hello World");
}
}

把上面代碼復制下來,保存成文件,放當前目錄下,命名為HelloWorld.java
安裝JDK後,配置path=c:\program files\java\jdk1.6_0_23\bin (這里是舉例,你的jdk安裝目錄可能在別的地方,注意後面有\bin)
classpath=.

然後,運行cmd打開命令行,進入保存HelloWorld.java的目錄

編譯命令:javac HelloWorld.java
運行命令:java HelloWorld

注意,嚴格區分大小寫。

④ 編譯java源文件的命令是()

javac.exe。Java是由Sun微系統公司所發展出來的程序語言,它本身是一種對象導向(Object-Oriented)的程胡運序語言,其中編譯java源文件的命令是javac.exe。文件是指由創建者所定義的雹蘆、具有文件名的一組相關元素的集合。源文件指用匯編語言或高級語言寫出褲肆梁來的代碼保存為文件後的結果,源文件是相對目標文件和可執行文件而言的。

⑤ 誰能簡單闡述下java編譯執行的過程

Java虛擬機(JVM)是可運行Java代碼的假想計算機。

只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統上運行。

本文首先簡要介紹從Java文件的編譯到最終執行的過程,隨後對JVM規格描述作一說明。

一.Java源文件的編譯、下載、解釋和執行

Java應用程序的開發周期包括編譯、下載、解釋和執行幾個部分。

Java編譯程序將Java源程序翻譯為JVM可執行代碼?位元組碼。

這一編譯過程同C/C++的編譯有些不同。

當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬體平台運行而產生的。

因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。

Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定一個方法所在的地址。

這樣就有效的保證了Java的可移植性和安全性。

運行JVM位元組碼的工作是由解釋器來完成的。

解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。

裝入代碼的工作由"類裝載器"(classloader)完成。

類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。

當類裝載器裝入一個類時,該類被放在自己的名字空間中。

除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。

在本台計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。

這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。

當裝入了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。

解釋器為符號引用同特定的地址空間建立對應關系及查詢表。

通過在這一階段確定代碼的內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問

隨後,被裝入的代碼由位元組碼校驗器進行檢查。

校驗器可發現操作數棧溢出,非法數據類型轉化等多種錯誤。

通過校驗後,代碼便開始執行了。

Java位元組碼的執行有兩種方式:

1.即時編譯方式:解釋器先將位元組碼編譯成機器碼,然後再執行該機器碼。

2.解釋執行方式:解釋器通過每次解釋並執行一小段代碼來完成Java位元組碼程序的所有操作。

通常採用的是第二種方法。

由於JVM規格描述具有足夠的靈活性,這使得將位元組碼翻譯為機器代碼的工作

具有較高的效率。

對於那些對運行速度要求較高的應用程序,解釋器可將Java位元組碼即時編譯為機器碼,從而很好地保證了Java代碼的可移植性和高性能。

二.JVM規格描述

JVM的設計目標是提供一個基於抽象規格描述的計算機模型,為解釋程序開發人員提很好的靈活性,同時也確保Java代碼可在符合該規范的任何系統上運行。

JVM對其實現的某些方面給出了具體的定義,特別是對Java可執行代碼,即位元組碼(Bytecode)的格式給出了明確的規格。

這一規格包括操作碼和操作數的語法和數值、標識符的數值表示方式、以及Java類文件中的Java對象、常量緩沖池在JVM的存儲映象。

這些定義為JVM解釋器開發人員提供了所需前散的信息和開發環境。

Java的設計者希望給開發人員以隨心所欲使用Java的自由。

JVM定義了控制Java代碼解釋執行纖悔碼和具體實現的五種規格,它們是:

JVM指令系統

JVM寄存器

JVM棧結構

JVM碎片回收堆

JVM存儲區

2.1JVM指令系統

JVM指令系統同其他計算機的指令系統極其相似。

Java指令也是由操作碼和操作數兩部分組成。

操作碼為8位二進制數,操作數進緊隨在操作碼的後面,其長度根據需要而不同。

操作毀哪碼用於指定一條指令操作的性質(在這里我們採用匯編符號的形式進行說明),如iload表示從存儲器中裝入一個整數,anewarray表示為一個新數組分配空間,iand表示兩個整數的"與",ret用於流程式控制制,表示從對某一方法的調用中返回。

當長度大於8位時,操作數被分為兩個以上位元組存放。

JVM採用了"bigendian"的編碼方式來處理這種情況,即高位bits存放在低位元組中。

這同Motorola及其他的RISCCPU採用的編碼方式是一致的,而與Intel採用的"littleendian"的編碼方式即低位bits存放在低位位元組的方法不同。

Java指令系統是以Java語言的實現為目的設計的,其中包含了用於調用方法和監視多先程系統的指令。

Java的8位操作碼的長度使得JVM最多有256種指令,目前已使用了160多種操作碼。

2.2JVM指令系統

所有的CPU均包含用於保存系統狀態和處理器所需信息的寄存器組。

如果虛擬機定義較多的寄存器,便可以從中得到更多的信息而不必對棧或內存進行訪問,這有利於提高運行速度。

然而,如果虛擬機中的寄存器比實際CPU的寄存器多,在實現虛擬機時就會佔用處理器大量的時間來用常規存儲器模擬寄存器,這反而會降低虛擬機的效率。

針對這種情況,JVM只設置了4個最為常用的寄存器。

它們是:

pc程序計數器

optop操作數棧頂指針

frame當前執行環境指針

vars指向當前執行環境中第一個局部變數的指針

所有寄存器均為32位。

pc用於記錄程序的執行。

optop,frame和vars用於記錄指向Java棧區的指針。

2.3JVM棧結構

作為基於棧結構的計算機,Java棧是JVM存儲信息的主要方法。

當JVM得到一個Java位元組碼應用程序後,便為該代碼中一個類的每一個方法創建一個棧框架,以保存該方法的狀態信息。

每個棧框架包括以下三類信息:

局部變數

執行環境

操作數棧

局部變數用於存儲一個類的方法中所用到的局部變數。

vars寄存器指向該變數表中的第一個局部變數。

執行環境用於保存解釋器對Java位元組碼進行解釋過程中所需的信息。

它們是:上次調用的方法、局部變數指針和操作數棧的棧頂和棧底指針。

執行環境是一個執行一個方法的控制中心。

例如:如果解釋器要執行iadd(整數加法),首先要從frame寄存器中找到當前執行環境,而後便從執行環境中找到操作數棧,從棧頂彈出兩個整數進行加法運算,最後將結果壓入棧頂。

操作數棧用於存儲運算所需操作數及運算的結果。

2.4JVM碎片回收堆

Java類的實例所需的存儲空間是在堆上分配的。

解釋器具體承擔為類實例分配空間的工作。

解釋器在為一個實例分配完存儲空間後,便開始記錄對該實例所佔用的內存區域的使用。

一旦對象使用完畢,便將其回收到堆中。

在Java語言中,除了new語句外沒有其他方法為一對象申請和釋放內存。

對內存進行釋放和回收的工作是由Java運行系統承擔的。

這允許Java運行系統的設計者自己決定碎片回收的方法。

在SUN公司開發的Java解釋器和HotJava環境中,碎片回收用後台線程的方式來執行。

這不但為運行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風險。

2.5JVM存儲區

JVM有兩類存儲區:常量緩沖池和方法區。

常量緩沖池用於存儲類名稱、方法和欄位名稱以及串常量。

方法區則用於存儲Java方法的位元組碼。

對於這兩種存儲區域具體實現方式在JVM規格中沒有明確規定。

這使得Java應用程序的存儲布局必須在運行過程中確定,依賴於具體平台的實現方式。

JVM是為Java位元組碼定義的一種獨立於具體平台的規格描述,是Java平 *** 立性的基礎。

目前的JVM還存在一些限制和不足,有待於進一步的完善,但無論如何,JVM的思想是成功的。

對比分析:如果把Java原程序想像成我們的C++原程序,Java原程序編譯後生成的位元組碼就相當於C++原程序編譯後的80x86的機器碼(二進製程序文件),JVM虛擬機相當於80x86計算機系統,Java解釋器相當於80x86CPU。

在80x86CPU上運行的是機器碼,在Java解釋器上運行的是Java位元組碼。

Java解釋器相當於運行Java位元組碼的「CPU」,但該「CPU」不是通過硬體實現的,而是用軟體實現的。

Java解釋器實際上就是特定的平台下的一個應用程序。

只要實現了特定平台下的解釋器程序,Java位元組碼就能通過解釋器程序在該平台下運行,這是Java跨平台的根本。

當前,並不是在所有的平台下都有相應Java解釋器程序,這也是Java並不能在所有的平台下都能運行的原因,它只能在已實現了Java解釋器程序的平台下運行。

⑥ 編譯java程序需要使用什麼命令

編譯命令是 javac

  1. 首先使用記事本編輯一段簡單的Java代碼

    ⑦ 簡述JAVA程序的編輯編譯和運行過程

    第一步(編譯): 創建完源文件之後,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點象make。

    如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報「cant find symbol」的錯誤。

    第二步(運行):java類運行的過程大概可分為兩個過程:1、類的載入 2、類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去載入該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都載入到內存中,而是到不得不用的時候才把它載入進來,而且只載入一次。

    特別說明:java類中所有public和protected的實例方法都採用動態綁定機制,所有私有方法、靜態方法、構造器及初始化方法<clinit>都是採用靜態綁定機制。而使用動態綁定機制的時候會用到方法表,靜態綁定時並不會用到。

    (7)java程序源程序的編譯擴展閱讀:

    Java整個編譯以及運行的過程相當繁瑣,本文通過一個簡單的程序來簡單的說明整個流程。

    Java代碼編譯:是由Java源碼編譯器來完成;

    Java位元組碼的執行:是由JVM執行引擎來完成

    Java程序從源文件創建到程序運行要經過兩大步驟:

    1、源文件由編譯器編譯成位元組碼(ByteCode)

    2、位元組碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。

    ⑧ java源文件經過什麼命令可以被編譯為位元組碼文件

    java源文件經過javac命令可以被編譯為位元組陪手碼文件。根據查詢相關資缺亂姿料信息,javac命令會將Java源文件編伏絕譯成位元組碼文件,即.class文件,其中就包含了大量的位元組碼指令。因此可以將javac命令理解為一個翻譯命令,將源文件翻譯成Jvm可以執行的指令。

    ⑨ java程序經編譯後會產生什麼

    產生:byte codex0dx0ax0dx0aJava位元組碼是Java源文件編譯產生的中間文件x0dx0ajava虛擬機是可運行java位元組碼的假想計悔昌蔽算機 java的碧州跨平台性也是相對與其他編程語言而言的x0dx0a先介紹一下c語言的編譯過程吧先是C語言源程序 也就是c的文件經過C編譯程序編譯後,生成windows可執行文件exe文件,然後在windows中執行。再介紹java的編譯過程先是java源程序擴展名為java的文件,由java編譯程序將java位元組碼文件,就是class文件然後在java虛擬機中執行。機器碼是由CPU來執行的。Java編譯後是位元組碼, 電腦只能運行機器碼。Java在運行的時候把位元組碼變成機器碼。C/迅襪C++在編譯的時候直接編譯成機器碼。

    ⑩ 編譯java程序的命令是

    javac是Java的編譯盯櫻命令,能將源代碼編譯成位元組碼,以。class擴展名存入Java工作目錄中。Java是Java解釋器,執行位元組碼程序,該程序是類名所指的類,必須是一個完整定義的名字。javadoc是Java文檔生成器,對Java源文件和包以XML格式生成API文檔。appletviewer是Java Applet瀏覽器。

    Java是一種稿察編程語言,被特意設計用於互聯網的分布式環境。Java具有類似於C++語言的「形式和感覺」,但它要比C++語言更易於使用,而且在編程時徹底採用了凱敬叢一種「以對象為導向」的方式。

    使用Java編寫的應用程序,既可以在一台單獨的電腦上運行,也可以被分布在一個網路的伺服器端和客戶端運行。另外,Java還可以被用來編寫容量很小的應用程序模塊或者applet,做為網頁的一部分使用。applet可使網頁使用者和網頁之間進行互動式操作。

熱點內容
謎宮腳本 發布:2025-07-15 12:40:07 瀏覽:864
安卓手機語音操作在哪裡開啟 發布:2025-07-15 12:18:49 瀏覽:283
安卓導航儀上網卡插哪裡 發布:2025-07-15 12:01:58 瀏覽:453
把文件編譯成數據 發布:2025-07-15 11:53:16 瀏覽:542
mt4如何修改密碼 發布:2025-07-15 11:53:16 瀏覽:215
2021思域新款買哪個配置 發布:2025-07-15 11:33:24 瀏覽:772
路由搭建http伺服器 發布:2025-07-15 11:26:45 瀏覽:724
消遣解壓 發布:2025-07-15 11:26:43 瀏覽:393
ICL編譯 發布:2025-07-15 11:26:32 瀏覽:665
快看吧交易密碼多少 發布:2025-07-15 11:26:26 瀏覽:483