2010.07.19
Perl 6 十周年慶: 前言 (五之一)
(This is a translation of masak++'s excellent Perl 6 anniversary post, part 1 of 5.)
(這是 masak++ 一篇網誌的中譯,分五部刊出,這是第一部份。)
十年前的今天,Jon Orwant 在一場會議上摔咖啡杯。
據維基百科記載,Perl 6 計劃是從十年前的七月十九日開始的。
而前一天的擲杯事件,可以說是觸發 Perl 6 誕生的火苗。
Jon 為什麼要扔杯子呢?請看 Larry Wall 的口述歷史:
頭一小時裡,我們討論的都是些無聊沉悶的政治組織問題。
開會開到一半,Jon Orwant 走進房間,站在一邊聽了幾分鐘。
然後他很淡定地走向咖啡桌,上面大約有20個咖啡杯。
他拿起一個杯子,往對面的牆壁扔去。然後再丟一個。
他邊扔邊說: 「我們得想想辦法激勵社群,不然就都完了。大家越來越無聊,都去做別的事了。」
他說對了。原本他也許是想辦一場更大的 Perl 會議,或是讓 Perl 某些功能更強等等。但他說得很對, 他刺激了我們。
他接著說: 「我不管你們怎麼做,可你們得搞些大事出來。」然後他掉頭就走。
你要知道,這是我見過最完美的一場暴走。如果你認識 Jon,就會知道他很能自制。
他發這場脾氣完全是事前計劃好的。非常驚人。
我當時就想: 「我是不是也該站起來摔杯子呢?」
在構思這篇網誌時,我只聽說過這件事,但不確定它是哪天發生的。我上網查了些資料,還是找不到確切的日期。
不過,我找到了一份電子郵件,上面列出了有哪些人在場,以及 Jon 到底丟了幾個杯子。
最後,我決定在 IRC 頻道上直接問 Larry。接下來這段充滿雙關的對話紀錄,很能代表 #perl6 的氣氛:
masak: 對了,那些杯子是前一天扔的。
那些?我以為只扔了一個杯子!
jnthn: 五個。
jnthn: 不過,只有一個摔破了。
TimToady: 感謝。這樣我還來得及寫周年紀念文。
masak: 礸!
我當時應該把碎片留作紀念的。
「Perl 6: 相容性、咖啡杯,2000 年起都砸碎。」
* pmichaud 打開 photoshop, 準備放上 cafepress
pmichaud: 「Perl 6: 打破杯具,再創豐杯。」
「語言有難時,請擊碎此杯。」
「Perl 6: 比 Perl 5 更牆一杯。」
「Perl 6 大破大立、碎碎平安!」
"if $杯 === all @碎片 {say '夠了,太杯撞了!'}
你杯得動的。:P
* masak 笑到杯桁了
「Jon 為什麼要扔甜甜圈呢?」 -- 拓樸學家
:P
「這是碎杯。 這是你嗑了碎杯的腦袋。 有問題嗎?」
「Perl 6: 十年聖杯碎,今請尋其蹤。」
「杯比怎麼昇出來的?」
都被 Jon Orwant 搞大了。
五杯無寸鐵,何人竟害之!
我為清潔工祈倒。
「Perl 6: 杯已擲下。」
Perl 6 至今已有十年的歷史了。接下來,我會從(主要是)我個人的觀點,敘述這十年來的經過。
除了紀錄史實之外,我也希望能分享我對這個專案的熱情,以及為什麼我認為 Jon Orwant 的一擲,造就了現代程式語言史上最酷的計劃之一。
2010.07.21
Perl 6 十周年慶: 遠古時期 (五之二)
(This is a translation of masak++'s excellent Perl 6 anniversary post, part 2 of 5.)
(這是 masak++ 為慶祝“樂土專案”即將正式發行所寫的紀念文章的中譯。)
也許你聽說過 Perl 6 最初的「徵求建議(RFC)」過程 。當時 Perl 6 才剛開始,連 Larry Wall 都還不知道要朝哪個方向發展。
於是,Perl 社群建了一套系統,公開徵求對語言功能的建議。
系統上線時,團隊原本估計會收到大約 20~30 份建議書。
結果,總共收到了 361 份!
建議書不只是數量多,而且涵蓋的範圍五花八門,甚至互相衝突。大部份的建議只考慮到一個面向,完全沒有考慮到它會對整體語言造成什麼影響。
如果當時我們竟然把所有建議都實作出來的話,結果也許會像這頭著名的 Perl 6 大怪獸一樣吧。
除此之外,社群對建議書的後續討論裡,往往缺乏「如何實作」的細節。Mark-Jason Dominus 對 Perl 6 RFC 過程的評論如下:
於是「誰來幫貓掛鈴鐺」的問題就出現了。人們提出各種各樣的功能,然後不停討論細節,但其實這些功能根本沒辦法實現。 [...]
這讓討論失去焦點,難以集中到實際可行的權衡取捨上。[...]
最後,就我個人而言,我覺得這種「不求甚解」的態度相當惱人。它讓很多實際瞭解 Perl 內部細節的人不想參與討論。
最後還是 Larry Wall 獨力接下了整合 RFC 的重任,將它們融會貫通成完整的構思。他發佈的文件統稱「啟示錄」,對 RFC 分門別類、逐項點評:有的獲得採納,有的部份保留,也有些遭到駁回。
啟示錄的編號,依照駱駝書的章節順序排列:舉例來說,和第三章「算符」相對應的「啟示錄三」,講的就是 Perl 6 裡該具備哪些算符。
以下是所有已發佈的啟示錄:
啟示錄一,2001年5月
啟示錄二,2001年5月
啟示錄三,2001年10月
啟示錄四,2002年1月
啟示錄五,2002年6月
啟示錄六,2003年3月
啟示錄十二,2004年4月
2001 ~ 2004 這三年,可說是 Perl 6 從眾人的意見中逐漸淬煉成形的階段。
與「啟示錄」同時發佈的,還有由 Perl 6 的主要設計者之一 Damian Conway 撰寫的「注疏」。
「啟示錄」注重的是語言的藍圖,以及功能的去留與否。「注疏」則負責展示如何使用新的功能,並對 Perl 5 程式員解釋 Perl 6 提供了哪些改進。
此刻我重讀「注疏」,覺得特別有趣的是當年「Perl 6 只是 Perl 5 的新分支」這個想法。當時的 Perl 6 已經作出許多細部的改進,但是 Damian 在「注疏二」裡,介紹完一長段 Perl 6 程式後,仍然如此敘述:
…事實上,這支程式總共 1779 字,和 Perl 5 的版本之間只差 40 個字。而且幾乎都只是把陣列取值從 $x[…] 改成 @x[…] 而已。不用靠 p52p6 自動翻譯,就有 98% 的相容性… 還不賴!
這個想法如今已然不再。如果你到 #perl6 頻道上問「Perl 6 和 Perl 5 像不像?」我們會這樣回答:雖然這兩種語言的基本概念和目的相以,但是語法卻大有不同。所以,最好把 Perl 6 當作新的語言來學,而不是用寫 Perl 5 的角度來思考。
在 2004 年,Perl 6 團隊對啟示錄作出摘要,去除闡釋的段落,發佈成足以作為語言規格的幾篇「綱要」,以供實作團隊參考。「綱要」雖然言簡意賅,但對於想深入瞭解 Perl 6 語言的人來說,仍然是不可或缺的一批文件。
作為 Perl 6 語言的定義,「綱要」一直持續更新至今。在 perlcabal.org 上,目前共有 33 篇綱要。其中的 S02 ~ S06 已經相當穩定,偶爾有些小幅更動。其餘部份則仍然處於草案階段,有待實作者及使用者的後續回饋,來讓它們更臻完善。
與此同時,許多實作 Perl 6 的計劃紛紛出現,但最終都以放棄收場。
早在擲杯事件和 RFC 之前,Chip Salzenberg 就用 C++ 開始進行「Topaz」計劃,並準備將它發展成 Perl 6。Topaz 原本打算重寫 Perl 5 的內部結構,但卻難以為繼。
當我問 Larry 為何 Topaz 會失敗時,他的回答是:「重新實作過的瘋狂,依然還是瘋狂。」(意思是:「不要試圖把 Perl 5 的核心改裝成 Perl 6。」)
此外還有「Sapphire」專案,只持續了一個星期。它開始於 2000 年 9 月,當時 Perl 6 才剛宣佈不久。Sapphire 也採取了「重寫 Perl 5 核心」的規劃,作為 Perl 6 正式實作前的預習。
不久之後,Parrot 專案開始發展。它是一個專為動態語言設計的虛擬機器,特別適合執行動態程度極高的 Perl 6 所需。
同時開始的還有 Ponie 專案,試圖將 Perl 5 硬生生移植到 Parrot 上運行。正如這篇文章所述,Ponie 因為巴士數太低,以及當時 Parrot 還不夠成熟的緣故,最終在 2006 內正式解散。
當時我是一介旁觀者,只知道有 Parrot,沒聽過其他專案,更不知道 Parrot 上曾經出現過的 Perl 6 實作。
我認真讀完了每篇「啟示錄」和「注疏」,覺得它們很有意思。
可然後呢?這個程式語言有一天能成真嗎?沒人曉得。似乎沒有什麼激動人心的事情發生。
在 2005 年初,有位唐某人在 perl6-all 通信論壇上貼了一段短訊,說自己正在實作一小部份「不產生副作用運算的 Perl 6」。(請留意這篇郵件的口氣,和 Linus Torvalds 著名的那篇「不像 GNU 那麼大規模」聲明的相似程度。)
不知不覺間,這「一小部份」已經成長為完整的 Perl 6 實作,它的名字叫作 Pugs。
Perl 6 十周年慶: Pugs:黃金年代 (五之三)
(This is a translation of masak++'s excellent Perl 6 anniversary post, part 3 of 5.)
(這是 masak++ 為慶祝“樂土專案”即將正式發行所寫的紀念文章的中譯。)
我還記得初次踏入 #perl6 頻道的感覺。
有人真的拿「綱要」來實作,這已經夠驚人了。而唐鳳又是個極富生產力的黑客,像磁鐵一般,以前所未見的速度吸引眾人投入開發。
待在 #perl6 頻道上,就像是站在颱風眼附近;事情像奇蹟般陸續發生,無論是因為唐鳳又完成了一組更動,或是旁邊又有人開始了某個很酷的專案。有趣的想法和點子,日夜不停湧入頻道當中。
而我們所有人都真的在跑(早期的)Perl 6!算符、副程式、類型、多載... 一個接著一個,我們期待以久的功能陸續開始運作。
很快,我們就寫出了在頻道上即時運行 Perl 6 代碼的機器人。
無論是誰,只要一提出改進 Perl 6 的想法,唐鳳就送他一個提交權。這招還真管用!數以百計的人獲得了提交權,卻完全沒有像圍紀系統上常見的破壞行為出現。許多人踴躍加入,主動做出貢獻。
當時我們的口號是「信任安那其」,現在回想起來仍然很聳動。
唐鳳興高采烈地站在漩渦中心,引導大家發展各式相關計劃,幾乎每天都邊寫網誌,邊提交出鉅量的代碼,為逐漸成形的 Perl 6 社群注入活力。
Pugs 是用 Haskell 寫成的,因此早期 #perl6 的文化深受 Haskell 文化的影響。
Pugs 黑客團隊的綽號是「浪達駱駝(Lambdacamels)」;頻道上大量出現資訊科學類的的論文、關於 Haskell 的書藉,以及其他編程相關的深奧論著。這些參考書目今天仍然可以在 Pugs 的 READTHEM 文件裡看到。
頻道上的幽默相當機智,主題往往也和電腦有關。
Alias_:我的眼鏡是 style="border: none"
無所謂
人眼的感光邊界會自動加上 border: solid 1px #9999
說得對
不過以我的視力來說,更像是 ridged
* audreyt 望著頻道上的高度技客傾向嘆氣
...
這顯然要 blame malaire++
我的意思是 praise
不然說 annotate 好了
頻道上主要的感嘆詞是「讚!(woot!)」。主要說「讚!」的人是唐鳳。業力(Karma)取代了貨幣,由機器人在頻道上統計,並在即時公佈提交訊息時,一併幫提交者加分。
我要說明一點:當時在 #perl6 上,我只是個粉絲。我對 Pugs 沒有作出什麼重大貢獻,對「綱要」和語言設計也沒有幫上什麼忙。至於在頻道上搞笑嘛,我倒是不遺餘力。:-)
2005 年 3 月,我的傻言傻語換來了一份提交權:
歡迎上船!
謝謝。因為 Pugs 的關係,我幾乎整晚沒睡。:-)
開心嗎?
太興奮了
這感覺我懂 :)))
唐鳳保持著很高的開發速度,頻道上經常出現關於他生產力的玩笑:
待會見 - 洗澡去 &
所以說唐鳳在浴室連 IRC 的謠言不是真的嘍...
也許他把筆記型電腦放在浴簾外,邊洗邊看螢幕。
沒錯。
通常是這樣。
我都拿牙刷按鍵盤,以免鍵盤進水。
*大笑*
...
每本講 Perl 6 的書都太舊了。
它們送印後兩小時就過時了。
等它們進到書店,已經過期一個月了。
等你買到書準備看時,autrijus 已經把 Perl 6 實作出來了。:)
在睡夢裡實作的!
autrijus 會睡覺?
castaway: 有時候他宣稱自己去睡了。
* castaway 完全不信
也許他和電腦之間有神經界面,讓他在夢裡寫程式。
這我一點都不意外 :)
castaway: 嗯,有時後他說要去睡,可是沒幾個小時後
就出現了一大份提交。所以我才不信呢。:)
嘻嘻
據我看來,他每次最多只睡 30 分鐘。
我想他有超線程功能。
唐鳳曾經說過:「人們以為我是了不起的程序員,但其實是 Haskell 和 Parsec(Haskell 的剖析結合函式庫)太強大了。」不過,這並沒有讓人們停止議論他的產能。
2006 年的某一天,Larry Wall 加入了 #perl6 頻道。他再也沒有離開過。
?eval <物美 迅速 價廉>.pick(2)
("物美", "價廉")
這是在說我們沒錯...
不過,我們確實失去了唐鳳。在他進入跨性別旅程後,產量雖然有增無減,但在 2007 年一次艱難的重構任務中,唐鳳突然爆發急性肝炎,於是離開了頻道,再也沒有回來。
Pugs 中斷開發。在唐鳳離開後,頻道頓時安靜了許多。
Pugs 還在,但已不再更新,也還沒完全達成對 Perl 6 規格的實作。社群裡的成員都在,但核心人物卻消失了。
當時我不知道未來會如何,只好盼望有更多像 Pugs 一樣的計劃出現。
(唐鳳沒有回頻道的原因,直到兩年之後才在他的一篇網誌裡揭曉。)
2010.07.28
Perl 6 十周年慶: Rakudo:白銀年代 (五之四)
(This is a translation of masak++'s excellent Perl 6 anniversary post, part 4 of 5.)
(這是 masak++ 為慶祝“樂土之星”即將正式發行所寫的紀念文章的中譯。)
Pugs 帶來了決定性的變化。隨著唐鳳的「非官方」Perl 6 實作完成度愈來愈高,不少人也開始發展自己的「小規模」實作。
從 2005 年到今天,有十來個「小規模」實作陸續出現,其中不少到現在仍在持續開發。其中有些是為了探索 Perl 6 某部份的設計,也有的是想要實作出整個語言。
(我稱它們為「小規模」,是因為開發者人數較少,使用者也不多的緣故。)
從 Pugs 登場到離場的這兩年多裡,在 Parrot 上實作 Perl 6 的腳步並未稍停。但因為當時 Parrot 還不夠成熟,想要慢慢搭建起編譯器所需的工具鏈,勢必得花上許多時間。
早在 2005 年時,Patrick Michaud 就已著手在 Parrot 上實作文法引擎(PGE)及編譯器工具集(PCT)。到了 2007 年,Patrick 終於得以開始正式實作 Perl 6;這個計劃在 2008 年初命名為 Rakudo(樂土)。
老實說,我是在它取名為「樂土」之後,纔注意到這個計劃的。
Patrick 的願景是這樣的:一個完整的 Perl 6 實作,首先需要有良好的 Perl 6 文法引擎,以及完善的的編譯器工具鏈作為基礎。在完成這兩項計劃之後,Patrick 才轉而開發實際的 Perl 6 編譯器和執行環境。
當時,一位名叫 Jonathan Worthington 的強人不慎答應 Patrick,要在 Rakudo 上實作 Junction(連接值)功能。(後來他纔發現,要實作連接值,得先實作多重分派,而這又得先實作型別系統,所以又得先完成大部份的物件導向系統... XD)
於是在 2008 上半年,Patrick 和 Jonathan 齊心協力,為 Rakudo 寫出了一個接一個的功能。
雖然 Rakudo 並不像唐鳳開發 Pugs 時那樣輕鬆寫意,而且早期版本實作的功能通常漏洞百出,但它確實讓 Perl 6 社群再度活躍起來。
在相對完整但發展停滯的 Pugs 計劃,與緩慢但穩定地追上 Pugs 的 Rakudo 計劃之間,我逐漸把注意力轉向後者。
2008 年的夏天過得很快;我和 viklund 合作,用當時還乳臭未乾的 Rakudo 寫一套圍紀引擎(純粹為了好玩而已)。
我們對自己說,如果竟然能寫出來,那我們就到 YAPC::EU 會議上,以它為主題來一場閃電演講。
嗯,最後我們真的寫出來了,也真的到 YAPC::EU 講了一場。與會者聽到有人能用 Perl 6 寫網站程式,反應十分熱烈,我們也很開心。
可是,中間我們繞了多大的彎,避開了多少還沒實作的功能,又發現了多少瑕疵啊!
而且,既然這是個秘密計劃,我們就不能在 #perl6 上直接貼出有問題的程式。要回報瑕疵之前,我們得先把代碼清理到看不出和圍紀有任何關係纔行。在那段時間裡,我學會了在瑕疵回報上打高爾夫(Golfing,壓縮字數)的價值。
那年夏天,我提交了許多瑕疵回報,每份的代碼都清理過了。就像小孩子收集瓶蓋一樣,我開始熱衷於此。
當時 Rakudo 的瑕疵不少。有一陣子,瑕疵似乎無所不在。這不能怪 Patrick 和 Jonathan;他們一直都很盡責。但任何專案都要經歷實地運用的考驗,而 viklund 和我恰好是首先拿 Rakudo 來用的人。
實地測試和回報瑕疵成了我的嗜好,驅使我不斷重複著「拿 Rakudo 做些新鮮事」、「看 Rakudo 爆炸」、「寫瑕疵報告」的無盡迴圈。
能脫離粉絲階段,正式參與開發,這讓我非常高興。日後我寫了更多 Perl 6 代碼,甚至還拿到了 Rakudo 的提交權... 但我想我會一直當那個「專門提瑕疵報告的傢伙」吧。
目前頻道上的幽默以大笑貓(lolcat)、奇特的顏文字,以及其他時下的網路流行語彙為主。頻道上的氛圍輕鬆有趣;大笑貓和編譯器內核開發的對比,時常令人耳目一新。
早安, #perl6
早, pmichaud
pm 你好
o/
o/ pmichaud
/o/
\o\
\o/ |\o/| o< /o\
;-)
啊啊啊啊
* mathw 躲起來
o/\o !
隨著 Rakudo 漸趨成熟,「綱要」也隨之作出修訂。也許有人覺得這很可怕。要怎樣去學一門不斷變化的語言呢?為什麼不讓規範文件確定下來呢?
我個人的想法是:我不希望語言規範被「鎖定」或「凍結」住,因為目前的修訂已經愈來愈小,大都是為了修正 Rakudo 等實作回報出的問題。
雖然 Perl 6 的規格改動幅度超過我所知的其他語言,但另一方面,它也一天天變得更加穩定。我們稱它為「漩渦式開發模型」,實作和規範雖然相互影響,但最終仍是往同一個單點收歛。
相對於某些 IRC 頻道的粗暴文化,#perl6 可說是網路上最親切的地方之一。我們花非常多的時間回答新手的問題、幫忙修正語法錯誤、並為訪客和開發團隊釐清各式術語及設計方針。我們互相幫忙看代碼和網誌文章,讓頻道上洋溢著彼此尊重和互相照顧的感覺。
今天的 #perl6 幾乎是「日不落頻道」,擁有來自全球各地的人積極參與。我們不僅覺得這裡有個非常酷、足以向世界展示的語言,也很自豪於 Perl 6 文化的良好素質。
2008 年以來,Rakudo 逐漸領先其他實作,完成度甚至超越了 Pugs。目前絕大多數的算符和控制結構都已完工,更有強大的正規表示式與文法引擎(感謝 Patrick!)以及優秀的物件導向、多重分派支援(感謝 Jonathan!),許多其他功能也已充份實作。
我們還有許多「小規模」的 Perl 6 實作,幫忙推動「綱要」發展和探索實作策略。但投注於 Rakudo 開發的人力,確實遠大於其他實作。Rakudo 每月釋出新版的工作人員名單,通常都在二三十人以上。
重新回到「Perl 6 每天都更近一些」的日子真好。
我仍然每天回報一則 Rakudo 的瑕疵,但通常是關於尚未實作的進階語言特性,而不是缺少什麼常用的功能。
2009 年至今,Rakudo 成功完成了幾項龐大的重構任務。首先是文法系統,隨後其他各元件也都分別重新寫過。
對開發者來說,這些小計劃統合成了所謂的「Rakudo 大重構」。
對於外界來說,這就是即將正式發表的 Rakudo Star,「樂土之星」。
2010.07.30
Rakudo Star:Perl 6 正式起飛(五之五)
(This is a translation of masak++'s excellent Perl 6 anniversary post, part 5 of 5.)
我們正在寫這段歷史。
七月二十九日,Rakudo 團隊正式釋出「樂土之星(Rakudo Star)」,也是 Rakudo Perl 計劃的第一個正式發行版本。(請按此處下載。)
在我看來,這個時機真是恰當極了。
在 Jon Orwant 擲杯之後的十年,Perl 6 團隊向全世界說:「這是我們的作品。幾年來我們孜孜不倦,對它切磋琢磨,如今它已曖曖含光、足堪重任。請試試看,用它來做些有趣的事吧!」
這些年來,從瓷杯創生的 Perl 6 專案,讓包括筆者在內的許多人興奮不已。
現在是讓更多人加入的時候了。
我們在此誠摰地邀請您,一同踏入這片樂土。