The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="zh-cn">
<head>
  <link href="../perl.css" rel="stylesheet" type="text/css">
  <meta content="text/html; charset=UTF-8" http-equiv="content-type">
  <title>Pugs 外典之一</title>
  <meta content="Audrey Tang" name="author">
</head>
<body style="direction: ltr;">
<h1 style="text-align: left; line-height: normal;" align="left">
Pugs
外典之一<br>
<span style="font-weight: normal;">Pugs
计划概述</span></h1>
<h2>何谓 Pugs 外典?</h2>
<p><a href="http://svn.perl.org/perl6/pugs/trunk/docs/">Pugs
外典</a>(Pugs Apocrypha)是一系列采用问答体例,用来解释
Pugs 设计及实现的文件。本外典(PA01)是这一计划的纲要。</p>
<h2>何谓 Pugs?</h2>
<p>Pugs 始于 2005 年 2 月,是针对 Perl 6
语言进行的实现,由负责人 Audrey Tang(唐凤)在开发团队
(committers)与贡献者(contributors)的襄助下,进行设计及开发。</p>
<h2>何谓 Perl 6?</h2>
<p>
<a href="http://dev.perl.org/perl6/">Perl
6</a> 是 Perl 语言的下一个主要版本,由 Larry Wall
领导的团队负责设计。Perl
是一种语境相关、多重典范的实用程序设计语言。 Perl 6 团队已表示<a
 href="http://www.nntp.perl.org/group/perl.perl6.language/19263">非
常欢迎</a>
Pugs 专案的诞生。</p>
<h2>Perl 6 规范是否已经制定?</h2>
<p>截至 2004 年 12 月,Perl 6
大部份规范都已记录在一系列的<a href="http://dev.perl.org/perl6/synopsis/">纲要</a>(Synopses)
中。虽然纲要日后还可能会
有所更改,但目前已稳定到可以实现的地步。Larry 的<a
 href="http://dev.perl.org/perl6/apocalypse/">启示录</a>(Apocalypse)
是许多纲要的基
础。设计团队偶尔也会发表<a href="http://dev.perl.org/perl6/exegesis/">注疏</a>(Exegesis)解
说启示录的内容。Pugs 遵循纲要的内容,当有疑义时则参考启示录与注疏。</p>
<h2>何谓 「Apocrypha」?</h2>
<p><a href="http://en.wikipedia.org/wiki/Apocrypha">Apocrypha</a>(外
典)一词源
自希腊文
&alpha;&pi;ό&kappa;&rho;&upsilon;&phi;&omicron;
&sigmaf;(隐藏),代表非正统的宗教典籍。根据
希腊文,单数形式应为 <span style="font-style: italic;">Apocryphon</span>。</p>
<h2>外典与 Perl 6 设计文件之关系如何?</h2>
<p>启示录与纲要描述抽象的 Perl 6 语言规范;外典则与
Pugs 实现息息相关。就像 <a href="http://www.parrotcode.org/docs/pdd/">Parrot
设计文件</a>,
外典也将根据 Pugs
的状态而不时更新。<br>
</p>
<h2>Pugs 会实现完整的 Perl 6 规格吗?</h2>
<p>会的。Pugs 将一直以最新的 Perl 6
纲要版本为实现目标。一旦有新的纲要或修订版本出现时,Pugs 和新版不同之处,将视为
Pugs 的瑕疵。<br>
</p>
<h2>Pugs 是自由软件吗?</h2>
<p>是的。Pugs 采用 GPL 第二版及 Artistic
License 第 2.0b5 版放出。Artistic 2.0
最终版本一旦底定,Pugs 即会采用。</p>
<h2>Pugs 是否收到 Perl 基金会赞助?</h2>
<p>没有。在接受 Perl 基金会的三份专案<a
 href="http://www.perlfoundation.org/gc/grants/2003_autrijus.html">补
