Perl Taiwan

May 21, 2013 at 9:30am

Perl Maven 正體中文化

Perl IDE Padre 的作者 Gabor Szabo 最近非常積極的製作了 Perl 基礎教學網站 Perl Maven,並且尋求各種語言的翻譯者。正體中文也在其列。

Gabor 利用 Gtihub 來管理此專案 的文件寫作和翻譯協作,Perl 台灣社群與其協作的方式是將此專案建立一份分支,社群成員多半直接在此分支進行翻譯,完成後發送 pull request。

如您也有興趣參與此翻譯計畫,可以至 Perl 台灣的 Facebook Group 頁面提出,並提供您的 Github 帳號,我們將會提供此專案的存取權限給您。

May 19, 2013 at 9:30am

Parrot 編譯器工具概觀

Parrot 編譯器工具(PCT)被設計來設計高階語言的編譯器和執行時期環境。抽象化和自動化撰寫 Parrot 編譯器的過程。

PCT 被切分成幾個部分:

  • Not Quite Perl (NQP)

    NQP 是一個 Perl6 的子集,不需要執行時期函式庫

  • Perl 文法引擎 (PGC)

    PGC 是 Perl6 的正規表示式實作和文法工具

  • HLL 編譯器

    HLL 編譯器幫助管理和封裝編譯過程。一個 HLL 編譯器物件被建立後,使用者就可以從命令列和編譯器互動,批量處理原始碼檔案,或是在執行時期進行執行時期求值。

文法和動作檔案

一個 PCT 為基礎的編譯器由三個基本檔案組成。主要的進入點通常被寫成 PIR,文法規格書寫給 PGE,文法動作檔案寫給 NQP。這是三個必要的組件,大部分語言都需要額外檔案來產生執行時期函式庫和其他特性。

  • 主要檔案 主要檔案通常是個 PIR 包含建立和執行編譯器物件的 :main 函式。此程式初始化一個 PCT::HLLCompiler 子類別,載入必要的支援函式庫,初始化任何編譯器或是語言指定的檔案

  • 文法檔案 高階語言的文法檔案存成 .pg 檔。包含了 PCT::Grammer 的子類別並實作所有必要的規則 —— 寫成 PGE —— 來剖析語言。

  • 動作檔案 動作檔案包含方法 —— 寫成 NQP —— 在 PCT::Grammer::Actions 物件裡,接受文法規則剖析後的資料,建立 Parrot 抽象語法樹。

PCT 的工作流程可以簡單客製化。編譯器丟出 HLL 原始碼給文法引擎。文法引擎剖析原始碼並傳回特定的匹配物件來呈現剖析後的原始碼。編譯器把匹配物件丟給動作方法,轉換成 Parrot 文法剖析樹。編譯器最後把 Parrot 文法剖析樹轉成 PIR 程式碼來存成檔案或是轉成 bytecode,或是馬上執行。

mk_language_shell.pl

PCT 包含一個工具來自動產生這些檔案:mk_language_shell.pl。這程式為你的語言自動建立新的 languages/ 資料夾,必要的三個檔案,函式庫的初始檔案,一個 setup.pir 腳本自動化建構流程,還有基本的測試鞍具來證明你的語言運作如你預期。

自動產生的檔案都是不完整的,需要額外的編輯來實作成完整語言,他們是一個好的起點。一行命令你就可以建立可用的編譯器,細節任你補完。

mk_language_shell.pl 傾向從 Parrot 倉儲執行。它接收一個參數:新專案的名字來建立專案。取名沒有一定的規則,Parrot 開發者建議所有 Parrot 為基礎的專案使用獨一無二的專案名。

參考一下 Perl5 散佈版本的名字 Active Perl 和 Strawberry Perl。Python 實作品則是 IronPython 和 Jython。Parrot 上的 Ruby 編譯器是 Cardinal。Parrot 上的 Tcl 編譯器是 Partcl。

一個全新的語言沒有這些限制。

