語言處理器

weixin_34279579發表於2018-01-25

設計程式時使用的語言稱為程式設計語言,如C、C++、Java、Ruby、Python語言等。

程式設計師必須使用與程式設計語言相匹配的軟體來執行由該語言編寫的程式碼,這種軟體即語言處理器。

機器語言與組合語言

有些程式設計語言無需藉助軟體(語言處理器)執行,這些語言稱之為機器語言。機器語言可以由硬體直接解釋執行,理論上不必使用語言處理器。

然而,機器語言書寫的程式只有載入記憶體後才能通過硬體執行。因此使用者在實際使用時,必須先通過軟體從磁碟檔案系統中讀取機器語言程式,再將其複製到記憶體。不過這類程式稱不上是語言處理器,通常稱為作業系統(operating system)。

組合語言和機器語言是很容易混淆的概念,兩者並不相同。機器語言程式碼本質是一個位數很長的二進位制數字,由於它不易於閱讀,人們通過組合語言程式來表述這個巨大的數字,使其更易於理解。因此,如果要執行組合語言寫成的程式,使用者通常需要使用軟體將其轉換為機器語言。這種軟體稱為彙編程式(assembler)。彙編程式可以說是一種最基本的語言處理器。

直譯器與編譯器

語言處理器大致分為直譯器和編譯器兩種,它們的執行原理有很大地差異。

  • 直譯器

直譯器根據程式中的演算法執行運算,它是一種用於執行程式的軟體。如果執行的程式由虛擬機器器語言或類似於機器語言的程式設計語言編寫,這種軟體也能稱為虛擬機器

  • 編譯器

編譯器能將某種語言編寫的程式碼轉換*為另一種語言的程式。通常它會將原始碼轉換為機器語言程式。編譯器轉換程式的行為稱為編譯,轉換前的程式稱為原始碼或源程式。如果編譯器沒有把原始碼直接轉換為機器語言,一般稱為原始碼轉換器或原始碼轉換器(source code translator)。

程式設計語言提供何種型別的語言處理器不一而論
例如,C語言也提供直譯器卻很少使用。C語言直接通過編譯器轉換為機器語言執行。轉換後得到的機器語言程式會暫時儲存至某個檔案,需藉助作業系統來執行。

有些語言混用直譯器和編譯器
例如,Java語言首先通過編譯器把原始碼轉換為Java二進位制程式碼,並將這種虛擬的機器語言儲存在檔案中。之後,Java虛擬機器的直譯器將執行這段程式碼。

傳統狹義的編譯器將會以檔案形式儲存轉換後的程式,只要源程式沒有變更,編譯僅需執行一次,執行時間也會縮短。然後一些編譯器並不儲存轉換後的程式檔案,這種編譯器常見於直譯器內部。
例如:Java虛擬機器為了提高效能,會在執行過程中通過編譯器將一部分Java二進位制程式碼直接轉換為機器語言使用。執行過程中進行的機器語言轉換稱為動態編譯或JIT編譯(Just-In-Time compile)。轉換後得到的機器語言程式將被載入記憶體,由硬體執行,無需使用直譯器。

編譯器用途多樣,它能夠直接直譯器內部執行。此外,編譯器的作用也不侷限於將源程式轉換為機器語言。
例如:Ruby語言的直譯器內部會通過編譯器來執行預處理工作,將源程式轉換為類似於Java二進位制程式碼的虛擬機器器語言程式。直譯器真正執行的是這種經過編譯的語言,這種設計提高了執行效能。

過去人們提高編譯器時,首先會聯想到費時的編譯過程。不過由於編譯後實際執行的是機器語言,因此執行速度很快。而對於直譯器,人們通常認為它會在程式輸入的同時立即執行,執行速度較慢。這就是兩者的基本區別。現代的直譯器內部常採用各種型別的編譯器,已經越來越沒有必要將直譯器和編譯器區分看待。

語言處理流程

無論直譯器還是編譯器,語言處理器前半部分的程式結構都是大同小異的。


4933701-09e16e3abd9155d9.png
語言處理器內部處理流程
  • 原始碼首先將進行詞法分析,由一長串字串細分為更小的字串單元(單詞化),分割後的字串稱為單詞。
  • 之後處理器將執行語法分析處理,把單詞的排列轉換為抽象語法樹(AST)。
  • 至此為止,直譯器和編譯器的處理方式相同。
  • 之後編譯器會將抽象語法樹轉換為其他語言,而直譯器會一邊分析樹一邊執行運算。

相關文章