Scheme科学计算

By guenchi at 2009-01-09 • 0人收藏 • 542人看过

Scheme科学计算

原帖:http://fmnt.info/blog/20181029_scheme.html


2018-10-29

介绍

Lisp是迄今为止可用的最强大的(简单和富于表现力的)编程语言家族。Scheme是其最典雅的方言之一。(对于方案的快速概述,请参阅附录:方案 的SICM ;对于更详细的研究,参见 SICP ;对于Lisp的励志散文看这里 和这里。)

计划不是通用语言。这意味着可用库比主流选择要少,并且难以将Scheme程序与大型协作的代码库接口。此外,存在不同的实现方式和方言,导致社区分散。为一个实现编写的程序可能无法与另一个实现一起使用。语言标准本身引起争议,R6RS引入了对先前版本的突破。

鉴于现代科学计算需求,这是对四个Scheme实现/方言(Chez 9.5,Chicken 4,Gambit 4.2,Racket 7.1)的比较(请参阅此帖子以获取更一般的指南)。这些包括纯数值应用程序,也包括符号计算。请参阅 scmutils (在线README)以获取显示Scheme表现力的示例包。

比较方式

对于每个项目,以粗体显示的实现均优于其他实现。列出的项目从最重要到最不重要。技术细节是指从2018年10月检索到的信息。测试在Debian 4.18.10-2(2018-10-07)x86_64 GNU / Linux下执行

速度与可靠性

根据这些基准, 在较大的社区中,最快,最可靠的Scheme实施为:ChezChickenGambit和 Racket所有这些都以Debian软件包的形式提供,并且从源代码提供了简单的安装。

Bigloo (R5RS)和Larceny (R5RS,R6RS,R7RS)的性能也不错,但不能作为Debian软件包使用。)

  • Chez可以更快地用于更广泛的应用程序(与SBCL Common Lisp相同)。

  • Chicken。Chiken基准测试结果明显不同。例如,根据Gambit基准测试页, 其性能与Racket(MZScheme)类似或更好。取而代之的是,在此页面 (相同的算法)上,Racket的速度通常比Chicken快2倍,除非使用连续性且Racket的速度慢得多。请注意,在这些基准测试集中,Chicken的编译选项保持不变。使用Chicken编译器和运行时选项(如Chicken网站上所述)可以显着加快特定程序的速度,因此以我的经验,Chicken通常胜过Racket(仍然保留在同一个梯队)。

  • 与Chez相比,Gambit的表现尤其相似,尤其是在数字基准测试中,并且总体上类似或在几个因素之内(最坏情况下要慢10倍)。

  • Racket的变化较大,通常在Chez / Gambit的O(1)-(10)范围内,但在某些情况下,球拍的变化慢O(100)倍。Racket vs Gambit基准测试表明,除了需要捕获和调用连续性的程序外,大多数情况下,Racket处于同一领域。Racket vs Java表明,Racket通常比Java慢1到5倍(某些基准测试速度要慢10倍,但CPU负载却大不相同。)

就是说,上面提到的基准类型应该以一粒盐作为基准。他们只考虑运行时效率(并非总是最优,请参见Chicken Scheme案例),而忽略了开发时间。Python是科学上最受欢迎的语言之一,但是它(CPython)的执行速度慢,比C 慢100倍。使用Scheme实现仅比C / C ++慢1到10倍,这是一个重大改进。记住程序员之间差异也很重要 可能大于语言之间的差异,这表明对于整体效率而言,适当的编程风格比特定的语言选择更为重要(前提是它们处于同一水平)。

第三方库和程序包管理器

  • Chez缺乏成熟的第三方库软件包管理器(尽管它具有支持它的工具)。正在努力提供标准存储库。Thunderchez 看起来是这个方向上最有前途的项目。Raven的目标是成为一个可靠的软件包管理器,但是安装说明不一定很方便(例如,需要为“ Chez Scheme”编译器保留“方案”可执行文件名称)。

  • Chiken:鸡蛋是一整套可靠的软件包,受到社区的大力支持。可以使用Chicken自己的软件包管理器安装它们。不幸的是,缺乏科学图书馆。

  • Gambit列出了与某些可能有用的库兼容的R5RS库。但是,官方网站上的几个链接都被破坏了,无论如何图书馆的支持还是很有限的(几乎不包括SRFI),安装脚本经常被破坏或需要破解。Gerbil的 目的是为系统编程提供包含电池的Gambit,但其安装说明无法立即生效。

  • Racket有一个很好的包装经理raco图书馆令人惊讶地具有良好的支持,例如用于绘图。但是,几乎没有数字库。同样,尽管有完整且文档齐全的软件包(标准库对初学者特别有用,但标准库提供了出色的支持),但是第三方软件包的一部分却是不完整的原型级别,并且缺少文档。这总比没有好(让我们说一个包装到C库的框架,很容易扩展它),但是并不理想。

外功能接口