助</a>后,
Autrijus 决定捐出自己的时间,通过 Pugs 来协助 Perl 6 专案,不向 TPF 请求赞助。</p>
<h2>如何取得 Pugs?</h2>
<p>从 <a href="http://svn.openfoundry.org/pugs/">Subversion</a>
或 <a href="http://wagner.elixus.org/%7Eautrijus/darcs/pugs">darcs</a>
档案库,可以取得最新版的 Pugs 源代码。在 CPAN 上,也会以 <a
 href="http://search.cpan.org/dist/Perl6-Pugs/">Perl6-Pugs</a>
为名定期放出。(顺带一提,如果有兴趣针对 Subversion 的档案库进行离线开发,<a
 href="http://svk.elixus.org/">svk</a>
也许对你会有帮助。只用 svn 当然亦常不可。)<br>
</p>
<h2>怎么编译 Pugs?</h2>
<p>Pugs 采用标准 Makefile.PL 编译系统;请见 <a style="font-family: monospace;"
 href="http://svn.openfoundry.org/pugs/README">README</a>
档案的详细说明。由于
Pugs 是用 Haskell 语言写成,请先安装 <a href="http://haskell.org/ghc/">Glasgow
Haskell
Compiler</a> (GHC) 6.4 或以上版本。请下载所属平台的<a href="http://haskell.org/ghc/">安装包</a>;从源代码编译 GHC 得花上不少时间。</p>
<h2>何谓 Haskell?</h2>
<p><a href="http://haskell.org/">Haskell</a>
是标准化的纯函数式编程语言,具有惰性求值(lazy
evaluation)特性。虽然它有许多不同的实现可用,但 Pugs 采用了 GHC 特有的若干功能,因此必须用 GHC 来编译。 </p>
<h2>GHC 又是什么?</h2>
<p>GHC 是尖端的编译器与互动式环境,采用 <a href="http://haskell.org/ghc/license.html">BSD
式授权</a>放出。GHC 本身以 Haskell 写成,能把
Haskell 编译成字节码(bytecode)、C
语言程序,和某些平台的机器码。GHC 附有完整的库函数、是数众多的语言延伸,以及强大的优化系统(借由某个 <a
 href="http://www.cse.unsw.edu.au/%7Echak/haskell/ghc/comm/the-beast/mangler.html">Perl
5 程序</a>的协助)。因此,GHC 提供了解决 Perl 6 自举问题(bootstrapping problem)的最佳平台。</p>
<h2>何谓 Perl 6 自举问题?</h2>
<p>Perl 6 专案的目标是自足
执行(self-hosting):Perl 6 编译器得用 Perl 6 本身编写,采用 Perl 6
Rules 来剖析 Perl 6 语法,而 Rules 又是 Perl 6 语言的一部份。此外,编译器产出之程序码也得包含能动态执行 Perl
6 程序代码的求值器(evaluator)。要打破这种相依循环,只有采用其它语言先实现的某些部份,然后再用 Perl 6 进行重写。</p>
<h2>最初的自举计划是什么?</h2>
<p>根据 <a
 href="http://search.cpan.org/dist/parrot/docs/faq.pod#Isn%27t_there_a_bootstrapping_problem?">Parrot
答客问</a>,最初的计划是利用 Perl 5 进行自举:先扩充
Perl 5,让其执行在 Parrot 虚拟机器上(通过 <span style="font-family: monospace;">B::Parrot</span>
或 <a href="http://www.poniecode.org/">Ponie</a>),
再使用 Perl 5 实现 Perl 6
编译器,最后通过 p5-to-p6 转换器将编译器转译成 Perl 6。不过,虽然 <a
 style="font-family: monospace;"
 href="http://search.cpan.org/dist/Perl6-Rules/">Perl6::Rules</a>
确实在
Perl 5 上实现了 Rules 的雏型,但对于构建编译器而言仍显得不够成熟。因此,自举计划转而以 C 语言替代。</p>
<h2>修订后的自举计划为何?</h2>
<p>根据一份 2005 初的<a
 href="http://www.perlfoundation.org/gc/grants/2005-p6-proposal.html">建
议
书</a>,首先应采用 C 语言实现 Rules 引擎(即 <a
 href="http://svn.perl.org/viewcvs/parrot/trunk/compilers/pge/">PGE</a>),
