跳轉到內容

鸚鵡虛擬機器/執行鸚鵡

來自 Wikibooks,開放世界中的開放書籍

執行鸚鵡

[編輯 | 編輯原始碼]

鸚鵡可以在命令列中以多種模式執行,並具有許多不同的選項。鸚鵡可以直接處理三種形式的輸入:鸚鵡組合語言 (PASM),這是一種面向虛擬機器的低階人類可讀組合語言,鸚鵡中間表示 (PIR),它是在 PASM 之上的一個語法覆蓋層,對某些表示式具有更友好的語法,以及鸚鵡位元組碼 (PBC),它是一種編譯後的二進位制輸入格式。

PIR 和 PASM 在正常執行過程中被轉換為 PBC。只有 PBC 可以被 Parrot 直接執行。從 PIR 或 PASM 轉換為 PBC 的編譯階段需要一些時間,並且可以單獨完成。我們將在稍後討論這些過程。

鸚鵡資訊

[編輯 | 編輯原始碼]

要獲取有關當前鸚鵡版本的的資訊,請鍵入

parrot -V

要獲取命令列選項及其用途的列表,請鍵入

parrot -h

我們將在本書的後面部分討論所有各種命令列選項,但當問題出現時,擁有多種資源總是一件好事。

檔案型別

[編輯 | 編輯原始碼]

.pbc 結尾的檔案被視為鸚鵡位元組碼檔案,並立即執行。以 .pir.pasm 結尾的檔案分別被視為 PIR 或 PASM 原始碼檔案,並被解釋執行。要將 PIR 或 PASM 編譯成位元組碼,請使用 -o 開關,例如

parrot -o output.pbc input.pir

或者

parrot -o output.pbc input.pasm

注意,如果我們使用 .pasm 副檔名,我們可以輸出到 PASM 而不是 PBC。

parrot -o output.pasm input.pir

要強制輸出 PBC,即使輸出檔案沒有 .pbc 副檔名,請使用 --output-pbc 開關。要在你生成 PBC 檔案後執行它,請使用 -r 開關。

要強制將檔案作為 PASM 執行,無論副檔名如何,請使用 -a 開關。

要強制將檔案作為 PBC 檔案執行,無論副檔名如何,請使用 -c 開關。

執行時選項

[編輯 | 編輯原始碼]

鸚鵡還可以使用許多其他選項來執行。

最佳化

[編輯 | 編輯原始碼]

最佳化可能需要一些時間來執行,但會提高生成的程式的執行速度。對於簡單的程式、短而粗糙的一次性程式,大量的最佳化可能沒有多大意義。你可能花費更多時間最佳化一段軟體,而不是執行它。但是,對於經常執行的程式、非常大的程式或必須持續執行且效能良好的程式,最佳化可能是一件有價值的事情。使用最佳化編譯程式一次,並將輸出的最佳化位元組碼儲存到磁碟,這樣就不需要再次最佳化(除非 Parrot 集成了更好的最佳化)。

鸚鵡有多種最佳化選項,具體取決於要執行的最佳化的程度。每個選項都可以使用不同的命令列開關啟用,格式為 -Ox,其中 x 是代表要執行的最佳化型別的字元。

標記 描述
-O0 沒有最佳化,這是預設模式
-O1-O 沒有生命資訊(例如分支)的最佳化
-O2 具有生命資訊的最佳化
-Op 重新寫入 I 和 N PASM 暫存器,最常用的暫存器排在最前面
-Ot 選擇最快的執行核心(在 -O1 和 -O2 下預設為該核心)
-Oc 開啟可選/實驗性的尾遞迴最佳化

生命資訊 是一個分析步驟,其中程式碼和資料被跟蹤,以確定控制流模式和區域性變數的生命週期。瞭解某些變數使用和不使用的地方,可以讓暫存器被重複使用,而不是必須分配新的暫存器。瞭解某些程式碼何時是不可到達的,可以讓最佳化器完全忽略它。

執行核心

[編輯 | 編輯原始碼]

執行核心是鸚鵡程式的中心迴圈,有多個不同的執行核心可用,它們指定了 Parrot 的效能和功能。執行核心決定了 parrot 如何執行傳遞到直譯器的位元組碼指令。執行核心可以執行某些任務,例如邊界檢查、測試或除錯。其他執行核心已被最佳化,可以非常快速地執行。有關各種核心的實現細節,請參閱 src/runops_cores.c

可以透過在命令列傳遞特定開關來啟用不同的核心。以下部分將討論各種執行核心,它們的作用、工作原理以及如何啟用它們。

基本核心

[編輯 | 編輯原始碼]

慢速核心

[編輯 | 編輯原始碼]

預設的 "慢速" 核心將所有操作視為單獨的 C 函式。每個函式被呼叫,並返回下一條指令操作的地址。許多核心,例如跟蹤核心和除錯核心,都是基於慢速核心設計的。

快速核心

[編輯 | 編輯原始碼]

快速核心是一個簡陋的核心,不執行任何特殊操作,例如跟蹤、除錯或邊界檢查。

計算轉到核心

[編輯 | 編輯原始碼]

計算轉到是某些編譯器的一項功能,它允許 goto 指令的目標是一個包含標籤地址的變數,而不是直接到一個標籤。透過將所有標籤的地址快取到一個數組中,跳轉可以直接到達必要的指令。這避免了多次子例程呼叫的開銷,並且在支援它的平臺上可以非常快。有關計算轉到執行核心的工作原理的更多資訊,請參閱生成的 src/ops/core_ops_cg.c 檔案。

切換核心

[編輯 | 編輯原始碼]

切換核心使用標準的 C switchcase 結構來選擇要執行的下一條操作。在每次迭代時,都會執行一次 switch,每個 case 代表一個操作。操作執行完畢後,控制流會跳轉回 switch 的開頭,並重復迴圈。

switch 語句,尤其是使用許多連續值的語句,通常會被編譯器轉換為跳轉表,其效能與計算轉到跳轉非常相似。

變體核心

[編輯 | 編輯原始碼]

以上核心是其他專用核心的基礎設計。

mod_parrot

[編輯 | 編輯原始碼]

Parrot 團隊的某些成員開發了 Apache Web 伺服器的擴充套件,允許 Parrot 用於生成伺服器端內容。這項工作的成果是 mod_parrot,它可以用來使用 PIR 或 PASM 生成網站。它本身的用途有限。但是,mod_parrot 允許為目標為 Parrot 的語言建立額外的模組。像這樣的一個值得注意的模組是 mod_perl6,它是一個在 mod_parrot 之上執行的位元組碼模組。

有關 mod_parrot 的更多資訊,請訪問其網站:http://www.parrot.org/mod_parrot


上一個 鸚鵡虛擬機器 下一個
Building_Parrot Parrot_Programming
華夏公益教科書