鉴于缺少本机库,外函数接口(用于调用用C或使用与C相同的调用约定的语言编写的过程,反之亦然以从C调用方案过程)很重要。

  • Chez拥有从C导入/导出C方案功能的程序。与Gambit相比,文档还不清楚。例如,在提到发行版时,文档仅考虑Petite Chez Scheme解释器(在最新的Chez Scheme 9下载页面上不可用),而不考虑Chez Scheme解释器和编译器。

  • Chicken具有出色的C接口(甚至可以轻松地将C代码嵌入Scheme源文件中)和扩展名,使其更易于使用。它支持将Scheme过程嵌入C中。还提供了调用Python 2函数的扩展。

  • Gambit具有简单的过程,可以在Scheme中导入C函数,并使Scheme函数可用于与C兼容的语言中导入(它们仅与编译器一起使用,而不能与解释器一起使用)。编译器可以轻松创建共享库。

  • Racket具有一个相对简单的接口来导入C函数,但是似乎需要将Racket嵌入到C中。

并行运算

  • Chez支持多种体系结构上的本机线程。缺乏简化其使用(例如通过并行映射过程)的库限制了实用性。

  • Chicken核心仅支持绿色线程(扩展也支持类似白蚁的并发,请参见下文),可通过Eggs扩展(例如MPI)进行并行计算。

  • Gambit通过Termite语言(在Gambit之上编写)支持绿色线程,但是它缺少文档。

  • Racket支持并行化(使用期货和场所),包括MPI和用户友好的并行映射(pmap)库。但是,这很棘手,由于相关的开销,并行计算比串行作业花费更长的时间并不少见。

调试和分析

  • Chez有一个不错的调试器和出色的分析工具。

  • Chicken也有一个不错的调试器,很棒的错误消息,但是分析器相当有限(例如,如何将内部定义的过程跟踪到其他过程至少是不明显的)。

  • 每次错误评估某项内容时,Gambit调试器都会跳入嵌套提示,这在交互式编码时可能很烦人。但是,有些快捷方式和命令使它易于使用。

  • 在DrRacket和Emacs中,Racket都有错误消息。它具有带宏步进器的调试器。探查器还支持多个线程。

源文档工具

  • Chez:stex是一种类似Latex的语言,用于使用内置命令(用于显示Scheme代码)来编写文档(与源代码分开)。

  • Chiken:核心和鸡蛋文档可通过Wiki获得。该chiken-doc的扩展使其可以通过命令行和从解释所有可用的文件,提供了良好的可达至芯的语言,并上载于鸡的基础设施的鸡蛋扩展。还提供了类似于Doxygen的源文件扩展名(“ Hahn egg”),但似乎并未广泛使用。

  • Gambit:别无选择。

  • Racket:涂鸦。强大的语言,可惜它主要用于与源代码分开编写文档。这是记录球拍项目的标准。

SLIB 还支持Chez和Gambit, 后者具有很好的内联文档语言Schmooz。

社区

  • Chez,Gambit:在这两种情况下,项目的核心主要是一小部分开发人员的努力。

  • Chicken:非常有用的社区,该语言的核心开发人员通常提供帮助(邮件列表和IRC)。关于如何为项目做出贡献的欢迎指导。尽管文档总体上很清晰,但其形式分散在官方手册和Wiki周围。

  • Racket:乐于助人的社区,出色的文档资料和几种教学资源(实际上存在趋向冗长的趋势)。开发和邮件列表要求在专有平台上拥有帐户。

编辑

  • Chez:没有IDE。伟大的本地REPL。

  • Chicken:没有IDE,非常基本的本机REPL。通过Eggs可以安装一些扩展程序,这些扩展程序可以增强它并使其成为一个出色的REPL。

  • Gambit:没有IDE,良好的本地REPL。

  • Racket:DrRacket。对于非Emacs用户,这是最佳选择。请注意,与普通的方案REPL相比,Racket的交互性较差,因为在切换到REPL之前,对定义缓冲区进行了整体评估(对于单个定义没有类似Emacs的eval-last-sexp Cx Ce)。

也就是说,Emacs支持所有实现。

标准支持

R6RS有争议,与R5RS不兼容。但是,与R5RS相比,它还引入了有用的功能(例如,异常,库)。

R7RS-small是最新的简约方案修订版,相对于有争议的R6RS有所改进。

  • Chez:R6RS。(在开发问题页面上讨论时,Chez可能会考虑支持R7RS。)

  • Chicken: R5Rs,R7RS(实验性)。

  • Gambit:R5RS。它具有R5RS的许多扩展(例如,异常处理),但缺乏某些功能(例如,诸如define-libraryimportexport的库工具)。

  • 球拍:虽然它并不旨在支持Scheme标准,但它几乎具有R6RS的超集。

讨论区

在这里,我们详细讨论类似的实现。

Chez和Gambit

