Scheme vs Common Lisp:哪些特性对您的项目产生了影响?

By guenchi at 16 天前 • 0人收藏 • 90人看过

https://softwareengineering.stackexchange.com/questions/41045/scheme-vs-common-lisp-which-characteristics-made-a-difference-in-your-project


我的本科学位是认知科学和人工智能。从那以后,我有一个单一的介绍Lisp。我认为这种语言很有意思(就像“优雅”一样)但是直到我很久以后遇到格林普森的第十条规则时才真正想到它:

任何足够复杂的C或Fortran程序都包含一个特殊的,非正式指定的,错误缠身的,一半Common Lisp的缓慢实现。

Greenspun的观点是(部分)许多复杂的程序都有内置的解释器。他没有将解释器构建成一种语言,而是建议使用像Lisp这样已经内置了解释器(或编译器)的语言更有意义。

当时我一直在开发一个相当大的应用程序,该应用程序使用自定义语言的自定义解释器执行用户定义的计算。我决定尝试在Lisp中重写它的核心作为一个大规模的实验。

花了大约六个星期。原始代码是大约100,000行Delphi(Pascal变体)。在Lisp中,减少到〜10,000行。更令人惊讶的是,Lisp引擎的速度提高了3-6倍。请记住,这是Lisp新手的工作!整个经历让我大开眼界; 我第一次看到了用一种语言将表现和表现力结合起来的可能性。

一段时间后,当我开始从事基于网络的项目时,我试用了许多语言。我将Lisp和Scheme包括在内。最后,我选择了一个Scheme实现 - Chez Scheme我对结果非常满意。

基于网络的项目是一个高性能的“选择引擎”我们以多种不同的方式使用Scheme,从处理数据到查询数据再到页面生成。在许多地方,我们实际上是用不同的语言开始的,但最终会迁移到Scheme,原因我将在下面简要介绍。

现在我可以回答你的问题(至少部分)。

在试镜期间,我们研究了各种Lisp和Scheme实现。在Lisp方面,我们看了(我相信)Allegro CL,CMUCL,SBCL和LispWorks。在Scheme方面,我们看了(我相信)Bigloo,Chicken,Chez,Gambit。(语言选择很久以前;这就是为什么我有点朦胧。如果重要,我可以挖出一些笔记。)

我们正在寻找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的表演。我们使用的东西感觉像是一种脚本语言 - 我们从中获得了本机代码的速度。对于一些无关紧要的事情 - 但它从来没有受到伤害,有时它帮助了很多。

第三,我们学会了喜欢抽象Scheme所能提供的。顺便说一下,我不只是指宏; 我的意思是关闭,lambdas,尾部调用等等。一旦你开始考虑这些术语,其他语言似乎相当有限。

Scheme完美吗?没有; 这是一个权衡。首先,它允许个体开发人员更有效 - 但是开发人员更难以理解彼此的代码,因为大多数语言都有的路标(例如,for循环)在Scheme中缺失(例如,有一百万种方法可以做一个for循环)。其次,有一小部分开发人员可以与之交谈,从中招聘,借用等等。

总而言之,我想我会说:Lisp和Scheme提供了一些其他地方无法广泛使用的功能。这种能力是一种权衡,所以最好是在你的特定情况下有意义的。在我们的例子中,决定使用Lisp还是Scheme的因素与非常基本的功能(平台支持,平台线程,运行时编译,运行时许可)有关,而不是与语言或库功能相关。同样,在我们的情况下,这也是一个权衡:使用Chez,我们获得了我们想要的核心功能,但是我们丢失了商业Lisp环境中的大量库。


1 个回复 | 最后更新于 13 天前
13 天前   #1

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...