鸚鵡虛擬機器/鸚鵡內部
鸚鵡開發專案是一個大型且複雜的專案,具有多個方面。以下是有關鸚鵡構建流程的一些關鍵點的概述。此處的一些要點以前沒有討論過,但我們將在本章或後面的章節中介紹它們
- 構建環境使用 Configure.pl 程式配置。該程式是用 Perl 5 編寫的,就像 Parrot 的許多構建工具一樣。Configure.pl 確定系統上的選項,包括您使用的編譯器、使用的 Make 程式(如果有)、所需的特定於平臺的庫等等。
- PMC 是用類似 C 的指令碼編寫的,該指令碼使用 PMC 編譯器編譯成 C 程式碼。PMC 編譯器將為所有 PMC 生成 C 程式碼和相關標頭檔案,並將 PMC 註冊到 Parrot PMC 表中。
- 操作碼是用類似 C 的指令碼編寫的,該指令碼編譯成 C,就像 PMC 一樣。操作碼檔案的語法在某些方面類似於用於 PMC 的語法,但在許多方面也有所不同。Ops 檔案在編譯成機器程式碼之前被轉換成 C。
- 本機呼叫介面 (NCI) 函式簽名必須在使用 NCI 編譯器編譯之前被轉換成 C 函式
- 即時操作必須被轉換成 C 程式碼,以便編譯成本機程式碼。
- PASM 和 PIR 的解析器是用 Lex/Bison 編寫的。這些需要被編譯成 C 檔案,以便進行編譯。
- 常量字串轉換器將 CONST_STRING 宣告在編譯時轉換成字串常量。這在執行時節省了很多時間。
- Makefile 透過編譯所有 PMC、編譯所有 C 檔案、構建可執行檔案和庫等等來自動化構建過程。
在本章中,我們將概述鸚鵡虛擬機器的一些元件,後面的章節將討論各種鸚鵡子系統,包括我們上面描述的許多過程。本節中的章節都將討論鸚鵡駭客和開發。如果您對幫助開發鸚鵡不感興趣,可以跳過這些章節。
以下是 Parrot 倉庫的一般結構,就原始碼而言
有兩個用於 PIR 的解析器。第一個是 IMCC,目前正在使用,但效率低下,另一個是 PIRC,效率更高,但尚未穩定。長期計劃是在 Parrot 1.0 版本釋出時,讓 PIRC 成為主要的 PIR 解析器。
IMCC 和 PIRC 都是用 C 語言編寫的,解析器是用 Lex 和 Yacc 編寫的。
PIRC 和 IMCC 充當兩個其他 Parrot 元件的前端:位元組碼編譯器和直譯器。
位元組碼編譯器是 Parrot 的一部分,負責將輸入符號(以 PASM 或 PIR 的形式)轉換成 Parrot 位元組碼。這個位元組碼一旦編譯,就可以在 Parrot 上快速高效地執行。
另一個相關的 Parrot 元件是位元組碼最佳化器,它負責對 Parrot 位元組碼進行低階最佳化。
雖然位元組碼編譯器從 PIRC 或 IMCC 獲取輸入符號並將它們轉換成位元組碼以供儲存和以後執行,但直譯器使用這些符號直接執行程式。這意味著沒有編譯的中間步驟,並且指令碼可以在沒有編譯的情況下快速執行。
I/O 子系統控制對控制檯、檔案和作業系統的讀寫操作。許多功能是在特殊的 PMC 中執行的。
正則表示式引擎用於為 Parrot 程式提供快速的正則表示式。這個引擎的功能最明顯地體現在 PGE 中,但也存在於其他地方。Perl 6 正則表示式(這個引擎基於該表示式)與 Perl 5 正則表示式及其變體有很大的不同。
記憶體管理子系統旨在為 Parrot 和在 Parrot 之上執行的程式分配和組織記憶體。垃圾收集器檢測到分配的記憶體不再使用,並將該記憶體返回到池中以供以後分配。
Parrot 不僅僅是一個可執行程式,它也是一個可連結的庫,稱為 libparrot。 libparrot 可以連結到其他程式,並且可以在該程式內部呼叫 Parrot 直譯器物件。建立了一個完整的嵌入 API,允許 libparrot 與其他程式通訊。
Parrot 可以透過使用動態庫來擴充套件,例如 linux .so 檔案或 Windows .dll 檔案。這些擴充套件必須以安全和受控的方式與 Parrot 互動。為此,編寫了擴充套件 API,以便為擴充套件提供與 Parrot 核心通訊的通道。
接下來的幾章將重點介紹 Parrot 的各個元件。我們將討論每個元件的軟體體系結構和操作。正如我們已經看到的那樣,Parrot 本身是用 C 程式語言編寫的,儘管各個元件(例如操作碼、PMC 和其他功能)是用特殊的領域特定語言編寫的,然後被翻譯成 C 程式碼。一些更高階的功能,例如 PCT 也是用 PASM 和 PIR 編寫的。PIR 的解析器是用 Lex 和 Yacc 的組合編寫的。
Parrot 程式設計通常需要對 C 程式語言有很好的瞭解,但也需要對 Perl 5 有很好的理解。這是因為 Perl 5 用於編寫所有控制 Parrot 構建過程的開發工具。