Gambit更小,更简单,文档也更清晰。Chez更大,文档更扩展(并由出色的The Scheme Programming Language集成);但是,有关软件发行的章节可能会从更新中受益。Chez支持R6RS的库,但是第三方库的可用性有限,并且没有已建立的程序包管理器。Gambit有其自己的库系统,并且通过半官方的软件包管理器可以使用一些第三方库,但是通常它们的安装很困难,并且指向文档的一些链接也断开了。

仅与Gambit合作将主要需要为C程序编写接口,即使对于大多数基本任务也是如此。作为共享库进行分发很不错,但是此过程需要繁琐的Makefile。第三方库更好地支持Chez,并且Scheme编程语言(由Chez作者编写)专门针对数值示例。在这两者之间,目前,Chez似乎更适合于数值计算。

Chicken和Racket

Chicken拥有可靠的软件包管理器,库和一个乐于助人的活跃社区(这也是此处讨论的唯一Scheme,其源文件可在自托管git存储库中找到)。有大量关于该语言的实践方面的教程,也针对其他语言的程序员。编译器需要进行试验(使用不合适的选项可能会很慢),但是如果需要,它可以为优化留出很大的空间。网上公开的基准测试使Chicken在球场上的速度比C慢了10倍,与Racket相当,但方差却小得多(尤其是在捕获连续性时更方便)。

球拍具有许多不错的功能。球拍的主要语言与RnRS不兼容,不一定是(不利)优势。它具有出色的包管理器和大型库存储库。对于来自Python的人们来说,这可能是最友好的实现。但是,如果需要,将Racket嵌入C可能会很困难。性能差异很大,使用连续性和I / O操作会严重降低程序速度O(10-100)。总体而言,它的位置比C慢10倍(另请参阅Benchmarks Game)。

结论

考虑到科学编程中的用法,我们比较了Chez,Chicken,Gambit和Racket。它们可以分为两组:

  • Chez和Gambit。与C / C ++ / Fortran竞争激烈。相对较小的社区和严重缺乏库。

  • 鸡肉和球拍。良好的性能,通常仅比Chez和Gambit慢一些(大约在O(10)以内)。良好的社区支持和大量的图书馆。然而,缺乏科学库。

不幸的是,缺乏科学库是一个严重的实际问题,没有理想的实现方式来立即替换流行的语言(如Python)。从头包装到C / C ++ / Fortran库的写入可能需要付出不可忽视的努力。Chez和Gambit中没有软件包管理器,因此使用这些高效且可靠的实现方式过于不切实际。由于Racket的运行时效率(尤其是在捕获连续性时)和包质量方面存在很大差异,Chicken似乎是最适合用于科学计算任务的Scheme实现的候选人。

非常需要围绕Chez的大量社区工作(从建立程序包管理器开始)。随着大型项目采用Chez(例如,已经计划在Chez中实施Racket本身),可能会达到关键的用户数量。

其他

作为Lisp方言的Scheme的一个明显替代方案是Common Lisp。Common Lisp具有出色,高效(运行时通常与C相同的顺序,只有几个因素较慢)的实现,例如SBCL (与Chez Scheme相同的球场),大型社区,成熟的包管理器,可轻松访问广泛的库(quicklisp)经常收到新的捐款。Scheme在概念上比Common Lisp更简单,这归功于它只有一个用于函数和变量的命名空间(以及其他差异)。例如,Scheme只需要为变量和函数都定义,就没有defunsetf, defvar等(但是,当然,如果需要,可以将它们定义为Scheme的扩展,例如,以领域特定的语言)。特别是,Scheme不需要笨拙的 funcall进行功能应用。

另一个值得考虑的Lisp方言是Clojure。它得到了积极维护,其社区规模远大于Scheme实现周围的社区(尽管与主流语言(如Python)相比规模较小,但它仍提供出色的文档和支持)。虽然是含电池的现代语言,但感觉比Common Lisp简单得多。在某些方面,它的设计选择也使其比Scheme更直接,例如,请参见哈希表和集合的实现。值得注意的是,核心语言对并发具有出色的支持。原生Clojure软件包的数量与Python相比并不具有竞争力,并且C / C ++代码的集成并非易事。但是,在Java虚拟机上运行时,可以轻松访问所有可用于Java的库(机器学习最受支持的语言之一)。项目构建和自动相关性解决方案通过Leiningen(适用于中型和大型项目的构建自动化工具)进行管理。基准测试 将其与Java和SBCL(Common Lisp)放在同一个位置,以提高运行时性能,而它很容易成为内存需求的2倍。

考虑到Scheme的实现在科学计算中的使用存在严重的实际困难(例如,作为典型的C / C ++和Python联合使用的替代品),Clojure似乎是基于Lisp的出色的即用型替代品,但仍不会偏离方案的简单性

更新(2019-09-12):感谢Marc-AndréBélanger指出Gerbil现在非常易于构建,并且带有程序包管理器和构建系统来促进软件交付。


登录后方可回帖

登 录
信息栏

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...