轻量级编程语言

如果你把一群研究计算机科学以及像Perl、Python、Smalltalk和Curl这样的语言实现者关在房间里一天,会发生什么?将语言设计和实现的学术和商业方面结合在一起是上周在麻省理工学院人工智能实验室举办的轻量级编程语言研讨会(LL1)的有趣前提,我很高兴地说,这并不是你想象中的激烈辩论。

尽管各方有时会有些挖苦(主要针对我们),但这是一个充满善意和愉快的活动。为期一天的研讨会以乔治亚理工学院的计算机科学副教授Olin Shivers的主题演讲开始,他谈到了“Lambda”是终极的小型语言。他当然是在向我们传授Scheme语言的乐趣。Olin向我们展示了如何将Scheme作为实现特定领域语言(如awk)的基础,通过在Scheme中嵌入这些语言,不仅可以获得原始语言的力量,还可以获得实现语言的力量。警觉的读者会记得,这是Larry今年在洋葱状态中谈到Perl 6时提到的事情,也是Damian Conway和Leon Brocard在Perl 5中一直在研究的事情。

Olin通过在同一个例程中从Scheme调用Awk,然后从Awk返回到Scheme来展示他“嵌入”技术的威力。他还写了一个Scheme shell,但有人对能否仅通过Scheme语法执行类似shell的操作以及这是否意味着你有一个Scheme shell存在争议。Olin还驳回了关于在同一个函数中用相同的语法编写Awk、Scheme和Shell可能会造成混淆的建议,他说这从未困扰过他。

接下来是一场关于“更糟的是更好的”哲学优点的启发式讨论;也就是说,正确的做法不如立即正确的做法重要。我先发言,解释了Parrot开发必须在正确性、可维护性和速度之间找到平衡,并在最后提问为什么做正确的事情几乎总是与做快速的事情相反;Python开发者之一、非常和善的Jeremy Hylton回答说Python没有这个问题——对他们来说,正确性和可维护性比性能更重要,这给了他们在做正确的事情方面更多的灵活性。

Dan Weinreb提出了一个观点,即编程实现往往是由管理层的偏执所驱动的;幸运的是,开源语言实现社区和学术界在很大程度上对此免疫。然而,发布压力可能对未来性能产生不利影响,正如Java设计者之一Guy Steele所展示的,他告诉我们一个关于“更糟的是更好的”危险的悲伤故事——为了推出1.0版本,推迟了一些关键组件的实现(我认为是尾递归,但可能还有其他),这使得以后的实现变得更加困难。这与Python实现者添加词法作用域的经验相呼应。这迅速导致了关于没有词法作用域或lambda运算符的语言是否可以说得通当的讨论。

乔·马歇尔就Rebol编程语言的初始实现中的一个元素进行了简短演讲。Rebol 1.0与今天的“网络编程语言”Rebol略有不同——它基本上是去掉了括号的Scheme。他解释说,在他的原始Scheme实现中,他使用了一个极其复杂的技巧来避免栈溢出;这在下一版中被完全重写。再次证明,从长远来看,可维护性更重要。

接着是杰里米·希尔顿的演讲,主题是Python的设计和实现。有趣的是,至少对我来说,并不完全令人惊讶的是,杰里米是这次会议上与我和丹·苏加尔斯基最相似的开发者。Perl和Python的实现团队面临着非常相似的问题,并且以几乎相同的方式解决这些问题。也就是说,与我们看到的许多其他方法相比。

然后轮到我们了。此时我们已经非常晚了,所以我跳过了大部分演讲;丹解释了一个轻量级语言通常需要从它的解释器中获取什么,以及Parrot计划如何提供这些。SmallScript的开发者之一大卫·西蒙斯,SmallScript是一个“脚本”Smalltalk实现,对我们进行了挑战,询问了JIT编译Parrot代码的可行性,这是我们在查看Mono项目的JIT编译器之后感兴趣的事情。

