導航:首頁 > 源碼編譯 > java編譯和解釋流程圖

java編譯和解釋流程圖

發布時間:2022-05-16 23:20:58

㈠ 簡述java程序的編輯編譯和運行過程

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

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

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

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

(1)java編譯和解釋流程圖擴展閱讀:

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

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

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

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

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

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

㈡ 編譯型和解釋型的區別&amp;Java從編譯到執行的過程

Java這個語言很非凡。
二、你可以說它是解釋型的。因為java代碼編譯後不能直接運行,它是解釋運行在JVM上的,所以它是解釋運行的,那也就算是解釋的了。
三、但是,現在的JVM為了效率,都有一些JIT優化。它又會把.class的二進制代碼編譯為本地的代碼直接運行,所以,又是編譯的。
像C、C++ 他們經過一次編譯之後直接可以編譯成操作系統了解的類型,可以直接執行的 所以他們是編譯型的語言。沒有經過第二次的處理 而Java不一樣他首先由編譯器編譯成.class類型的文件,這個是java自己類型的文件 然後在通過虛擬機(JVM)從.class文件中讀一行解釋執行一行,所以他是解釋型的語言,而由於java對於多種不同的操作系統有不同的JVM所以
Java實現了真正意義上的跨平台!
請觀看下面兩張圖 了解一下Java的虛擬機機制:
(1)java語言的編譯--解釋---執行過程
(2)java的虛擬機
定義:編譯型語言:把做好的源程序全部編譯成二進制代碼的可運行程序。然後,可直接運行這個程序。
解釋型語言:把做好的源程序翻譯一句,然後執行一句,直至結束!區別:編譯型語言,執行速度快、效率高;依靠編譯器、跨平台性差些。
解釋型語言,執行速度慢、效率低;依靠解釋器、跨平台性好。
個人認為,java是解釋型的語言,因為雖然java也需要編譯,編譯成.class文件,但是並不是機器可以識別的語言,而是位元組碼,最終還是需要 jvm的解釋,才能在各個平台執行,這同時也是java跨平台的原因。所以可是說java即是編譯型的,也是解釋型,但是假如非要歸類的話,從概念上的定義,恐怕java應該歸到解釋型的語言中。

㈢ 編譯型和解釋型的區別&Java從編譯到執行的過程

編譯執行:

編譯執行是一種計算機語言的執行方式。由編譯程序將目標代碼一次性編譯成目標程序,再由機器運行目標程序(效率高於解釋執行)

解釋執行:

使用解釋執行的程序我們一般稱為解釋程序。它將源語言直接作為源程序輸入,解釋執行解釋一句後就提交計算機執行一句,並不形成目標程序。解釋執行不依賴於平台。

Java從編譯到執行的過程:




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

Java虛擬機(JVM)是可運行Java代碼的假想計算機。只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統上運行。本文首先簡要介紹從Java文件的編譯到最終執行的過程,隨後對JVM規格描述作一說明。

一.Java源文件的編譯、下載、解釋和執行
Java應用程序的開發周期包括編譯、下載、解釋和執行幾個部分。Java編譯程序將Java源程序翻譯為JVM可執行代碼?位元組碼。這一編譯過程同C/C++的編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬體平台運行而產生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。

運行JVM位元組碼的工作是由解釋器來完成的。解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。裝入代碼的工作由"類裝載器"(class loader)完成。類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本台計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用同特定的地址空間建立對應關系及查詢表。通過在這一階段確定代碼的內存布局,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採用了"big endian"的編碼方式來處理這種情況,即高位bits存放在低位元組中。這同 Motorola及其他的RISC CPU採用的編碼方式是一致的,而與Intel採用的"little endian "的編碼方式即低位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解釋器和Hot Java環境中,碎片回收用後台線程的方式來執行。這不但為運行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風險。

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語言編譯和解釋執行的具體過程是怎樣的

Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的介面。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。在Java中,這種供虛擬機理解的代碼叫做位元組碼(ByteCode),它不面向任何特定的處理器,只面向虛擬機。每一種平台的解釋器是不同的,但是實現的虛擬機是相同的。Java源程序經過編譯器編譯後變成位元組碼,位元組碼由虛擬機解釋執行,虛擬機將每一條要執行的位元組碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然後在特定的機器上運行。

㈥ 簡述Java應用程序的開發流程

分為網頁和桌面的應用開發

網頁或者桌面開發流程
項目啟動1)、項目組成立(公司成員、客戶成員)
2)、制定項目預期目標
3)、制定項目計劃周期
4)、建立好項目組成員溝通機制


2、需求調研
1)、創建調研計劃、協調調研時間
2)、收集客戶資料,獲取客戶需求所有的資料都需要保留一份,資料中存疑的需要及時詢問
3)、編寫需求文檔重點描述出客戶的業務流程和性能要求。採用Word、Excel、Rose等形式。
4)、需求變更記錄
5)、確定開發環境和運行環境
6)、擴展性要求
7)、與舊系統的接駁要求。
8)、估算出項目工作量本階段需要一套需求管理系統來進行需求的管理。本階段的需求文檔也是用戶測試的依據。


