这些常见的对口齿不清的旧批评在今天仍然适用?


29

在1984年由Stanford的Rodney A. Brooks和Richard P. Gabriel撰写的“ Common Lisp批判”中,讨论了Common Lisp规范化委员会保留的一些设计决策。尽管大多数讨论仍然有效,但是有两种说法是指当时可用的技术,今天可能是错误的。

这两个语句是:

由于“任何好的编译器”都可以照顾到这种语言,因此消除了这种语言的太多成本。到目前为止,还没有人编写过(即使没有付出巨大的努力也不会编写)一种编译器,该编译器完成了预期的技巧。

由于我是Lisp的新手,甚至是学徒,因此我无法比作者更具体。他们似乎指出,该语言的多个方面已经内置了极大的通用性和灵活性,这使得编写一个好的编译器非常困难。

在COMMON LISP中,对浮点算法的控制太多了。当然,尽管可以获得浮点密集型程序的正确行为,但性能可能会发生巨大变化。

据我了解,用Common Lisp编写高效的数字代码似乎是可能的,但比必须的更具挑战性。

那是三十年前。如果我愿意为一种常见的自由软件实现(CLISP,SBCL等)编写Common Lisp程序,我今天应该如何看待这些声明?


好问题!希望收到有关Common Lisp的专业知识。基于当今Common Lisp的相对受欢迎程度,我担心它们仍然会适用。

1
浮点数很难正确理解。一些语言指定了严格的模型并明智地采用了性能,而其他语言则使用了松散的模型并且难以推理。例如,对于我来说,即使是简单的C#浮点程序推理也很难。所以我倾向于支持对浮点数严格的语言设计师,即使这会降低性能。
CodesInChaos 2013年

2
另一方面,现代硬件通常实现IEEE浮点,因此其行为可能比1984
。– microtherion 2013年

Answers:


31

这篇论文有很多有趣之处。

最有趣的部分是:作者伪造了1984年的论文,仅仅两年后的1986年。Brooks和Gabriel开发了高度优化的Lisp编译器,并在商业上非常成功地销售了几年:Lucid Common Lisp(PDF)。

LispWorks仍可提供对此Lisp编译器的维护:它现在称为Liquid Common Lisp

Liquid CL的编译器优化在《高级用户指南优化Lisp程序》的第3章中进行了介绍。

Lucid CL已编写并部署了一些商业应用程序。例如,在我的家乡,第一个用于HVV的公共交通信息系统(Hamburger Verkehrsverbund)是在SUN SPARCstation上使用Lucid CL部署的。可以使用大型触摸屏在火车站和呼叫中心向公众提供。

Lucid CL之所以成功是因为它的生产模式编译器创建了快速的Common Lisp应用程序,主要用于Unix / RISC平台。

布鲁克斯(Brooks)和加百列(Gabriel)在1986年撰写了有关《清醒的普通Lisp》的文章:

动态可重定目标的编译器已被证明是一种可以轻松实现各种Lisp实现的编译的方法。一种将Lisp系统移植到各种计算机上的方法;以及从通用来源为各种计算机生成高质量,高性能代码的工具。

因此,他们只是实施了《普通口述评论》所声称的困难或不可能的事情。

如今,更高级的实现进行了很多优化,但是硬件也比我们在1984年的速度快1000倍以上。VAX11/780当时具有一个MIPS(每秒百万条指令),而Lisp机器也处于这个范围。摩托罗拉68000的时钟速率为8 MHz。

对浮点性能和通常变化的性能的批评仍然有效,但这反映了实现者的选择。某些实现未开发为高性能编译器。他们的主要重点可能是可移植性,紧凑性或其他目的,因此它们具有不同的实现目标。

作为用户/开发人员,不必强迫自己编写可移植的代码并使用当前支持的所有十多个Common Lisp系统。使用最适合应用程序问题的实现。


您的答案非常精确和详尽,绝对值得赏赐!
user40989 2013年

1
“高度优化”并不一定意味着编译器“足够聪明”。单词“足够聪明”提出了“出于什么目的?”的问题。还有一些应用程序(主要是针对非常有限的嵌入式平台),您不会在Common Lisp中编写这些代码,因为优化仍然无法消除动态类型,堆分配和垃圾回收带来的所有运行时开销。当然,Common Lisp在这种“失败”中绝不是唯一的。在野外还没有观察到真正适合于所有事物的语言。
Steve314 2013年

@ Steve314:Lucid CL目标是Unix工作站和服务器上基于Lisp的大型AI系统,CAD系统等的市场。清醒的CL目标不是嵌入式系统。清醒的CL解决了动态类型,堆分配和许多其他优化区域(包括高性能垃圾收集器)的运行时开销。尽管如此,GC是最需要的。通常,应用程序使用特殊技术来避免打扰,从而降低GC率,例如“资源”池。
Rainer Joswig

21

在1984年撰写本文时,具有1 MB RAM和20 MB硬盘驱动器且能够坐在您的办公桌上的计算机意义重大。自然,与Lisp在斯巴达式的硬件上一样高级的语言的实用性会引起争议。从那时起,硬件和编译器技术的进步使Lisp程序的编写和执行变得更加容易,而不管该语言中可能存在的任何数字效率低下。

程序员经常将计算效率换成编程效率。Lisp可以是​​一种慢速语言(在某些实现中,其他语言也可以),但是它在快速开发方面也享有良好的声誉,并且许多程序不需要高度优化的基础结构即可表现出足够的性能。

Lisp实现的选择会极大地影响程序的性能。例如,CLISP容易接受“如果代码是大量数字,则您可能更喜欢CMUCL”。几种现代的Lisp(和Scheme)实现允许您指定数字类型提示,这将提高数字性能。

简而言之,今天的情况比那时好得多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.