整天的会议中,我们都对Shriram Krishnamurthi的演讲标题“Perl之前的猪”感到好奇。我们不知道这是指我们还是指在我们之前发言的杰里米。结果,Shriram做了一次非常有趣的演讲,讲述了Scheme及其如何应用于“懒惰、急躁和傲慢”的编程。他提到了一个Scheme Web服务器,其动态页面服务的速度比Apache/mod_perl快得多,以及一种操纵Scheme宏以提供预编译的状态机生成器的方法。他通过演示XML只是大量疯狂的不规则括号来反驳了关于Scheme只是大量疯狂的不规则括号的批评。这是一个很好的观点。

瓦尔德马尔·霍瓦特带领我们了解了JavaScript 2.0中涉及的一些更重要设计决策。不,不要嘲笑,它是一个比你想象的更全面的语言。他的主要观点是,不出所料,是拉里在他的洋葱状态演讲中注意到的另一件事;模块需要提供编码其API版本的方式,以保护其命名空间不受子类的影响。也就是说,如果有一个Perl模块Foo,你通过添加一个frobnitz方法将其子类化为Foo::Advanced,那么当Foo的原作者发布下一个版本的Foo,其中已经包含了frobnitz方法时,会发生什么?瓦尔德马尔的方法是使用版本特定的命名空间,只有当请求特定版本号时才暴露整个API的某些子集。这允许依赖模块进行未来证明。

Christopher Barber做了一场关于Curl的演讲,这是一种奇特的小语言,与Flash填补了相似的空白。David Simmons讲述了SmallScript以及他将Smalltalk移植到Microsoft CLR的工作;他对Microsoft .NET的发展前景充满希望。Jonathan Bachrach,一位AI实验室的研究员,做了一场精彩的演讲,我因为在外面走廊上与一位Scheme黑客讨论线程和继续的细微之处而错过了。我回来后看到他解释了一种既高效又难以理解的方法来判断两个类是否相同;他还说,他的语言编译成C语言,C编译器即时执行,因为调用GCC比启动自己的虚拟机要快。Paul Graham通过谈论他新的Lisp方言Arc来结束演讲。Arc被设计成仅针对“优秀的程序员”的语言,避免了如果你试图让语言易于理解而需要采取的捷径和安全措施。他的演讲非常有趣,我对他的小语言充满期待。

正如我所指出的,这次研讨会吸引人的地方不仅在于演讲本身,还在于演讲之外发生的事情;我和Dan遇到了许多有趣且聪明的人,与他们讨论我们的想法是一项挑战——特别是当我们与学术界同行意见不一致时。遗憾的是,似乎很少有人听说过Ruby,他们可能会后悔没有早点了解。Dan似乎学到了一些有趣的技术技巧,例如一种在不遍历堆中所有对象的情况下收集引用计数字符串的方法。哦,我们还发现,你应该先往容器里倒入液氮,而不是直接将液氮倒入牛奶和黄油的混合物中制作冰淇淋。这样制作的冰淇淋味道特别美味。

但说真的,我们都学到了什么?我认为我们了解到,我们现在在Perl实现方面面临的许多问题,早在30年前就已经被彻底研究和解决了;但我们还了解到,如果我们想找到这些研究,那么我们需要做很多挖掘工作。学术界擅长解决像线程、继续、调度等问题这样的棘手问题,但并不非常感兴趣于解决所有相关问题。要将学术成功转化为商业成果,正如Olin Shivers所说,需要“成为Larry Wall一年”——处理所有琐碎的实现细节,这不是获得博士学位的事情。

因此,推动力在我们这些严肃的语言实现者身上,我们需要花时间了解当前VM研究的最新进展,以避免重复造轮子。LL1会议以及由此产生的邮件列表,是我们了解情况并与学术界交流经验的有用方式,我热切期待下一届会议!

O’Reilly & Associates自豪地成为轻量级语言研讨会的联合赞助商。

标签

反馈

这篇文章有什么问题吗?通过在GitHub上打开问题或拉取请求来帮助我们。