3、系統設計/詳細設計一個系統可以分為基礎平台和應用模塊兩部分。
1)、選擇基礎平台,無論是採用第三方平台還是自行開發平台,都需要深入了解,查看是否符合要求。
2)、應用模塊設計(針對業務流程)
3)、中間件的採用或自行開發,需要深入了解。
4)、用戶界面的設計如果用戶界面設計完畢並確認,即可初步寫出用戶使用手冊、管理員使用手冊。
5)、變更記錄本階段的系統設計是集成測試的依據。

4、程序開發創建開發任務計劃表、開發計劃日程表
1)、優先編寫測試用例
2)、按照編碼規范編寫代碼
3)、按照文檔注釋規范注釋以上形成開發文檔。本階段需要一套版本管理系統。本階段的測試用例也是單元測試的依據。如果能做到,最好每日構建。

5、測試本階段需要一套Bug管理系統,形成需求、設計、開發、測試互動。
1)、編寫測試計劃和測試方案
2)、功能測試單元測試、集成測試
3)、性能測試集成測試、壓力測試如果能做到,最好能進行自動化測試。如果能做到,做分析統計工作。最後形成測試報告。
6、試用、培訓、維護本階段需要解決:
1)、解決異地修改和公司修改的同步問題。
2)、用戶測試中的Bug修改問題,按照級別分為a)、程序Bugb)、設計變更c)、需求變更盡量按照a b c的順序來進行修改,盡量避免b、c級的修改。最後形成安裝手冊、維護記錄。

㈦ java是編譯型的還是解釋型的

Java這個語言很非凡。 二、你可以說它是解釋型的。因為java代碼編譯後不能直接運行,它是解釋運行在JVM上的,所以它是解釋運行的,那也就算是解釋的了。 三、但是,現在的JVM為了效率,都有一些JIT優化。它又會把.class的二進制代碼編譯為本地的代碼直接運行,所以,又是編譯的。 像C、C++ 他們經過一次編譯之後直接可以編譯成操作系統了解的類型,可以直接執行的 所以他們是編譯型的語言。沒有經過第二次的處理 而Java不一樣他首先由編譯器編譯成.class類型的文件,這個是java自己類型的文件 然後在通過虛擬機(JVM)從.class文件中讀一行解釋執行一行,所以他是解釋型的語言,而由於java對於多種不同的操作系統有不同的JVM所以 Java實現了真正意義上的跨平台! 請觀看下面兩張圖 了解一下Java的虛擬機機制: (1)java語言的編譯--解釋---執行過程 (2)java的虛擬機 定義:編譯型語言:把做好的源程序全部編譯成二進制代碼的可運行程序。然後,可直接運行這個程序。 解釋型語言:把做好的源程序翻譯一句,然後執行一句,直至結束!區別:編譯型語言,執行速度快、效率高;依靠編譯器、跨平台性差些。 解釋型語言,執行速度慢、效率低;依靠解釋器、跨平台性好。 個人認為,java是解釋型的語言,因為雖然java也需要編譯,編譯成.class文件,但是並不是機器可以識別的語言,而是位元組碼,最終還是需要 jvm的解釋,才能在各個平台執行,這同時也是java跨平台的原因。所以可是說java即是編譯型的,也是解釋型,但是假如非要歸類的話,從概念上的定義,恐怕java應該歸到解釋型的語言中。

㈧ JAVA程序的流程圖

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Drawing extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
// 實例化一個文本域
JTextField tf = new JTextField();
// 設置兩個按鈕
JButton b1 = new JButton("開始");
JButton b2 = new JButton("停止");
boolean isGo = false;

public Drawing() {
b1.setActionCommand("start");// 在開始按鈕上設置一個動作監聽 start
JPanel p = new JPanel();// 創建一個面板容器,用於放置組件
// 將兩個按鈕添加到可視化容器上面,用add方法
p.add(b1);
p.add(b2);
// 在兩個按鈕上增加監聽的屬性,自動調用下面的監聽處理方法actionPerformed(ActionEvent
// e),如果要代碼有更好的可讀性,可用內部類實現動作
// 監聽處理。
b1.addActionListener(this);
b2.addActionListener(this);
// 將停止按鈕設置為不可編輯(即不可按的狀態)
b2.setEnabled(false);
// 將上面的文本域放在面板的北方,也就是上面(上北下南左西右東)
this.getContentPane().add(tf, "North");
// 將可視化容器pannel放在南邊,也就是下面
this.getContentPane().add(p, "South");
// 設置用戶在此窗體上發起"close"時默認執行的操作,參數EXIT_ON_CLOSE是使用
// System exit方法退出應用程序。僅在應用程序中使用
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 200);// 設置面板大小,寬和高
this.setLocation(300, 300);// 設置面板剛開始的出現的位置
// 用指定名稱創建一個新的定製游標對象,參數表示手狀游標類型
Cursor cu = new Cursor(Cursor.HAND_CURSOR);
// 為指定的游標設置游標圖像,即設置游標圖像為上面所創建的手狀游標類型
this.setCursor(cu);
// 將面板可視化設置為true,即可視,如果為false,即程序運行時面板會隱藏
this.setVisible(true);
// 設置面板的標題為歡迎
tf.setText("welcome to this program! ");
this.go();// 調用go方法

}

