Ⅰ python程序如何工作
隨著人工智慧時代的來臨,python成為了人們學習編程的首先語言。那麼,python程序怎麼運行的?我們下面來介紹下。
python程序執行原理
我們都知道,使用C,C++之類的編譯性語言編寫的程序,是需要從源文件轉換成計算機使用的機器語言,經過鏈接器鏈接之後形成了二進制可執行文件。運行該程序的時候,就可以二進製程序從硬碟載入到內存中並運行。
相關推薦:《Python教程》
但是對於Python而言,Python源碼不需要編譯成二進制代碼,它可以直接從源代碼運行程序。Python解釋器將源代碼轉換為位元組碼,然後把編譯好的位元組碼轉發到Python虛擬機(PVM)中進行執行。當我們運行Python程序的時候,Python解釋器會執行兩個步驟。
(1) 把源代碼編譯成位元組碼。編譯後的位元組碼是特定於Python的一種表現形式,它不是二進制的機器碼,需要進一步編譯才能被機器執行,這也是Python代碼無法運行的像C,C++一樣快的原因。如果Python進程在機器上擁有寫入許可權,那麼它將把程序的位元組碼保存為一個以.pyc為擴展名的文件,如果Python無法在機器上寫入位元組碼,那麼宇節碼將會在內存中生成並在程序結束時自動丟棄。在構建程序的時候最好給Python賦上在計算機上寫的許可權,這樣只要源代碼沒有改變,生成的.pyc文件可以重復利用,提高執行效率。
(2) 把編譯好的位元組碼轉發到Python虛擬機(PVM)中進行執行。PVM是Python Virtual Machine的簡稱,它是Python的運行引擎,是Python系統的一部分,它是迭代運行位元組碼指令的一個大循環,一個接一個地完成操作。
Ⅱ javac是什麼
Java編譯器(javac)是一個用於將Java源代碼編譯成位元組碼的程序。
拓展知識:
Java開發工具包(JDK)中的一部分,用於將Java源代碼(.java文件)轉換為Java虛擬機(JVM)可以執行的位元組碼。
當您編寫Java源代碼時,您需要使用一個文本編輯器或集成開發環境(IDE)來編寫代碼。當您保存文件時,文件將保存為.java文件。然後,您可以使用javac編譯器將這些.java文件編譯成位元組碼文件,這些文件可以在Java虛擬機上運行。
在編譯過程中,javac編譯器將讀取.java文件,將其轉換為位元組碼文件(通常為.class文件),這些文件包含Java代碼的機器代碼表示。這些位元組碼文件可以在任何支持Java虛擬機的平台上運行,而無需安裝或理解特定的本地代碼。此外,javac編譯器還具有一些其他功能,例如錯誤檢查和優化。它會在編譯過程中檢查代碼中的錯誤,並嘗試優化位元組碼以減少內存使用和提高執行速度。
總的來說,javac編譯器是Java開發過程中不可或缺的一部分,它可以將Java源代碼轉換為可在Java虛擬機上運行的位元組碼,並提供錯誤檢查和優化功能,以提高開發效率和代碼質量。
Ⅲ Java的詳細運行步驟
Java程序從源文件創建到程序運行要經過兩大步驟:1、源文件由編譯器編譯成位元組碼(ByteCode)
2、位元組碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。
下面通過以下這個java程序,來說明java程序從編譯到最後運行的整個流程。代碼如下:
//MainApp.java
public class MainApp {
public static void main(String[] args) {
Animal animal = new Animal("Puppy");
animal.printName();
}
}
//Animal.java
public class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
public void printName() {
System.out.println("Animal ["+name+"]");
}
}
第一步(編譯): 創建完源文件之後,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點象make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報「cant find symbol」的錯誤。
編譯後的位元組碼文件格式主要分為兩部分:常量池和方法位元組碼。常量池記錄的是代碼出現過的所有token(類名,成員變數名等等)以及符號引用(方法引用,成員變數引用等等);方法位元組碼放的是類中各個方法的位元組碼。下面是MainApp.class通過反匯編的結果,我們可以清楚看到.class文件的結構:
第二步(運行):java類運行的過程大概可分為兩個過程:1、類的載入 2、類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去載入該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都載入到內存中,而是到不得不用的時候才把它載入進來,而且只載入一次。
下面是程序運行的詳細步驟:
在編譯好java程序得到MainApp.class文件後,在命令行上敲java AppMain。系統就會啟動一個jvm進程,jvm進程從classpath路徑中找到一個名為AppMain.class的二進制文件,將MainApp的類信息載入到運行時數據區的方法區內,這個過程叫做MainApp類的載入。
然後JVM找到AppMain的主函數入口,開始執行main函數。
main函數的第一條命令是Animal animal = new Animal("Puppy");就是讓JVM創建一個Animal對象,但是這時候方法區中沒有Animal類的信息,所以JVM馬上載入Animal類,把Animal類的類型信息放到方法區中。
載入完Animal類之後,Java虛擬機做的第一件事情就是在堆區中為一個新的Animal實例分配內存, 然後調用構造函數初始化Animal實例,這個Animal實例持有著指向方法區的Animal類的類型信息(其中包含有方法表,java動態綁定的底層實現)的引用。
當使用animal.printName()的時候,JVM根據animal引用找到Animal對象,然後根據Animal對象持有的引用定位到方法區中Animal類的類型信息的方法表,獲得printName()函數的位元組碼的地址。
開始運行printName()函數。
特別說明:java類中所有public和protected的實例方法都採用動態綁定機制,所有私有方法、靜態方法、構造器及初始化方法<clinit>都是採用靜態綁定機制。而使用動態綁定機制的時候會用到方法表,靜態綁定時並不會用到。