從 Parrot 目錄可以這樣執行 mk_language_shell.pl

$ cd languages/
$ perl ../tools/dev/mk_language_shell.pl <project name>

May 17, 2013 at 10:01am

Perl 6 的尖角區塊

語意上箭號運算子 -> 幾乎是 sub 關鍵字的同義詞,當它用來宣告匿名函式,主要是用來讓你宣告這裡是一塊程式碼的識別符號。不過此尖角區塊的參數列不用以括號包圍,而且尖角區塊應該不能給予 traits。多數狀況下,一個尖角區塊使用起來就是個區塊而不像是正式的函式。語法上,尖角區塊可以用在任何區塊能出現的地方。

my $sq = -> $val { $val ** 2 }
say $sq(10)
#=> 100

my @list = 1..3;
for @list -> $elem {
    say $elem;
}
#=> 1
#=> 2
#=> 3

它的行為也很像是用來控制例外的區塊。如果你自尖角區塊 return,此區塊對於 return 來說是透明的,它會自最內圍包覆它的 sub 會是 method 區塊 return。尖角區塊被參照成 &?BLOCK 而不是 &?ROUTINE

預設上尖角區塊的參數是 readonly,就像是 sub 的預設。不過雙尖角區塊則是 rw:

for @list <-> $elem {
    $elem++;
}

這讓所有參數都是 rw

for @kv <-> $key, $value {
    $key ~= ".jpg";
    $value *= 2 if $key ~~ :e;
}

May 15, 2013 at 10:33pm

簡介 Parrot 的觀念與術語

Parrot 是 Perl6 實作品 Rakudo Star 採用的虛擬機。這裡簡單翻譯了一段 Parrot 官方網站的的簡介

指令的格式

Parrot 接受四種形式的指令。

Parrot 中介表示式(PIR)被設計得可以由人撰寫或讓編譯器產生。它隱藏一些低階細節,像是參數如何送給函式。

Parrot 組合語言(PASM)在 PIR 的底層,它依然可由人類讀寫和由編譯器產生,但是作者必須注意呼叫慣例和暫存器配置。

Parrot 抽象語法樹(PAST)讓 Parrot 可以接受語法樹風格的輸入,對撰寫編譯器很方便。

以上的格式最後都會被 Parrot 自動轉換成 Parrot 位元碼(PBC),非常接近機器碼,但是須由 Parrot 直譯器來了解。這無法由人類讀寫,但不像其他格式,這可以馬上執行,而不用經過組譯階段。PBC 是獨立於平台之外的。

指令集

Parrot 指令集包含算數,邏輯,還有比較,跳躍運算子(用來實作迴圈和 if…then 結構等等),尋找和儲存全域和語法區域變數,處理類別和物件,呼叫函式和方法並處理其參數,輸入輸出,執行緒和更多。

暫存器和基本資料型別

Parrot 虛擬機是以暫存器為基礎的。亦即是說,像是硬體 CPU,它有一些可以快速存取的單元被稱為暫存器。

Parrot 有四種暫存器:整數(I)數字(N)字串(S)和 PMCs(P) 它們都有 N 個,稱為 I0,I1…N0…等等。整數暫存器的大小和 Parrot 運行的機器其原生整數一樣,數字暫存器也被映射到原生浮點數。暫存器的量在編譯時期由每個函式決定。

PMCs

PMC 代表 Polymorphic Container 多形式容器。PMCs 表示任何複雜資料結構或是型別,包含聚合資料型別(陣列,雜湊,表,等等)。一個 PMC 可以實作算數,邏輯和字串操作的行為來操作自身,允許語言特定的行為被介紹。PMC 可以寫入 Parrot 執行檔或在需要時動態載入。

垃圾收集

Parrot 提供垃圾收集,這代表 Parrot 程式不用手動釋放記憶體 只要垃圾收集一執行,記憶體會在再也用不到的時候被釋放(也就是,再也沒有被參照到)