導航:首頁 > 源碼編譯 > 如何編譯成位元組源代碼

如何編譯成位元組源代碼

發布時間:2024-09-15 20:10:16

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>都是採用靜態綁定機制。而使用動態綁定機制的時候會用到方法表,靜態綁定時並不會用到。

閱讀全文

與如何編譯成位元組源代碼相關的資料

熱點內容
單片機比例運算電路 瀏覽:51
程序員改方案亮刀槍 瀏覽:134
無源資源碼化的作用 瀏覽:997
java內存編譯 瀏覽:161
福建節能環保無油螺桿壓縮機型號 瀏覽:525
美國紐約攝影學院pdf 瀏覽:950
如何把網頁代碼上傳到伺服器上 瀏覽:658
清理筆記本電腦灰塵解壓視頻 瀏覽:206
夜蒲聚會app是什麼軟體 瀏覽:641
任天堂如何區分伺服器 瀏覽:818
雲伺服器的運用前景 瀏覽:547
解壓視頻素材哪裡有 瀏覽:255
小米5android7 瀏覽:842
極品飛車10修改直接解壓 瀏覽:640
簡易演算法怎麼用 瀏覽:497
壓縮比101用什麼油 瀏覽:562
買白銀下什麼APP 瀏覽:842
伺服器操作台如何操作 瀏覽:245
可編程安全繼電器 瀏覽:989
兔牙喵喵喵解壓文件密碼 瀏覽:277