文学编程与Emacs

文学编程

文学编程,和绝大多数的计算机理论一样,是一个舶来品。它的英文原名是Literate Programming。“把文学和编程两个风马牛不相及的东西揉到一起,也是一个够奇葩的说法了吧!”。第一次看到这个概念的人,包括我,一定都是这个想法。确实,文学需要我们充分的展开感性的翅膀,感受生活中的遐思;编程需要我们具有严谨的理性思维,务必做到事无巨细,事必躬亲。这两样完全不一样的东西要联系在一起,确实需要“一定”的想象力啊!

然而,文学编程的想法是由计算机大师高德纳提出来的,那一定是有不同寻常的地方。让我们来看看感性和理性的碰撞会产生出什么样的火花。

关于高大师,维基百科是这样介绍老人家的:

唐納德·爾文·克努斯(英语:Donald Ervin Knuth,漢名:高德納,1938年1月10日-),出生於美国密尔沃基,著名计算机科学家,斯坦福大学计算机系榮譽退休教授。高德纳教授為现代计算机科学的先驅人物,創造了演算法分析的領域,在數個理論計算機科學的分支做出基石一般的貢獻。在计算机科学及数学领域发表了多部具广泛影响的论文和著作。1974年圖靈獎得主。

高德纳最為人知的事蹟是,他是《计算机程序设计艺术》(The Art of Computer Programming)的作者。此書是計算機科學界最受高度敬重的參考書籍之一。此外還是排版軟件TeX和字型設計系統Metafont的发明人。提出文学编程的概念,並創造了WEB與CWEB軟體,作為文學編程開發工具。

什么是文学编程

首先我们来看看文学编程在维基百科中的定义:

文学编程(英语:Literate programming)是由高德纳提出的编程方法,希望能用來取代结构化编程范型。

正如高德纳所构想的那样,文学编程范型不同于传统的由计算机强加的编写程序的方式和顺序,而代之以让程序员用他们自己思维内在的逻辑和流程所要求的顺序开发程序。文学编程自由地表达逻辑,而且它用人类日常使用的语言写出来,就好像一篇文章一样,文章里包括用来隐藏抽象的宏和传统的源代码。文学编程工具用来从文学源文件中获得两种表达方式,一种用于计算机进一步的编译和执行,称作“绕出”(tangled)的代码,一种用于格式化文档,称作从文学源代码中“织出”(woven)。

虽然第一代文学编程工具特定于计算机语言,但后来的工具可以不依赖具体语言,并且存在于比编程语言更高的层次中。

文学编程的特点

文学编程讲究的是文档与计算机程序的统一。需要按照某种逻辑组织起来的计算机程序,成为了一篇文档的组成部分。通过一些计算机软件的支持,使得计算机可以调去其中的代码以便执行,人类读取文档方便进行代码的维护。因此

  • 文学编程里,文档和计算机程序是合并在一起的。开发文档和计算机代码不再独立存储
  • 文学编程需要具有一定的组织逻辑,这个逻辑更多的是符合人们阅读文档的逻辑。
  • 支持文学编程的开发环境会自动提取用于计算机执行的代码,交由计算机执行
  • 文学编程是比计算机编程更高级的一种开发方式。对于开发IDE的依赖更多
  • 目前文学编程还没有成为主流的编程方式。文学编程还需要更多推广和计算机开发环境的支持。

Emacs对文学编程的支持

通过org mode里的babel模块,可以实现对五十余种语言按文学编程的方式进行代码开发。同时由于Emacs的开放性,开发者还可以根据自己的需求方便的定义新的语言支持。Org mode的文档中甚至为此而提供了一个template(ob-template.el)。

这里是一个我的Emacs的启动配置文件。我采用的文学编程的方式对代码进行组织。有图有真相:

按文学编程方式组织的Emacs配置文件
按文学编程方式组织的Emacs配置文件

这种编程方式解决了几个我的痛点:

  1. Emacs 配置文件中的代码很多,用处也各有千秋。
    修改代码的时候我希望能有一种快速定位的方法。显然,符合自然语言的文档组织方式是最简单的
  2. Emacs 配置文件中的代码有一些我已经不再使用了,但舍不得删除。
    为了供将来参考,我保留不再使用的配置代码在我的Emacs配置文件中。这时,只需要调整代码块的参数即可。
  3. 对于一部分逻辑比较复杂的代码片段,可以进行详细的描述
    在描述代码的时候,甚至可以吧代码设计的想法和过程写进去。这个和写代码的时候添加注释的感觉完全不一样啊
  4. 有了上面的这些自然语言的文档,代码的可维护性得到了提升
    说实话,我也不是每天都会吧自己的Emacs配置文件打开来看看。时间长了,自己的代码,自己都不认识了。在我使用Vim的时候,我自认vim的配置文件我已经写的很好了,但是现在我回去看,代码的组织方式已经被我遗忘了。要重新捡起来,还需要一些时间恢复记忆。:P

我应该使用文学编程吗?

说实话,这个问题应该问你自己哦。我觉得使用文学编程在管理我自己的Emacs配置文件上是有效的、简便的。当然也有国外的大牛在使用文学编程的方式进行科学研究。对于他们来说,研究的数据执行结果也不过是文档中的一个代码块而以。也将不同类型的编程语言按照一种统一的方式组合在了一起,共同为研究报告的编写贡献数据。

说实话,我认为对于这种新的编程方式,了解了解是有好处的。你说呢?

推荐阅读更多精彩内容