这只是一个很粗略的计划,主要是作为这次重新学习 Haskell 的过程中的唯一的一个实践。也就是说我会将这个项目作为 Haskell 的技术实验场,所以一个丑陋的过程是必然的,最终功能不全也可能是必然的,因为对于编译原理目前我也是个门外汉。
我的想法是美好的。将 Haskell 强大的程序逻辑表现力与用于表述人类思考过程的自然语言融为一体,从而实现程序即文档,文档即程序这样的愿望。但是与 Knuth 相比,我这燕雀虽倾慕鸿鹄之志却也应当自量。
结果应当显而易见。我费劲周折,学习了一些之前只有耳闻却从未尝试的技术和工具,写了一个或者好用或者很难用的 HWEB,然后这个 WEB 会和之前的其他 WEB 那样默默无闻。
当你不幸读到这篇文章,可能不知道我所说的 WEB 是什么。Knuth 在取名字的时候,认为它是英语中很少的几个没有用于计算机的三字词语之一。事实证明他老人家在这一点上的判断非常的不英明神武。现今,我们听到 WEB 这个单词的时候,谁会想到它是一种文学编程语言呢?
不知道文学编程的“严重后果”可从 http://complystill.iteye.com/blog/370568 略见一斑。
我不关心 Haskell 现在有没有类似的文学编程实现的项目,所以未对现状作过太多调查。有文字表明 Haskell 支持半文学编程。事实上所谓的“半文学编程”就是一种带有排版格式的代码注释方式,例如像 Doxygen 那样的注释格式,然后通过工具生成比较好的代码文档,这跟文学编程搭不上什么关系。
Knuth 所说的 WEB,用的就是它的本意“网”。文学编程语言本质上就是用人类的语言将一组表征代码块的宏编织成一张网,这样我们就可以像看小说那样的来阅读一个程序的源代码。
文学编程主要是依托于两种既有语言来实现。例如 CWEB,就是基于 C 语言与 TeX 排版语言而实现的。人类的自然语言使用 TeX 进行描述,使用 C 语言来描述程序的实体。使用 ctangle 程序可将 CWEB 程序中的错综复杂的 C 代码提取出来生成 .c 文件,使用 cweave 可将 CWEB 程序转化为 TeX 文档进而生成排版良好的文档。也许我应该专门拿出一点时间写写 CWEB 的科普。
对于 HWEB 而言,自然是将 Haskell 作为程序实体的描述语言,而自然语言部分我会倾向于使用比 Plain TeX 甚至比 LaTeX 格式更为强大的 ConTeXt。
为了能够让 HWEB 一直处于自举实现的过程,一开始我需要完全的借助 Haskell 语言实现一个初步的 htangle,然后借助 htangle 实现 hweave,然后让它们不断的相互影响和迭代进化,从而达到我的最终目标。
如果你感觉这个项目很有趣,并且也想学习 Haskell、WEB 和编译原理,并且也是个初学者,并且也想将这个项目当作一个长期的玩具,那么不妨和我联系。