用它将 Perl 6 剖析成 Parrot 的<a
 href="http://en.wikipedia.org/wiki/Abstract_syntax_tree">抽
象语法树</a>(AST),
接着在 Parrot 里实现 AST 求值器。Ponie 和 p5-to-p6 仍在进行中,但已不是自举程序中的关键成份。</p>
<h2>Pugs 能如何协助 Perl 6 自举?</h2>
<p>在自举程序中,常存在许多瓶颈,使得许多依赖这些瓶颈的工作无法推继续。
比如说,没有可用的 Perl 6 实现,就难以为 Perl 6
编写单元测试与标准程序库;在缺少 AST 介面的情况下,也没办法编写 AST 求值器。Pugs
为这个程序的各个层面提供可用的替代元件,因此解决了上述的困境。</p>
<h2>Pugs 有助于 Perl 6 语言设计吗?</h2>
<p>在缺少可用的实现时,很难看出规范内的不一致与例外情况。然而,假如
在实现不久之后,才发现设计上的瑕疵,可能就得在重新架构上耗费许多精力。借由
提供可用的 Perl 6 实现,Pugs 可做为先期的确认平台;这样不但能趁早解决问题,也可以鼓励更多人使用 Perl 6 的特性。</p>
<h2>为何选择 Haskell?</h2>
<p>Haskell 具有许多与 Perl 6
特点相应的功能:Perl 6 Rules 与 <a
 href="http://www.cs.uu.nl/%7Edaan/download/parsec/parsec.html">Parsec</a>
十分相似;两种语言里都有惰性串列求值;延续函数(continuation)则可利用 <a
 href="http://www.nomaware.com/monads/html/contmonad.html">ContT</a>
单子转换器(monad transformer)来建构。这让雏型开发工作简化很多:首支可用的直译器只花了<a
 href="http://use.perl.org/%7Eautrijus/journal/23051">一
星期</a>便放出了,在<a href="http://use.perl.org/%7Eautrijus/journal/23335">第
三个星期</a>的时候,我们已经有了可以提
供单元测试的全功能 <a style="font-family: monospace;"
 href="http://svn.openfoundry.org/pugs/ext/Test/lib/Test.pm">Test.pm</a>
模块。</p>
<h2>Pugs 是编译器还是直译器?</h2>
<p>和 Perl 5 相似,Pugs 先把 Perl 6
程序编译成 AST,然后再用内建的求值器加以执行。不过,未来 Pugs
可能会提供支持多种编译器后端的编译器介面。<br>
</p>
<h2>考虑纳入哪些编译器后端呢?</h2>
<p>如果要实现编译器的话,首先很可能会是产出 Perl 6
程序码,类似 <a style="font-family: monospace;"
 href="http://search.cpan.org/dist/perl/ext/B/B/Deparse.pm">B::Deparse</a>
模块的编译器后端。接下来则可能产出 Haskell 程序码,并交由 GHC 编译成 C 语言。到时,下一个目标很可能是 <a
 href="http://svn.perl.org/viewcvs/parrot/trunk/compilers/ast/">Parrot
AST</a>
介面。如果有人愿意协助的话,我们也可能再加入其它后端(譬如 Perl 5 bytecode)。</p>
<h2>预定的 Pugs 开发计划为何?</h2>
<p>Pugs 的主要/次要版本号将逼近
2*&pi;;次版本号中的各小数位都代表一项里程碑。版本号的第三位数会在每次放出时递增。目前的里程碑
为:</p>
<ul>
  <li>6.0: 首次放出</li>
  <li>6.2:
基本输出入与流程控制元件、可改写变数(mutable variables)与赋值(assignment)。</li>
  <li>6.28: 类别(classes)与特质(traits)。</li>
  <li>6.283:
规则(rules)与文法(grammars)。</li>
  <li>6.2831: 类型系统(type system)与链接(linking)。</li>
  <li>6.28318: 宏(macros)。</li>
  <li>6.283185: 如有必要,将 Pugs 移植至
