java代碼從輸入到輸出的整個過程

一直以來都想着,能用一篇完整的文章,來去描述一個計算機過程.而這個過程,能概括平生所說到的任何計算知識.

在大學期間曾經學過C/C++,彙編,計算機組成原理,微機原理與接口技術,計算機系統結構,操作系統,編譯原理,數據庫技術,而後是JAVA等等.如何把它們串聯起來,形成一個知識體系?

一切都得從實際出發,沒有人願意一上來就看到長篇的理論知識!於是,我選擇了一個可執行的java代碼來開始這個過程之旅.

非常簡單的一個java源代碼:
package com.onlyer.test;

public final class TestClass {

private int id = 1234567;

public void test() {
id++;
}

public int getId() {
return this.id;
}

public static void main(String[] args) {
TestClass test = new TestClass();
test.test();
System.out.println(test.getId());
}

}
TODO:解釋這段java代碼.

一. 編譯過程

當然,我們首先得把這個java編譯成class文件,假設我們使用的是java內置的編譯工具來進行編譯,定位到正確的路徑,然後在命令提示符裏輸入:
javac com.onlyer.test.TestClass
一人完整的編譯器編譯的是源代碼,輸出的是目標代碼。一個完整的編譯過程包括對源代碼進行詞法分析,語法分析,語義分析,源代碼優化,中間代碼生成,目標代碼優化,最終產生能被機器所識別的目標代碼。

而javac的編譯過程顯然沒有包括所有的階段,我們可以簡單地分析下。微機只能識別自己定義機器指令,比如IA32有自己的指令系統。操作系統能把代碼都解釋成這些微機的機器指令,再由CPU執行。目標代碼的定義是能直接爲操作系統所識別的代碼,也就是說,目標代碼是跟操作系統綁定的。而java能夠跨平臺,java class能爲不同的操作系統所識別,它必定不可能是目標代碼,不然就必定存在多個版本的java class了。事實上,把java class定義在中間代碼階段,是實現跨平臺的基礎。當然,java class也不是說能直接被操作系統識別,確切來說是能被JVM識別,JVM就是一個虛擬機器,有虛擬CPU,輸入輸出等設備,注意,是虛擬的。java class再被JVM調用操作系統API,生成JVM指令,JVM指令經過JVM解釋成操作系統能識別的代碼,再轉化成指令到真正的微機去執行。從這個過程來說,中間代碼的運行效率當然是比不上目標代碼的運行效率的。

二. 運行過程


一) java虛擬機的啓動過程(java.exe進程的產生)

二)在多線程操作系統中線程的產生

三) java class在虛擬機的運行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章