設計程序時使用的語言稱為程序設計語言念链,如C、C++贝润、Java、Ruby铝宵、Python語言等打掘。
程序員必須使用與程序設計語言相匹配的軟件來執(zhí)行由該語言編寫的代碼华畏,這種軟件即語言處理器。
機器語言與匯編語言
有些程序設計語言無需借助軟件(語言處理器)執(zhí)行尊蚁,這些語言稱之為機器語言亡笑。機器語言可以由硬件直接解釋執(zhí)行,理論上不必使用語言處理器横朋。
然而仑乌,機器語言書寫的程序只有載入內存后才能通過硬件執(zhí)行。因此用戶在實際使用時琴锭,必須先通過軟件從磁盤文件系統(tǒng)中讀取機器語言程序晰甚,再將其復制到內存。不過這類程序稱不上是語言處理器决帖,通常稱為操作系統(tǒng)(operating system)厕九。
匯編語言和機器語言是很容易混淆的概念,兩者并不相同地回。機器語言代碼本質是一個位數(shù)很長的二進制數(shù)字扁远,由于它不易于閱讀,人們通過匯編語言程序來表述這個巨大的數(shù)字刻像,使其更易于理解畅买。因此,如果要執(zhí)行匯編語言寫成的程序细睡,用戶通常需要使用軟件將其轉換為機器語言谷羞。這種軟件稱為匯編程序(assembler)。匯編程序可以說是一種最基本的語言處理器纹冤。
解釋器與編譯器
語言處理器大致分為解釋器和編譯器兩種洒宝,它們的執(zhí)行原理有很大地差異。
- 解釋器
解釋器根據程序中的算法執(zhí)行運算萌京,它是一種用于執(zhí)行程序的軟件雁歌。如果執(zhí)行的程序由虛擬機器語言或類似于機器語言的程序設計語言編寫,這種軟件也能稱為虛擬機知残。
- 編譯器
編譯器能將某種語言編寫的代碼轉換*為另一種語言的程序靠瞎。通常它會將源代碼轉換為機器語言程序。編譯器轉換程序的行為稱為編譯求妹,轉換前的程序稱為源代碼或源程序乏盐。如果編譯器沒有把源代碼直接轉換為機器語言,一般稱為源代碼轉換器或源碼轉換器(source code translator)制恍。
程序設計語言提供何種類型的語言處理器不一而論
例如父能,C語言也提供解釋器卻很少使用。C語言直接通過編譯器轉換為機器語言執(zhí)行净神。轉換后得到的機器語言程序會暫時保存至某個文件何吝,需借助操作系統(tǒng)來執(zhí)行溉委。
有些語言混用解釋器和編譯器
例如,Java語言首先通過編譯器把源代碼轉換為Java二進制代碼爱榕,并將這種虛擬的機器語言保存在文件中瓣喊。之后,Java虛擬機的解釋器將執(zhí)行這段代碼黔酥。
傳統(tǒng)狹義的編譯器將會以文件形式保存轉換后的程序藻三,只要源程序沒有變更,編譯僅需執(zhí)行一次跪者,執(zhí)行時間也會縮短棵帽。然后一些編譯器并不保存轉換后的程序文件,這種編譯器常見于解釋器內部坑夯。
例如:Java虛擬機為了提高性能岖寞,會在執(zhí)行過程中通過編譯器將一部分Java二進制代碼直接轉換為機器語言使用。執(zhí)行過程中進行的機器語言轉換稱為動態(tài)編譯或JIT編譯(Just-In-Time compile)柜蜈。轉換后得到的機器語言程序將被載入內存仗谆,由硬件執(zhí)行,無需使用解釋器淑履。
編譯器用途多樣隶垮,它能夠直接解釋器內部執(zhí)行。此外秘噪,編譯器的作用也不局限于將源程序轉換為機器語言狸吞。
例如:Ruby語言的解釋器內部會通過編譯器來執(zhí)行預處理工作,將源程序轉換為類似于Java二進制代碼的虛擬機器語言程序指煎。解釋器真正執(zhí)行的是這種經過編譯的語言蹋偏,這種設計提高了執(zhí)行性能。
過去人們提高編譯器時至壤,首先會聯(lián)想到費時的編譯過程威始。不過由于編譯后實際執(zhí)行的是機器語言,因此執(zhí)行速度很快像街。而對于解釋器黎棠,人們通常認為它會在程序輸入的同時立即執(zhí)行,執(zhí)行速度較慢镰绎。這就是兩者的基本區(qū)別∨д叮現(xiàn)代的解釋器內部常采用各種類型的編譯器,已經越來越沒有必要將解釋器和編譯器區(qū)分看待畴栖。
語言處理流程
無論解釋器還是編譯器随静,語言處理器前半部分的程序結構都是大同小異的。
- 源代碼首先將進行詞法分析吗讶,由一長串字符串細分為更小的字符串單元(單詞化)燎猛,分割后的字符串稱為單詞叼丑。
- 之后處理器將執(zhí)行語法分析處理,把單詞的排列轉換為抽象語法樹(AST)扛门。
- 至此為止,解釋器和編譯器的處理方式相同纵寝。
- 之后編譯器會將抽象語法樹轉換為其他語言论寨,而解釋器會一邊分析樹一邊執(zhí)行運算。