Perl 6。</li>
</ul>
<h2>Pugs 的可移植性如何?</h2>
<p>Pugs 可在 Win32、Linux 与多种 Unix
系统上执行。GHC 的<a href="http://haskell.org/ghc/contributors.html">移植者名单</a>与<a
 href="http://haskell.org/ghc/download_ghc_622.html">下载
网页</a>有详细的资讯。从
6.2.0 开始,Pugs 团队也会提供若干平台的安装包。</p>
<h2>Pugs 的速度是否够快?</h2>
<p>在 Parsec 的强力支援下,Pugs 的解译器很快。不过
Pugs 的求值器目前暂时没有最佳化:在一般 PC 上每秒约处理 1000
个运算符,大约比 Perl 5 慢上 100 倍。这对实现雏型语言功能来说,已经够快了;假如还不能满足你的需要,请考虑帮忙开发编译器后端。</p>
<h2>有 Perl 6 模组的 CPAN 吗?</h2>
<p>没有。当前发布 Perl 6/Pugs 模块较好的方式,是交给
openfoundry.org 的提交者,将你的模块放到 Pugs 源文件档案库下的 modules/
目录。最好能同时提供该模块的测试案例,让我们对该模块多些了解。</p>
<p>但情况也不是那么糟。假如你够耐心,可以等 <span style="font-family: monospace;">Pugs::MakeMaker</span>
和 <span style="font-family: monospace;">Module::Install::Pugs</span>
的出现。等到以上模块出现在 CPAN 上,表示我们已经解决了发布上的问题。你就可以开始把东西丢上 CPAN
了。当然,随时欢迎各方提供其它意见。
</p>
<h2>Pugs 能与 Perl 5 程序库共用吗?</h2>
<p>虽然目前还不行,但我们未来可能会照 Autrijus 之前实现
<a style="font-family: monospace;"
 href="http://search.cpan.org/dist/Inline-MzScheme/">Inline::MzScheme</a>
的方式,编写 <span style="font-family: monospace;">Inline::GHC</span>
模块,让
Perl 5 与 Haskell 模块能相互沟通。如果成功的话,架一个 <span
 style="font-family: monospace;">Inline::Pugs</span>
在上面也并非难事。如果不行,我们也可能写个生成 Pugs AST 码的 Perl 5 程序码解译器,让 Pugs 能执行纯以 Perl
写成的模块。再不行,也可以把 Pugs AST 编成 Perl 5 的 AST,不过这纯属臆测。</p>
<h2>Pugs 能与 Haskell 程序库共用吗?</h2>
<p>目前你可以把 Haskell 程序库静态链接到 Pugs
的内建函数,只需修改 <a style="font-family: monospace;"
 href="http://svn.openfoundry.org/pugs/src/Pugs/Prim.hs">Prim.hs</a>
内的几列程序码即
可。我们正考虑编写 <a href="http://www.cse.unsw.edu.au/%7Edons/hs-plugins/">hs-plugins</a>
的简易界面,让 Pugs 能动态载入 Hasekll 程序库,甚至在 Perl 6 中内嵌 Haskell 程序码。</p>
<h2>Pugs 能与 C 程序库共用吗?</h2>
<p>还不行。不过 <a href="http://www.haskell.org/hdirect/">HaskellDirect</a>
通过前面说的 hs-plugins,似乎会是和 C、CORBA 及 COM 程序库沟通的简单方式。</p>
<h2>我会 Perl 5,不懂 Haskell。我能帮 Pugs
的忙吗?</h2>
<p>当然!Pugs 的标准程序库与单元测试都是以 Perl 6
写成的,而我们总是需要更多的测试和程序库。这方面的工作只需要懂 Perl
5,再花上几分钟熟悉少部份语法的不同之处即可。当然,过程中你也可能会学到一些 Haskell 相关的知识。</p>
<h2>我会 Haskell,但不懂 Perl 5。我可以帮忙吗?</h2>
<p>当然!Perl 6 和 Haskell
有很多相似之处,好比说基于类型的分配函数(type-based function
dispatch)、以函数为值(first class
functions),以及局部套用函数(currying)等等;因此,要了解语法也会简单很多。总是有许多功能的测试等着编写,不用怕找不到事情
做。</p>
<h2>我会一点 Perl 6。我能用 Pugs 做什么?</h2>
<p>先看看 examples/ 目录里的范例程序。已经有人用
Pugs 写了网站应用软件与报表系统。假如你发现 Pugs
的不足之处,请告诉我们,以便实现。</p>
<h2>哪里可以学 Haskell?</h2>
<p><a href="http://www.haskell.org/">Haskell 首页</a>和
<a href="http://haskell.org/hawiki/">Wiki</a>
会是不错的开始。有许多线上教程可看;<a href="http://www.isi.edu/%7Ehdaume/htut/">Yet
Another
Haskell Tutorial</a> 可能是其中最容易上手的。由于
Pugs 中大量应用单子转换器 (monad
transformer),建议读读 <a href="http://www.nomaware.com/monads/html/">All
About
Monads</a>。书的话,<a
 href="http://www.iro.umontreal.ca/%7Elapalme/Algorithms-functional.html">Algorithms:
