什么是最好的Scheme解释器或编译器?

48

大家好,我想开始使用Scheme,并有两个问题。首先,你会推荐使用解释器还是编译器来运行Scheme?为什么?其次,你会推荐哪个Scheme解释器或编译器?为什么?谢谢!


我的问题和那些略有不同,但谢谢! - adhanlon
2
顺便说一句,作为一个没有明确细节的“最佳方案是什么”的问题,这个问题似乎非常主观。如果对于所有目的和用例都有一个最佳方案实现达成共识,那我们只会有一个! - Charles Duffy
这绝对是一个有建设性的问题,比我声望高的人应该重新开放它。 - ylun.ca
5个回答

32

我知道你已经接受了答案,但为了日后访问此问题的人,我推荐Chicken Scheme。与mzscheme相比,它往往产生更小的可执行文件。例如,考虑以下“hello world”应用程序:

(define (say-hello name)
  (print (string-append "Hello, " name))
  (newline))

(say-hello "Earthling")

使用 mzc 编译 hello.scm 文件得到的可执行文件大小为 3.3M:

使用 csc 编译 hello.scm 文件得到的可执行文件名为 ctest,大小为 16k:

如果您需要库支持,Chicken 提供了 Eggs Unlimited(类似于 mzscheme 的 PlaneT 或 ruby 的 gems),请查看Egg Index


4
鸡真棒。我还真能用它来做实际工作。别忘了Gambit-C也很重要。 - Jyaan
16
据我所知,mzscheme 创建静态链接的可执行文件,而 chicken scheme 则动态链接到 libchicken。 - Rui Vieira
7
没错,试着在没有Chicken Scheme的平台上运行那个16k文件。它是动态链接的。 - alvatar
9
使用选项“-static”,您可以从chicken编译器中获得一个静态链接的可执行文件。 对于“mzc”,需要在源代码开头添加“#lang scheme”声明。 然后,使用“mzc --exe mztest hello.scm”生成4.6M的可执行文件。 而“csc hello.scm -o cktest”生成3.2M的可执行文件。 - day
我曾经喜欢使用Scheme编程语言,但最近我的很多软件都出现了问题,这让我感到不满。我真的建议大家坚持使用Racket编程语言,因为它们在移植时不会出现问题。 - pankajdoharey

32

对于初学者,我强烈推荐DrRacket(前身为Dr. Scheme),因为它提供了一个非常好的工作环境,支持许多Scheme方言,并提供非常好的错误和调试信息。我相信大多数Scheme实现都是解释器,虽然可能存在编译器。

如果您像我一样是命令行控,您可以考虑直接运行racket解释器,这本质上与Dr.Racket相同,但没有图形界面和命令行接口。或者,用#! /usr/bin/env racket启动源文件并使用chmod +x source.rkt使其可执行。


3
Dr. Scheme 是我使用过的最完整的解释器之一。非常适合初学者,在命令行中遇到困难,并且无法将神秘的错误消息翻译成代码出了什么问题时使用。 - eric.christensen
5
实际上,Scheme编译器比解释器更多,并且有许多知名的编译器,如ikarus、chez(非免费版本)、gambit、chicken、bigloo。事实上,当前版本的mzscheme/DrScheme是JIT(即时编译)的。请参阅http://en.wikipedia.org/wiki/Category:Scheme_compilers。 - Nathan Shively-Sanders
我也是个命令行爱好者,我一直在使用Dr. Scheme,但我也会尝试mzscheme。我也稍微使用gambit-c,你对此有什么想法吗? - adhanlon

11

我建议使用Gambit-C方案:

  • 它符合R5RS标准。
  • 它既有解释器又有编译器。您还可以编译为ANSI C。
  • 它是开源的。
  • 它可移植。(它可以在Linux、Windows、Mac OS X甚至iOS上运行。)
  • 它具有简单的外部函数接口(FFI)。

初步检查显示,Chicken方案似乎不够令人满意,而Bigloo则可能是一个严肃的竞争对手。但我不能对它们发表太多评论。


5
你对 Chicken Scheme 不满意的地方是什么? - Omar Antolín-Camarena
3
我不能回答原帖作者的问题,但在我最近选择使用哪个方案时,我进行了一些(总是毫无意义的)基准测试,Gambit 在性能方面绝对比 Chicken 更快。平均而言,Gambit 似乎要快两倍以上。Chicken 的垃圾回收也慢得多,大约是十倍左右。 - Alex Celeste

10

我建议不要担心它是作为编译器、解释器还是两者结合的形式实现 - 尤其是在开始阶段,帮助文件的质量(例如)比它的具体实现方式更重要。

至于选择哪一个,DrRacket是我最常用的。


1
谢谢你的建议。我正在使用 PLT Scheme,我非常喜欢它。 - adhanlon
今天它被称为Racket。 - vonbrand
@vonbrand:是的,肯定需要更新了... - Jerry Coffin

6

PTL Scheme已更名为Racket(http://racket-lang.org/),但它基本上仍然是相同的。Dr.Racket是一个非常巧妙的开发环境,带有shell,要用Scheme编写,你只需要在文件顶部加上#lang scheme


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接