我的本科学位是认知科学和人工智能。从那以后,我对Lisp进行了一门课程的介绍。我认为这门语言很有趣(就像“优雅”一样),但是直到后来我遇到格林斯潘的《第十条规则》时,我才真正想到了很多。
任何足够复杂的C或Fortran程序都包含一个临时的,非正式指定的,bug缠身的,缓慢执行的Common Lisp的一半。
Greenspun的观点是(部分)许多复杂的程序都内置了解释器。他建议与其使用一种已经内置了解释器(或编译器)的语言(例如Lisp),而不是将解释器构建为语言。
当时,我正在开发一个相当大的应用程序,该应用程序使用用于自定义语言的自定义解释器执行用户定义的计算。我决定尝试在Lisp中重新编写其核心,作为大规模实验。
花了大约六个星期。原始代码是约100,000行的Delphi(Pascal变体)。在Lisp中,减少到10,000行。然而,更令人惊讶的是,Lisp引擎的速度提高了3-6倍。请记住,这是Lisp新手的工作!整个经历让我大开眼界。我第一次看到了将一种语言的表现力和表达力结合在一起的可能性。
一段时间后,当我开始从事基于Web的项目时,我试听了多种语言。我将Lisp和Scheme包括在内。最后,我选择了一个方案实施-Chez Scheme。我对结果非常满意。
基于Web的项目是一个高性能的“选择引擎”。从处理数据到查询数据再到页面生成,我们以多种不同方式使用Scheme。实际上,在很多地方,我们最初使用的是不同的语言,但由于下面将简要描述的原因,最终迁移到Scheme。
现在,我可以回答您的问题(至少部分)。
在试听期间,我们研究了各种Lisp和Scheme的实现。在Lisp方面,我们研究了(我相信)Allegro CL,CMUCL,SBCL和LispWorks。在方案方面,我们研究了(我相信)比格卢,鸡肉,Chez,甘比特。(语言选择是很久以前的;这就是为什么我有点朦胧。如果重要的话,我可以摘一些笔记。)
马上,我们正在寻找a)本机线程和b)Linux,Mac和Windows支持。这两个条件共同导致Allegro和Chez除外(我认为),所有人都被淘汰了-因此,为了继续进行评估,我们必须放宽对多线程的要求。
我们整理了一套小程序,并将它们用于评估和测试。那揭示了许多问题。例如:某些实现的缺陷使某些测试无法运行到完成;一些实现无法在运行时编译代码;有些实现无法轻松地将运行时编译的代码与预编译的代码集成在一起;一些实现的垃圾收集器明显比其他实现的更好(或明显更糟);等等
为了满足我们的需求,只有三个商业实现(Allegro,Chez和Lispworks)通过了我们的主要测试。在三者中,Chez顺利通过了所有测试。当时我认为Lispworks在任何平台上都没有本机线程(我认为现在已经有了),而且我认为Allegro在某些平台上只有本机线程。此外,Allegro还收取了“打电话给我们”的运行时许可费,我对此不太满意。我相信Lispworks不收取运行时费用,而Chez则具有直接(且非常合理)的安排(并且只有在您在运行时使用编译器时,它才会生效)。
在Lisp和Scheme中都产生了一些重要的代码块,下面是一些比较点和对比点:
Lisp环境更加成熟。您将获得更多收益。(话虽如此,更多的代码也等同于更多的错误。)
Lisp环境很难学习。您需要更多时间才能精通;Common Lisp是一种强大的语言,而这是在您获得将商业实现添加到其之上的库之前的。(话虽如此,Scheme的语法情况比Lisp中的任何事情都要微妙和复杂。)
Lisp环境在生成二进制文件时可能会更加困难。您需要“摇动”映像以删除不需要的位,并且如果在该过程中未正确执行程序,则稍后可能会遇到运行时错误。 。相比之下,使用Chez,我们可以编译一个顶层文件,其中包括它需要的所有其他文件,我们已经完成了。
我之前说过,我们最终在许多原本不打算使用的地方使用了Scheme。为什么?我可以想到三个原因。
首先,我们学会了信任Chez(及其开发者Cadence)。我们从工具中提出了很多要求,并且始终如一。例如,Chez历史上的缺陷数量很少,其内存管理器非常非常好。
其次,我们学会了热爱Chez的表演。我们正在使用一种感觉像脚本语言的东西-并且我们正在从中获得本机代码速度。对于某些无关紧要的事情,但它从未造成伤害,有时甚至起到了很大的作用。
第三,我们学会了热爱抽象方案可以提供的东西。顺便说一句,我不仅仅是指宏。我的意思是诸如闭包,lambda,尾调用之类的东西。一旦您开始使用这些术语进行思考,其他语言似乎就受到比较的限制。
方案完美吗?没有; 这是一个权衡。首先,它可以使单个开发人员更加有效-但是开发人员更难以相互理解代码,因为Scheme中缺少大多数语言(例如for循环)的路标(例如,有上百万种方法for循环)。其次,要与之交谈,从中租借,从中借贷等的开发人员池要小得多。
综上所述,我想我会说:Lisp和Scheme提供了一些其他地方无法广泛使用的功能。该功能是一种折衷,因此最好在您的特定情况下有意义。在我们的案例中,决定是否使用Lisp或Scheme的决定性因素与非常基本的功能(平台支持,平台线程,运行时编译,运行时许可)有关,而与语言或库功能无关。再一次,在我们的案例中,这也是一个折衷:通过Chez,我们获得了所需的核心功能,但是却失去了商业Lisp环境所拥有的大量库。
另外,仅重申一下:很久以前,我们研究了各种Lisps和Schemes。从那时起,它们都得到了发展和改进。