请在2024 Clojure状态调查!中分享您的想法。

欢迎!有关如何使用此处的更多信息,请参阅关于页面。

+2
编译器

我围绕规范、测试套件或一些可用来指导Clojure后端发展的文档进行了一些调查研究。我的多数搜索结果显示了一些其他的实现,它们大多数在做自己的事情 - 甚至ClojureScript似乎也没有验证其与Clojure 应当 符合的方式。据我所知,ClojureCLR之所以有效,主要是因为它是一个(C#中的)Java源代码一对一(大多)克隆。

有推荐(或者维护者推荐的)的方式来开发新后端吗?或者这被认为是‘未知领域’?

1 个回答

+1

选择
 
最佳回答

我认为这是一种未知(或者至少是不太被记录在案)的领域。没有书籍、文档等。有一些来自现有项目的实际经验报告(CLJS,Clojure JVM/CLR,clojerl,joker,也许还有其他)。一些其他库利用了cljs编译器以针对gambit scheme、在一个案例中是C。

基本策略似乎是针对CLJS实现,因为它基于协议设计,而不是Clojure JVM/CLR与宿主的更紧密集成,这使得它非常适合自举。这正是clojerl开发者所做的事情。这其中的好处是,现在您可以访问Clojure测试套件。由于没有官方规范,符合测试规范是最好的方式。核心文档中有一些建议关于实现特定平台读取条件(例如,为您的实现使用完全限定键,为官方实现保留未限定键)。

有完全用Clojure编写的读取器、分析器和发射器(不是cljc)。可以针对启动这些功能所需的Clojure的子集进行定位,一旦它们运行起来,再加载Clojure的其余部分(例如,cljs.core)。唯一棘手的部分是,读取器、分析器和发射器本身使用了更多高级的Clojure惯用语,这意味着您必须首先实现这些惯用语(例如,多态方法和协议以及持久结构)才能如同现在一样使用现有的工具链。可能有必要将现有工具简化为更简单的实现,这样才能在更少的架构上运行,使宿主实现更简单、更快。可能存在一个简单的clojure0,它提供了一个简单的自举层,以便在之上定义更高级的功能。我认为这些是目前开放的研究课题(社区似乎已经接受现有的实现为目前足够)。

虽然没有具体的“Clojure”引用,但有许多关于实现各种Lisp的通用Lisp引用。《Lisp In Small Pieces》、《Lisp System Implementation》、来自Norvig的PAIP的一些摘录、《Make A Lisp》、《Scheme 48》、《PicoLisp》、《FemtoLisp》以及更广泛的研究可能为这类工作提供了很好的洞见。我敢肯定还有更多优秀的参考文献(Lisp有很长的这类工作的传统...)。

...