跳轉到內容

鸚鵡虛擬機器/鸚鵡內部

來自華夏公益教科書

鸚鵡開發流程

[編輯 | 編輯原始碼]

鸚鵡開發專案是一個大型且複雜的專案,具有多個方面。以下是有關鸚鵡構建流程的一些關鍵點的概述。此處的一些要點以前沒有討論過,但我們將在本章或後面的章節中介紹它們

  • 構建環境使用 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 倉庫的一般結構,就原始碼而言

主要鸚鵡元件

[編輯 | 編輯原始碼]

PASM 和 PIR 解析器

[編輯 | 編輯原始碼]

有兩個用於 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 子系統

[編輯 | 編輯原始碼]

I/O 子系統控制對控制檯、檔案和作業系統的讀寫操作。許多功能是在特殊的 PMC 中執行的。

正則表示式引擎

[編輯 | 編輯原始碼]

正則表示式引擎用於為 Parrot 程式提供快速的正則表示式。這個引擎的功能最明顯地體現在 PGE 中,但也存在於其他地方。Perl 6 正則表示式(這個引擎基於該表示式)與 Perl 5 正則表示式及其變體有很大的不同。

垃圾收集器和記憶體管理

[編輯 | 編輯原始碼]

記憶體管理子系統旨在為 Parrot 和在 Parrot 之上執行的程式分配和組織記憶體。垃圾收集器檢測到分配的記憶體不再使用,並將該記憶體返回到池中以供以後分配。

包檔案系統

[編輯 | 編輯原始碼]

JIT 編譯器

[編輯 | 編輯原始碼]

動態庫載入器

[編輯 | 編輯原始碼]

記憶體系統和垃圾收集器

[編輯 | 編輯原始碼]

嵌入 API

[編輯 | 編輯原始碼]

Parrot 不僅僅是一個可執行程式,它也是一個可連結的庫,稱為 libparrot。 libparrot 可以連結到其他程式,並且可以在該程式內部呼叫 Parrot 直譯器物件。建立了一個完整的嵌入 API,允許 libparrot 與其他程式通訊。

內部 API

[編輯 | 編輯原始碼]

擴充套件 API

[編輯 | 編輯原始碼]

Parrot 可以透過使用動態庫來擴充套件,例如 linux .so 檔案或 Windows .dll 檔案。這些擴充套件必須以安全和受控的方式與 Parrot 互動。為此,編寫了擴充套件 API,以便為擴充套件提供與 Parrot 核心通訊的通道。

Parrot 駭客

[編輯 | 編輯原始碼]

接下來的幾章將重點介紹 Parrot 的各個元件。我們將討論每個元件的軟體體系結構和操作。正如我們已經看到的那樣,Parrot 本身是用 C 程式語言編寫的,儘管各個元件(例如操作碼、PMC 和其他功能)是用特殊的領域特定語言編寫的,然後被翻譯成 C 程式碼。一些更高階的功能,例如 PCT 也是用 PASM 和 PIR 編寫的。PIR 的解析器是用 Lex 和 Yacc 的組合編寫的。

Parrot 程式設計通常需要對 C 程式語言有很好的瞭解,但也需要對 Perl 5 有很好的理解。這是因為 Perl 5 用於編寫所有控制 Parrot 構建過程的開發工具。


上一篇 鸚鵡虛擬機器 下一篇
構建一個編譯器 IMCC 和 PIRC
華夏公益教科書