汝为何物?
我不知道一张图片是否真的值一千个字(现在大多数图片似乎都大得多),但是当我谈论Perl时,我经常放一张图片,显示Perl中的一些想法来自哪里。
我通常会开玩笑说语言学并非真的是常识的反义词,然后继续大量谈论它们,并加入一些计算机科学的内容作为调剂。但是去年十二月我在斯德哥尔摩发表演讲时,有人问我 Perl 是如何从艺术中获得灵感的。我被难住了。我含糊地说了一些半非理性的东西(在讨论艺术时总是合适的),然后继续我的演讲的其余部分。
但是这个问题继续困扰着我;或者更具体地说,它继续困扰着我的左脑。我的右脑仍然对所谓的联系感到非常满意。不幸的是,它也根本不愿透露解释自身所需的言语。右脑往往就是那样。所以让我看看我的左脑是否能从中得出一些结论。
艺术首先基于存在非道德决定的概念,也就是说,你可以做出任何一种选择,而不会感觉自己是淘气或乖巧。因此,让我们假设艺术家拥有某种形式的自由意志,因此可以像你普通的日常创造者一样行事。
现在,你的艺术家是因为喜欢豪华设计师宇宙而创作,还是仅仅因为喜欢咖啡因而创作,这或多或少无关紧要。简单的事实是,我们有艺术家,他们从事艺术。我们只需要处理它。我们真的需要。你可以让艺术家痛苦,但艺术家有报复的方法。(当然,如果你不让艺术家痛苦,他们会让自己痛苦,但这又是另一个故事了。)
我们可以进一步将艺术家细分为那些喜欢通过比适当的痛苦更痛苦来获得报复的人,以及那些喜欢通过比适当的痛苦更少痛苦来获得报复的人。第一种艺术家更喜欢在更正式的媒介中工作,这种媒介会给艺术家带来额外的痛苦,例如创作十四行诗、跳芭蕾舞或编程 C++。第二种艺术家往往更喜欢玩乐、自由奔放和不受约束,无论所讨论的动词是作曲、跳舞、编程还是投掷。(尤其是投掷。没有人比 B.S. 艺术家更快乐了。我应该知道......)
当然,还有第三类艺术家,即在两个极端之间摇摆不定的艺术家。
Perl 的编写首先是为了让艺术家做出非道德的决定。这就是为什么 Perl 的口号是“不止一种方法可以做到!”Perl 真的不在乎你在绘画的某个特定位置使用钴蓝色还是焦赭色。这是你的选择——你是艺术家。你对整体效果负责。实际上,你的老板会对整体效果负责,所以 Perl 为什么要负责呢?
但更重要的是,Perl 旨在成为那些厌倦了用正式计算机语言写作并想写一些没有任意限制的“自由诗”的人的媒介。当然,从动机的角度来看,任意限制对于工作来说是具有挑战性的,但你上次看到一个兴高采烈的 COBOL 程序员是什么时候?
另一方面,通过 Perl 5,我们在让那些摇摆不定的艺术家生活得精彩方面取得了长足的进步。你可以鱼与熊掌兼得。当您处于狂躁情绪时,您可以尽情倾泻出非结构化、不可读(但富有表现力)的代码。稍后,当您处于忧郁情绪时,您可以在脚本顶部放置一个 -w 和一个 use strict,并大大提高您的纪律水平(读作“痛苦”)。接下来,您可以为您的函数定义制作原型。当您仍然处于忧郁状态时,您可以返回并在所有正则表达式中放入空格,并注释掉每一个小细节,作为对您过去轻率行为的忏悔。您可以将所有代码重组为模块,并快速进行单元测试,因为 Perl 解释器非常方便调用。然后,当您再次回到更无忧无虑的心态时,您可以作弊,通过调整所有这些经过仔细封装的变量,在所有这些经过精心重组的模块中进行修改。这不是生活吗。
现在,语言学可能不是常识的反义词,但最近二十年来,许多计算机科学家已经公开反对编程艺术,这肯定是事实。在试图使编程可预测的过程中,他们主要成功地使其变得枯燥乏味。这样做,他们忽视了编程是一种人类追求的想法。他们设计的语言更多是为了让计算机高兴,而不是程序员。哪个 SQL 程序员曾经对不得不将一个值声明为 varchar(255) 感到高兴?糟糕,现在它是一个键,长度不能超过 60。谁想出这些数字的?
他们也忽视了任何艺术家都知道的想法,即形式和意义是深刻相互依存的。我在 Perl 设计中不断强调的一个想法是,不同的事物应该看起来不同。许多人讨厌用 Lisp 编程的原因是因为一切看起来都一样。我以前说过,我会再说一遍:Lisp 具有所有视觉吸引力,就像燕麦片里混入了指甲屑。(除此之外,它是一种非常好的语言。)
Perl 的大部分设计都受到视觉心理学要求的驱动。这就是为什么 Perl 允许您根据想要强调的部分,将条件放在左侧或右侧来构建代码。这就是为什么像 while 循环这样的大型嵌套结构需要显式的开始和结束,而像列表运算符这样的小型结构则不需要。这就是为什么标量以 $ 开头,数组以 @ 开头,哈希以 % 开头。这就是为什么文件测试运算符看起来像“-M”,而数字测试看起来像“==”,字符串测试看起来像“eq”。Perl 在很大程度上是一种所见即所得的语言。你可以尽情谈论可读性,但可读性首先取决于可识别性。
像许多计算机极客一样,我的大部分艺术训练都是在音乐方面进行的。在所有艺术中,它最清楚地划分了程序员/解释器,因此音乐家自然会思考解释器是如何工作的。但是计算机语言的解释器位于计算机和人脑中。我并不总是知道是什么让计算机悲伤(或快乐),但我确实很清楚是什么让人发疯(或伤感)。呃,抱歉。
无论如何,当我年轻的时候,我被教导音乐经历了四个主要时期:巴洛克时期、古典时期、浪漫时期和现代时期。(其他所谓的艺术也经历了这些时期,尽管速度不一定相同。)我一直觉得我们称当前时期为现代时期相当奇怪,因为从定义上来说,现代性的概念似乎是一种永久锁定状态,注定要与时间的游标绑定在一起,可以这么说。但那是因为“现代”这个词在当时仍然意味着什么。毕竟,那是 1960 年代。谁能想到现代时期之后会是后现代时期呢?
如果你现在愿意承认计算机语言的设计是一种艺术媒介(和探索),那么我们有理由问问自己,编程语言是否也经历了相同的艺术发展序列。当然,人们偶尔会声称 Perl 是“巴洛克式的”,对此我通常的回答是,“谢谢,我也喜欢巴赫。”但这只是最纯粹的修辞(双方都是如此)。
那么当我们谈论这些时期时,我们真正指的是什么呢?让我们从头开始,即巴洛克时期。当然,这并不是真正的开始。早在人们发明水桶来装载曲调之前,他们就已经在创作音乐了。但是在巴洛克时期之前和期间,音乐的制作和出版都取得了巨大的技术进步。作曲家和表演者可以成名。创新者获得了奖励,但表达形式受到文化期望和可用硬件的严重影响。人们被期望即兴创作。我们得到的是或多或少是音乐的寒武纪大爆发。
同样,在计算机时代的曙光时期,也出现了新的创新机会。那个时代的天才们即兴创作了许多汇编语言形式。对他们来说,这些语言看起来都非常不同。但是现在我们倾向于将所有汇编语言都视为相同的,就像许多巴洛克音乐在我们看来是相同的一样,因为音乐倾向于遵循特定的形式和序列。巴洛克音乐的结构就像织布机上的编织物,而穿孔卡片是在用于运行计算机之前发明用于运行织布机的,这绝非偶然。
很容易对这些创新者采取优越的态度,但这不公平。我们对这些人负有巨大的债务。他们发明了我们使用的算法,即使音乐有时看起来有点局限。(除了巴赫和巴科斯,当然。)
古典时期是标准化的时期。我们大多数现代乐器都在这个时期形成了现在的形式,这延续了将演奏技巧转化为可销售和便携式商品的趋势。能够使用 FORTRAN 编程就像能够弹钢琴一样。这是一项你可以在别人的机器上使用的技能。莫扎特现在可以巡回演出了。
浪漫时期是探索古典形式可以扩展到多远的时期。它们被大大扩展了,在贝多芬和马勒,以及 PL/1 和 COBOL 中都是如此。“过度”这个词已被应用于所有这些,因为它将永远应用于任何试图通过任何一个把手来挥舞整个宇宙的人或事物。但这在最好的情况下也很困难。
最后,典型的过度反应发生了,我们进入了现代时期,在这个时期,微妙性和极简主义成为强制,过时的文化期望被推翻和抛弃。从巴托克到凯奇,从帕斯卡到 C,还原主义和解构主义成为时代的主流。音乐不允许是调性的,计算机语言不允许进行花哨的 I/O。所有的小工具都必须是可见和暴露的。一切都必须看起来很困难,所以我们陷入了图灵焦油坑。
当然,这一切都被过度简化了,每种语言都包含这些时期中的每个时期的方面。语言还以其他方式专门化:BASIC 就像流行音乐。收听 REXX 以获得轻松聆听的经典之作。Tcl 像爵士乐一样模糊——你可以即兴创作很多,而且你永远无法确定是谁在解释什么。Python 就像 MTV——它很摇滚,但半小时左右后就会变得很单调。
Lisp 就像各个时代的教堂音乐,适应流行的文化,从管风琴到电吉他再到合成器。这将使 Scheme 成为一种邪教音乐,用原声吉他简单而热情地演唱。
C++ 就像电影音乐,规模宏大,但总体上仍然是文化衍生品。尤其庞大。有时很难看完整部电影。然而,作为一种有意的后现代语言,它有点有趣,并且可以完成工作。
至于 Java,使用电影音乐的子集,它试图成为各地所有美好感觉的基础,所有情感存在的基础。背景音乐。它无处不在。
Shell 编程就像 20 世纪 50 年代的自动点唱机——如果它已经有你的歌,那就太棒了。
当然,任何受 ANSI 影响的语言都开始听起来明显像歌剧。
那么 Perl 在这个光荣的混乱中处于什么位置呢?像 C++ 一样,Perl 从设计上来说是一种后现代语言,毫不掩饰地是重建主义和衍生品。Perl 是新巴洛克式、新古典主义、新浪漫主义,甚至在某些方面是新现代主义。
什么音乐流派包含如此多的内容?在哪里可以找到从瓦格纳到“刮胡子和理发,两毛钱”的一切?在哪里可以找到多个抽象级别,新手和老手都可以访问?什么样的音乐允许从口琴到手风琴再到管风琴的一切?什么样的音乐是面向对象的,与主要动作一一对应?什么样的音乐适合小型编程,但可以根据需要扩展到故事片长度?什么样的音乐戏仿世界上的一切,但让你对世界感觉良好?什么样的音乐是 Perl?
为什么是卡通音乐,当然。就这样,各位!
Larry Wall 不介意因 Perl 的发明而受到指责,在某种程度上你可以为此指责任何人,但你不能,就这样。