A Functional Programming Approach</a>、<a
 href="http://www.cs.kent.ac.uk/people/staff/sjt/craft2e/">Haskell:
The Craft of
Functional Programming</a> 和 <a href="http://haskell.org/soe/">The
Haskell School of
Expression</a> 都是很好的入门读物。此外,<a href="http://freenode.net/">freenode</a>
的 <span style="font-family: monospace;">#haskell</span>
频道上有许多热爱
Haskell 的人可以帮忙。</p>
<h2>哪里学得到 Perl 6?</h2>
<p><a href="http://dev.perl.org/perl6/">Perl
6 首页</a>有许多在线文档。每隔一两个星期,<a href="http://www.perl.com/">Perl.com</a>
上会有新的 Perl 6 通信论坛摘要,想赶上 Perl 6 的开发进度者一定不能错过。在书藉方面,<a
 href="http://www.oreilly.com/catalog/059600737X/">Perl
6 and Parrot Essentials</a> 和 <a
 href="http://www.apress.com/book/bookDisplay.html?bID=355">Perl
6 Now</a> 都很有帮助。</p>
<h2>要如何学习实现程序语言?</h2>
<p><a href="http://www.cis.upenn.edu/%7Ebcpierce/tapl/">Types
and Programming Languages</a>
一定要读。Pugs 最初是 Autrijus
在自学此书时的习作;它在实作期间也一直是重要的指南。它的续集 <span
 style="text-decoration: underline;"></span><a
 href="http://www.cis.upenn.edu/%7Ebcpierce/attapl/">Advanced
Topics in
Types and Programming Languages</a>
同样十分重要。熟悉其它多重典范语言(如 <a href="http://www.mozart-oz.org/">Mozart/Oz</a>、<a
 href="http://www.informatik.uni-kiel.de/%7Emh/curry/">Curry</a>
、<a href="http://www.ocaml.org/">O&rsquo;Caml</a>
等)可能也有帮助。此外,<a
 href="http://www.cse.unsw.edu.au/%7Echak/haskell/ghc/comm/">GHC
commentary</a> 为 GHC 的实现提供了详细的描述。</p>
<h2>我想帮忙,该怎么做?</h2>
<p>首先,发一封空白信到 <a href="mailto:perl6-compiler-subscribe@perl.org">perl6-compiler-subscribe@perl.org</a>,
订阅 <a href="http://nntp.perl.org/group/perl.perl6.compiler">perl6-compiler</a>
通信论坛。接着加入 <a href="http://freenode.net/">irc.freenode.net</a>
的 <span style="font-family: monospace;">#perl6</span>
IRC 频道,看看有什么待办事项;不妨与 <span style="font-family: monospace;">#perl6</span>
上的 Pugs 团队联系,以加入开发团队。咱们
IRC 上见!<br>
<o:p></o:p></p>
</body>
</html>