45

有 Gambit Scheme、MIT Scheme、PLT Scheme、Chicken Scheme、Bigloo、Larceny、...;然后是所有的口齿不清。

然而,(据我所知)LLVM 上没有一个流行的方案/lisp,尽管 LLVM 提供了很多不错的东西,例如:

  • 比 x86 更容易生成代码
  • 轻松进行 C FFI 调用...

那么为什么 LLVM 上没有好的方案/lisp 呢?

4

10 回答 10

25

LLVM 提供了很多,但它仍然只是函数式语言所需的运行时的一小部分。C FFI 调用并不复杂,因为 LLVM 将内存管理留给其他人处理。与垃圾收集器交互是使 FFI 调用在诸如 Scheme 等语言中变得困难的原因。

您可能对HLVM感兴趣,但目前它还不仅仅是实验性的。

于 2010-01-26T23:59:08.277 回答
15

对于 CL:Clasp是 LLVM 上的 Common Lisp 实现,而mocl在 LLVM 上实现了 Common Lisp 的一个子集。

对于 Scheme:有一个自托管 Scheme->LLVM 演示一个用于 Bigloo Scheme 的原型 LLVM 后端

对于 Clojure:有Rhine,它是受 Clojure 启发的 lisp。

于 2015-01-11T23:31:27.577 回答
13

这里有一个非常小且显然未优化的 Scheme 编译器:

http://www.ida.liu.se/~tobnu/scheme2llvm/

从字面上理解你的问题,

  • 编写编译器很难。
  • 像上面链接的那样糟糕的实现可能会阻止新的实现。访问 LLVM 页面的人会看到已经有一个 Scheme,并且不必费心编写一个。
  • 编写和使用 Scheme 的人数有限(顺便说一句,我是其中之一,不是仇恨者)。
  • 现有的 Scheme 解释器和编译器有很多,并且没有急需一个新的。
  • 使用 LLVM 编写新的解释器并没有立竿见影的明显好处。它会比其他几十个 Scheme 实现更快、更容易、更灵活、更好吗?
  • LLVM 项目使用另一种语言 (C) 来演示他们的技术,并且还没有看到需要实现很多其他语言。

我认为构建基于 LLVM 的 Scheme 编译器可能会很有趣。SICP 和 PAIP 中的 Scheme 编译器都是很好的例子。

于 2011-02-04T17:50:57.650 回答
8

要记住的一件事是,这些实现中的许多都具有 C FFI 和本机代码编译器,它们明显早于 LLVM。

于 2010-01-28T00:55:56.700 回答
8

也许我完全误解了这个问题或上下文,但我相信你可以使用ECL,这是一个编译成 C 的 Common Lisp,并使用Clang编译器来定位 LLVM(而不是 GCC)。

我不确定这会给你带来什么(如果有的话)好处,但它会给你一个在 LLVM =] 上运行的 Lisp。

于 2012-08-20T03:51:27.517 回答
5

CL-LLVM为 LLVM提供 Common Lisp 绑定。它采用 FFI 方法,而不是尝试直接输出 LLVM 程序集或位码。

该库可通过 Quicklisp 获得。

于 2013-07-25T19:40:47.123 回答
4

mocl是 Common Lisp 的相对静态子集的编译器。它通过 LLVM/Clang 编译。

于 2013-11-06T12:27:03.857 回答
3

LLVM 上没有(据我所知)一个流行的方案/lisp

目前,llvm-gcc它是最接近LLVM上任何语言的流行实现的东西。特别是,目前还没有成熟的基于 LLVM 的带有垃圾收集的语言实现。我确信 LLVM 将被用作许多令人兴奋的下一代语言实现的基础,但这将花费大量时间和精力,而且在这种情况下 LLVM 还处于早期阶段。

我自己的HLVM项目是仅有的基于 LLVM 的垃圾收集实现之一,它的 GC 支持多核但绑定松散:我将影子堆栈用于“不合作的环境”,而不是破解 LLVM 中的 C++ 代码以集成真实堆栈步行。

于 2010-04-26T19:28:28.067 回答
1

有一个Scheme2LLVM,显然基于 SICP:

该代码与 SICP(计算机程序的结构和解释)一书第五章中的代码非常相似,不同之处在于它实现了 SICP 假定显式控制评估器(虚拟机)已经具有的额外功能。编译器的许多功能都在方案的子集 llvm-defines 中实现,这些方案被编译为 llvm 函数。

不知道算不算“好”。

于 2020-12-21T18:17:39.427 回答
0

GHC 正在试验一个方案后端,并通过他们的本机代码编译器获得了非常令人兴奋的初步结果。当然,这就是haskell。但他们最近对 LLVM 进行了新的更改,使尾调用更容易 IIRC。这可能对某些方案实施有好处。

于 2010-03-17T01:54:04.573 回答