我这个脾气暴躁的月份的布道经文是马特·巴顿的文章《计算机编程的精湛艺术》(<http://www.freesoftwaremagazine.com/articles/focus-software_as_art>>),他在文中赞扬了被广泛称为文学编程的优点。与相关术语文学的和文学一样,我们有充分的空间进行神学强度的争论,而问题“计算机科学是科学还是艺术?”和“程序员需要知道什么?”中固有的争议进一步放大了这种争论。正如我们必须偏爱敏捷编程而不是笨拙编程一样,很难否定任何具有文字性的东西。竞争方法听起来往往像是,额,有点不识字,这是一个名声很差的术语,以至于尚未发明或借用书写系统的文化被称为前文字社会。
无论谁首先创造了引人入胜的搭配文学编程,种子肯定是由埃德斯赫·韦伯·戴克斯特拉在认真反思我们称之为编程的野兽的本质时播下的。一个学科的最深层本质正在被认真反思的迹象是,当你遇到修辞形式“当我们编程时,我们真正在做什么?”时。后现代文学批评家(主要是高卢人)提出的相应问题是:“当我们写作、重写、阅读和重读时,我们真正在做什么?”(副词“真正”是一个警告,表明一些沉重、高深的头脑风暴即将到来。)
戴克斯特拉经常被引用的建议是:“除了数学天赋之外,对母语的出色掌握是胜任程序员最重要的资产。”1 在戴克斯特拉的其他直率格言中,我总是听到他用干燥的荷兰口音的英语单调地说出来,人们也可以看到计算机科学语词之战的种子:“编程语言之战”仍然助长了许多老顽固的讨伐。可怜的Basic,戴克斯特拉声称,接触到它的一行代码“在精神上摧残了潜在的程序员,使他们无法再生。”2 如果那行代码包含有害的GOTO,那么读者的命运就是立即被诅咒,并被安置在但丁《神曲》地狱的最底层,与犹大和Basic的始作俑者约翰·凯梅尼和托马斯·库尔茨(发音为“诽谤和诅咒”)为伍。戴克斯特拉说,病态冗长的Cobol“会扼杀思想;因此,教授它应该被视为犯罪行为。”3
C和Pascal的粉丝也进行了类似的拳脚相向,但也许没有戴克斯特拉的“下三滥拳”那么凶猛。布莱恩·W·克尼汉的《为什么Pascal不是我最喜欢的编程语言》(<http://www.lysator.liu.se/c/bwk-on-pascal.html>>)仍然是理性对抗的经典之作。或者,更确切地说,正如标题暗示的那样,与其说是直接的战斗,不如说是更温和的“因材施教”4 论点:“Pascal,至少在其标准形式下,根本不适合严肃的编程。”
克尼汉解释说,严肃的编程是系统编程或任何超出编写阶乘 (n) 作为学生练习的东西。Pascal的支持者当然会反击,除了Pascal的唯一创造者尼克劳斯·沃思,他保持了庄严的学术冷淡。欧文·哈特内特以最好的方式反击了克尼汉的嘲讽:“欧文认为Pascal优于C的十大理由”使用单口相声来消解C所宣称的“严肃性”(http://www.pascal-central.com/top10.html)。
例如,欧文的第五个理由是:“5. 在Pascal中,当你摆弄指针或句柄时,你知道你正在摆弄指针或句柄。在C中,你可能在摆弄任何东西。C是计算滥交的终极语言。”
这种保姆式国家主义(从孩子的沙箱中移除所有尖锐工具)与真正的程序员可以被信任的主题仍然是Java/C++争论中的热点。
顺便提一下,欧文的第二个理由与众所周知的关于尼克劳斯·沃思的名字和Pascal的参数传递约定的双关语有关,应该引用我们直接从大师口中听到的原始版本:“欧洲人通常以正确的方式发音我的名字(尼-克劳斯·沃特),而美国人总是把它发音成‘尼克-莱斯·沃斯’。也就是说,欧洲人按名称称呼我,但美国人按值称呼我。” 将这种虚假的谦虚与欧文更平庸的版本进行比较:“2. Pascal的发明者尼古拉斯 [原文如此] 沃思和参数传递约定结合在一起形成了一个巧妙的双关语:你可以通过引用发音他的名字:沃思;或通过值:沃斯。C是在贝尔实验室发明的,他们在那里根本不懂什么是玩笑。”
我必须补充一点,为了那个叫做“平衡”的老扫兴鬼,C/C++ 用户很少把自己看得太严肃,并且公开地以他们晦涩难懂且危险的语法为乐。多年来,我一直是《C 用户杂志》“模糊C”和“C-双关语”竞赛的评委。令人感到反常的自豪的是,没有“模糊Pascal”、“简洁Cobol”或“透明APL”竞赛!
有趣的是,那些攻击语言X缺乏结构或对象或组件或事件或类型安全或异常或线程或内存管理,或任何那些时尚的“严肃性”代名词的人,很快发现X以各种方式附加了这些资产而重生。但是,始终要记住:这些功能必须无缝地累积。要像哈姆雷特那样:“接缝,夫人!不,我不知道‘接缝’。”(第一幕,第二场) 只要有最微小的接缝迹象,你的对手就会声称“事后诸葛亮”。因此,我们发现Basic永远被扩展(如“大家庭”中的扩展,尽管有些人说是如“我的资源相当扩展”)。
借用彼得·费尔格特教授(Ambisonics的共同发明者)的话说:“Basic是粪肥。扩展Basic是带有糖霜的粪肥。”5 有人可能会说,那些“糖霜”层现在几乎掩盖了下面的垃圾堆。Visual Basic .NET不仅仅是一种语言;它是一种完整的、血淋淋的生活方式——组件从地板上升起,从椽子上滴落——商业程序员无耻地首选的平台。微软估计,百分之六十二的开发人员使用某种形式的VB,与C++和JavaScript争夺第三位,落后于前两位C#和Java。如果戴克斯特拉今天还活着,他会在坟墓里翻身(© 乔·米勒)。
语言之战因语言演变的多种方式而变得复杂。经验被吸取。过去的“错误”被原谅为通往涅槃的必然步骤。真的。沃思自己的Modula-2不仅仅是扩展的Pascal。C++ 现在远不止是更好的C、C 加 Simula 或带有类的 C。回想起比雅尼·斯特劳斯特鲁普本人公开津津乐道的笑话,++C(预递增 [改进] C,然后使用 [返回改进版本的价值])在语法上可能比里克·马西蒂建议的 C++(使用 [返回旧C的值],然后后递增 [改进] 它!) 更好的名字。关于运算符 ++ 可以为 Language 类的对象适当地重载的神秘建议进一步修饰了这些故事!我提出一个小小的观察,赞成 C++ 而不是 ++C 这个名字:谷歌搜索 C++ 会为你赢得 600 万++ 个点击,但谷歌搜索 ++C 是一场灾难,因为最初的 ++ 被忽略了,揭示了所有那些 K&R C 站点:你没有得到任何讨厌的 ++C 匹配(© 约翰·休斯顿)。
无论文学编程的起源是什么,毫无疑问,它的名声和/或恶名6 都来自伟大的国王克努特。因为正是他,高贵的唐·埃尔,在可怕的、命运攸关的 1984 年首次提出了他对编码“文学”方法的版本。7 他的想法后来在 1992 年被放大和出版(文学编程。《斯坦福大学语言和信息研究中心讲义》)。那些开玩笑说克努特巨著 TAOCP(《计算机编程的艺术》)第 3 卷和第 4 卷之间出版时间间隔的人应该记住这一点,以及所有其他分散他注意力的出色工作,尤其是他在排版和印刷计算方面的巨大努力。
巴顿在“代码不仅仅是为计算机而写”和“为乐趣而阅读程序”的口号下呼吁推广人类可以纯粹为了乐趣而阅读的代码,就像例如,他们可以蜷缩在床上阅读他们最喜欢的特罗洛普作品一样(一位经过精心挑选的作家,只为获得不值得这份尊贵期刊的廉价刺激)。我们首先注意到文学编程和文学编程之间可能存在混淆或重叠。戴克斯特拉倾向于强调文字性,指的是流利地掌握一个人的工作/出版语言(对于大多数实际目的而言,这实际上意味着英语),以便所有非直接可编译的文本,例如注释和解释,都将写得简洁明了,没有歧义。巴顿似乎正在代码本身中寻求文学天赋。
因此,我们接下来注意到,巴顿的呼吁主要适用于阅读一种合理的高级语言的源代码,以及人类读者对这种语言相当流利的情况。“合理的高级”的含义当然是用户定义的,因为我最优雅的代码是为 68K 汇编程序编写的——而且如果允许我做一个不谦虚的时刻,在几十年生疏之后,仍然很高兴阅读。8 你是否可能从阅读二进制文件中获得乐趣只有当你是特别投入和异常敏锐的情况下才有争议。我毫不怀疑图灵、克努特或托克森会对长串的 0 和 1 感到高兴地点头:“天哪,抓住那个 0011001100 指令!多么纳博科夫式!如此精确!而且还是个回文——不,值得为此而死!”(巧合的是,我的专栏以一个优雅的回文测试结束。) 对于我们其他人来说,研究核心转储的痛苦记忆将是一个主要的威慑。
因此,我们正在寻找至少半可读的代码文本,以便像文学作品一样扫描和欣赏。唉(但只是在混淆我们的判断的意义上),文学作品具有各种艺术性和可理解性,伟大与读者友好性之间没有现成的相关性。实际上,比较无可置疑、广受赞誉的经典作品:简·奥斯汀的《傲慢与偏见》和詹姆斯·乔伊斯的《芬尼根的守灵夜》。这些不同的杰作的编程对应物可能是什么?奥斯汀清晰、明快的风格可能可以与Modula-2相提并论,而乔伊斯再次让我们想起了那些模糊的C语言难题或APL9中的一组精彩序列——神秘但非常值得努力去解开。
在我们这个痴迷于榜单和文学奖驱动的市场社会中,我们倾向于将我们的文学判断委托给“专家”,或者至少受到他们的强烈影响。通过购买他们的选择,我们将畅销书排行榜变成自我实现的预言。J.佩德·赞恩有史以来规模最大的“十部最伟大的书籍”10 调查刚刚结束,该调查结合了 125 位被(由谁?)认为是“125 位在世最伟大的作家”的作家的投票。列夫·格罗斯曼和我一致认为“文学榜单基本上是一种淫秽之物。文学是不可言喻和不可量化的领域”(《时代》杂志,2007 年 1 月 15 日)。然而,该项目的规模确实使其成为“一种非常有趣的淫秽之物。”11
一个明显的缺陷是,千百年来,作家们一直在不加批判地诋毁他们的竞争对手(尝试谷歌搜索“文学世仇”)。罗伯特·格林嫉妒地攻击了一位更成功的剧作家,称其为“……一只暴发户乌鸦……在他自己的妄自尊大中,他是乡村里唯一的莎士比亚人”。那是 1592 年,威廉·莎士比亚并不高兴。在 20 世纪 60 年代,弗拉基米尔·纳博科夫的《强烈的意见》对塞万提斯、陀思妥耶夫斯基、帕斯捷尔纳克和奥威尔等“骗子”的看法非常强烈。我想知道,弗拉德·伊姆帕勒是否因为一个事实(令许多纳博科夫人感到惊讶)而得到证明,即他的《洛丽塔》在最终的、总体的“有史以来最好的书籍”榜单中排名第四,而他的四个被嘲笑的目标中没有一个进入前 10 名。纳博科夫从不关心奖项或他人的意见,但他会津津乐道于《洛丽塔》之前的三本书都是他最喜欢的作家(托尔斯泰以《安娜·卡列尼娜》和《战争与和平》位居第一和第三,福楼拜以《包法利夫人》位居第二)。当你考虑到马克·吐温的《哈克贝利·费恩历险记》排名第五,领先于比尔·奎尔的《哈姆雷特》排名第六时,你确实开始怀疑对艺术作品的“优于”关系进行数值排序的理智性。统计学家将特别意识到当您组合偏好列表时出现的扭曲。“>”重载为表示“选民偏好”,众所周知,传递性可能会丢失。因此,a>b 且 b>c 并不总是意味着 a>c。
比较程序只稍微容易一点!无论源代码的可读性如何(注意那些缩进,你这个邋遢的家伙)以及对象层次结构的选择,我们都有编译器和秒表作为准确性(错误计数)和效率(运行时)的客观指标。要直言不讳、强硬、穿上蓝色工作服地说:“去他妈的代码布局,伙计,我们的工资在哪里?”
回应的声音是:“但是调试和维护需要代码可读性。” 接下来是文学编程路线的分叉。雷·吉格特看到了文学类比在项目开始时起到的有益的文学作用,使用文学类比来塑造我们软件设计的方法。12 罗伯特·麦格拉斯对此过于草率地驳斥了,我认为,同时承认即使是微弱的类比也可能有助于提高参与设计和编码的人员之间的理解。13
与此同时,巴顿以更温和的目标,指的是一个新兴的“代码文学评论家群体”,他们准备指导不断增长的“源代码欣赏读者群”。领导这个群体的是迪奥米迪斯·斯皮内利斯,《阅读代码:开源视角》的作者(艾迪生韦斯利出版社,2003 年)。然而,斯皮内利斯的《阅读代码》的大部分内容都致力于我礼貌地称之为编程的前文字阶段。重点是阅读代码不是为了“文学乐趣”,而是为了始终是高度优先事项的原因:(1)了解程序员的意图;以及(2)调试或改进代码。
当然,揭露别人的低级错误有很多幸灾乐祸的乐趣(我相信,这就是胜利的“Yahoo!”的起源)。布局越令人愉快和逻辑,调试会话就越不无聊。我们现在开始看到各种线索汇聚在一起,以添加动态交互,这将帮助你理解任何屏幕显示:泰德·纳尔逊的超链接和蒂姆·伯纳斯-李的HTML。我想这被称为夏洛特的网。对于程序文本,虚函数名称是鱼肚灰色的;缺少的半冒号以假天蓝色闪烁。你可以单击私生子对象来定位其假定的父对象。
文学也在逼近。一个特别引人注目的例子是ADAonline,网址为 <http://www.ada.auckland.ac.nz/index.htm>,给出了纳博科夫的浩瀚、充满典故的小说《阿达或热情:家族编年史》的文本,它真的应该进入前 10 名。布赖恩·博伊德提供了可点击的链接来解释这些典故。
我们怎么能忘记所有人类话语最终都建立在NL(自然语言)之上?我正在用NL而不是计算机代码告诉你这一点。彼得·瑙尔说得对:他感谢授予他2005年图灵奖,但提醒我们人类的思维超越了图灵机。14 科学是关于描述的。这些描述最终可能会使用精确、一致、方便的符号,但首先我们需要就我们的目标进行聊天(也许是戏谑!),通过实践从非正式话语过渡到不太非正式的话语。我们接触过的NL的类型、语域、风格越多越好。NL天生就带有歧义的老生常谈不必使我们瘫痪。从伟大的文学作品中汲取营养可以让我们意识到利用歧义的巧妙方法。你会支持BackUs还是IgNaurus?
最后,正如承诺的那样,这是比雅尼·斯特劳斯特鲁普提供的一个函数示例,该函数在呈现回文字符串时返回 true。阅读并享受递归!问
bool is_palindrome(const char* first, const char* last)
// first points to the first letter, last to the last letter
{
if (first<last) {
if (*first!=*last) return false;
return is_palindrome(++first,--last);
}
return true;
}
斯坦·凯利-布特尔 (<http://www.feniks.com/skb/; http://www.sarcheck.com>),出生于英国利物浦,在 20 世纪 50 年代在剑桥大学攻读纯数学,然后在开创性的 EDSAC I 上研究计算机科学的杂质。他的众多著作包括《魔鬼的DP词典》(麦格劳-希尔出版社,1981年)、《理解Unix》(Sybex出版社,1994年)以及最近的电子书《计算机语言——斯坦·凯利-布特尔读者》(http://tinyurl.com/ab68)。《软件开发杂志》已将他评为首届年度斯坦·凯利-布特尔折衷技术奖的获得者,以表彰他在“技术和文学方面的终身成就”。诺贝尔和图灵都没有获得如此珍贵的同名认可。在他的笔名斯坦·凯利下,他还享有作为歌手和词曲作者的并行职业生涯。
最初发表于 Queue 卷。5,第 3 期—
在 < 数字图书馆> 中评论本文