public void go() {
// 這里是死循環,也就是說用戶不點擊停止按鈕的話他一直循環出現隨機數,直到用戶點
// 擊停止按鈕循環才能推出,具體流程在actionPerformed方法中控制。
while (true) {
// 上面所定義的isGo的初始值為false,所以程序第一次到此會跳過
if (isGo == true) {
String s = "";
// 產生7個隨機數
for (int j = 1; j <= 7; j++) {
// 每個隨機數產生方式,這里定義靈活,可以自由定義隨機數產生的方式
int i = (int) (Math.random() * 36) + 1;
// 如果產生的隨機數小於10的話做處理:這里就牽扯到一個重要的概念,簡單敘述一下:
if (i < 10) {
s = s + " 0" + i;
/*
* 當一個字元串與一個整型數項相加的意思是連接,上面的s = s + " 0" +
* i的意思是字元串s鏈接0再連接整型i值,而不會導致0和整型的i相加,
* 產生的效果為s0i,由於s為空字元串(上面定義過的),所以當i小於零時,在個位數前面加上0,比如產生的隨機數i為7的話,顯示效果為
* 07.
*/
} else {
// 如果產生的隨機數比10打的話,那麼加上空格顯示,即數字和數字之間有個空格
s = s + " " + i;
}
// 以上循環循環七次,以保證能出現7個隨機數
}
// 將產生的隨機數全部顯示在文本域上,用文本域對象tf調用它的
//設置文本的方法setText(String)實現。
tf.setText(s);
}
try {
// 以下為線程延遲
Thread.sleep(10);
} catch (java.lang.InterruptedException e) {
e.printStackTrace();
}

}

}
// 以下是上面設置的事件監聽的具體處理辦法,即監聽時間處理方法,自動調用
public void actionPerformed(ActionEvent e) {// 傳入一個動作事件的參數e
// 設置字元串s來存儲獲得動作監聽,上面的start
String s = e.getActionCommand();
/*
* 以下這個條件語句塊的作用為:用戶點擊開始後(捕獲start,用方法getActionCommand()),將命令觸發設置為true,從而執行上面的go方法中的循環體(因為循環體中要求isGo參數為true,而初始為false)。
* 執行循環快產生隨機數,並將開始按鈕不可編輯化,而用戶只可以使用停止按鈕去停止。如果用戶按下停止時,也就是沒有傳入參數「start」的時候,
* 執行else語句塊中的語句,isGo設置為false,將不執行上面go中的循環語句塊,從而停止產生隨機數,並顯示,並且把開始按鈕設置為可用,而把
* 停止按鈕設置為不可用,等待用戶按下開始再去開始新一輪循環產生隨機數。
*/
// 如果捕獲到start,也就是用戶觸發了動作監聽器,那麼下面處理
if (s.equals("start")) {
isGo = true; // 設置isGo為true
b1.setEnabled(false); // 將開始按鈕設置為不可用
b2.setEnabled(true); // 將停止按鈕設置為可用
} else {
isGo = false; // 將isGo設置為false,isGo為循環標志位
b2.setEnabled(false); // 設置停止按鈕為不可用(注意看是b2,b2是停止按鈕)
b1.setEnabled(true); // 設置開始按鈕為可用
}

}

public static void main(String[] args) {
new Drawing();// 產生類的實例,執行方法
}
// 聖誕平安夜了,祝朋友開心快樂!
}

閱讀全文

與java編譯和解釋流程圖相關的資料

熱點內容
汽車小壓縮機拆解 瀏覽:825
雲桌面卡是因為伺服器的原因嗎 瀏覽:377
qd123壓縮機 瀏覽:969
pn532讀取加密門禁卡 瀏覽:85
win10文件夾屬性里無法加密 瀏覽:34
比特幣加密的條件 瀏覽:848
求購現成影視app源碼 瀏覽:572
wdsecurity加密版 瀏覽:813
雲伺服器和雲豐雲 瀏覽:188
伺服器如何設置獨立ip 瀏覽:857
tar命令打包文件夾 瀏覽:1000
刪除linux用戶和組 瀏覽:548
小米的程序員都用什麼筆記本 瀏覽:703
位元組三面演算法題 瀏覽:971
伺服器保護有什麼好處 瀏覽:894
全部下載完後進行統一解壓 瀏覽:393
遠嫁的程序員媽媽 瀏覽:555
1024程序員節安全攻防挑戰賽 瀏覽:786
怎麼解除txt加密 瀏覽:772
javahttp流 瀏覽:656