Chez Scheme 编译指南
Chez Scheme 编译指南
https://phikn1ght.github.io/chez_scheme_compiling_guide/
关于 Chez Scheme
Chez Scheme 是由 R. Kent Dybvig 编写的 Scheme 的具体实现,包含了编译器、解释器与一些常用的库。它完整地实现了 R6RS (Scheme 语言修订报告第六版) 所描述的所有特性,而且提供了强大的外部函数调用功能,并能够编译出执行效率非常高的 Scheme 程序。
营销大师王垠曾在其文章《Chez Scheme 的传说》中称其“比最高级的 C 编译器还要简单很多,却生成几乎达到理论极限的机器代码”,并且对其设计理念大加赞赏。对编程语言有兴趣的话可以去试着读读这篇文章。当然他在扯淡。
Chez Scheme 的编译组件原本被作为商业软件出售,但前些日子作者似乎心情大好于是将其在 Github 上开源了,所以现在我们能够一睹其源码的芳容。
关于本文
Chez Scheme 作者在其“构建说明” (即 BUILDING 文件) 中将 Windows 下的编译过程描述为 “more complicated than it should be” (本不应该那么麻烦),从作者的描述中可以隐约看出他大概为了优先兼容 Linux 和 OS X 下的编译过程做出了无奈的妥协。笔者刚开始研究编译其源码时,并不使用 Visual Studio ,在没有现成教程的情况下,自己不断尝试了两周后才摸出了正确的编译配置。为此笔者想写一篇简单的教程,帮助想要体验 Scheme 之美而又不想把时间浪费在研究 Visual Studio 与 Git 以及编译环境配置等等这些无关问题上的读者,使他们能够跳过这些无关内容,直接根据笔者提供的经验与方法对 Chez Scheme 进行编译,快速进入学习的核心环节。由于笔者本身对 Visual Studio 与 Git 没有很深的研究,行文过程中的错误在所难免,希望各位读者发现后不吝赐教,笔者在此先行致谢。
那么回到正文。这篇文章将指导你自己动手编译也许是世界上最好的 Scheme 实现,但不会包含 Scheme 语法相关的任何内容。如果想对 Scheme 进行深入研究,笔者建议去阅读 [Scheme 程序设计语言 (The Scheme Programming Language)](http:// http://www.scheme.com/tspl4/) (Chez Scheme 作者所著,完美贴合 Chez Scheme 的实现),而对于 Chez Scheme 的使用以及一些细节, 则可参阅 Chez Scheme 9 使用指南 (Chez Scheme Version 9 User’s Guide)。
安装 Visual Studio
在Windows 环境下编译 Chez Scheme 需要 Visual C 编译器的支持,为此我们需要安装一份 Visual Studio。
进入后按下图下载Commmunity(即社区版,亦称个人版或免费版)
注意,你至少需要10GB可用空间。
出现如下图所示页面表示已经成功开始下载,随后你会得到一个200+KB的“高速下载器”。它待会儿会把整个 Visual Studio 一股脑的塞进你的硬盘里。
打开你下载到的文件,等它加载出窗体。
且慢,先别急着一路 Next 下去。我们只要使用 Visual C 编译器,其他功能我们全部不需要。记得在这儿选择 Custom (自定义安装内容)
把这几个都勾上
然后一路 Next 下去。好了,现在你可以选本小说,或是睡上那么一觉。等你回来时 Visual Studio 差不多就能安装好。(实际上需要约 2 - 3 个小时)。
当出现这个画面时,说明我们已经成功地装上了自称是世界上最好的IDE(集成开发环境)。你可以选择点 LAUNCH 来看看它的样子,或者直接关闭安装程序。本篇教程不会用到它的编辑器。
接下来要做的是安装一个带 Bash 的 Git 。
安装 Git
如果因为某些特殊原因无法直接从官网下载,可以考虑去一些国内比较大的软件收录网站看看。
这是笔者找到的分流点:
打开你下载的安装包,一路 Next,遇到选择安装组件的时候记得这样勾:
其它的选项全部不用改动,使用默认的就行。
安装成功后,在任意文件夹内右键,会发现多出了这两项。
选择一个最好不要带中文与特殊字符的目录的文件夹,然后在里面右键点开 Git Bash。这个文件夹内随后会生成一个子文件夹 chezscheme ,而这个被生成的文件夹就是我们之后要用到的工作目录。笔者在演示中的工作目录为C:/Github/chezscheme
获取源代码
往你的 Bash 里敲入以下代码然后按下 Enter 键
git clone https://github.com/cisco/chezscheme
当出现如下图像时,代表你成功从服务器获取了一份 Chez Scheme 的源代码。
让我们开始为编译环节做准备。
设置环境变量
环境变量设置环节部分在 BUILDING 文件里并没有详细提到,笔者之前自行编译时主要在这一步上浪费了不少时间。
此电脑-右键-属性
点击左侧的“高级系统设置”
在弹出的窗口中切换到“高级”选择夹,然后点击“环境变量”
在用户变量框里点击新建,然后分别加入如下环境变量:
path
C:/Program Files/Microsoft Visual Studio 14.0/VC/bin;C:/Program Files/Windows Kits/8.1/bin/x86
lib
C:/Program Files/Microsoft Visual Studio 14.0/VC/lib;C:/Program Files/Windows Kits/10/Lib/10.0.10240.0/ucrt/x86;C:/Program Files/Windows Kits/8.1/Lib/winv6.3/um/x86
include
C:/Program Files/Microsoft Visual Studio 14.0/VC/include;C:/Program Files/Microsoft SDKs/Windows/v7.1A/Include;C:/Program Files/Windows Kits/10/Include/10.0.10240.0/ucrt
然后点击确定回到属性面板,把它关闭,接下来我们回到 Git Bash 上。
配置编译目标
如果你还没有关闭 Bash,那么只要输入
cd chezscheme
就可以使它进入工作目录。但如果你已经关闭了,没关系,打开工作目录,右键再开一个就行。
随后使用指令
./configure -m=i3nt
你的 Bash 看起来应该像这样:
随后按下 Enter,等待其处理完成。直到再次出现输入指令等待。过程中可能出现很多字,也可能没有任何提示。这取决于你之前是否已经执行过类似指令。
好了,到这里你离编译只差一步之遥。在开始编译前,我们还要复制一次源码。
具体操作是将整个工作目录内的 c 文件夹复制到新生成的 i3nt 里。在笔者的演示里相当于用C:/Github/chezscheme/c
覆盖文件夹C:/Github/chezscheme/i3nt/c
。
复制后,你的 工作目录/i3nt/c
看上去应该像这样。
开始编译
做了如此多的准备工作之后,我们终于可以开始编译了。关闭 Bash,进入工作目录/i3nt/c
,按住Shift+右键,在弹出的栏目中选择“在此处打开命令窗口”
然后在弹出的窗口中输入
nmake -f Makefile.i3nt
等待数分钟后,你会发现编译似乎遇到了错误。
但打开 工作目录/i3nt/bin/i3nt
目录,你会发现其实程序已经编译成功了。但程序并不能打开,双击只会看到黑色的窗口一闪而过。要使它能够运行,我们还要再做些工作。现在可以关闭你的编译窗口了。
运行与测试
要使 Chez Scheme 能够运行,我们还需要再设置一个环境变量,但笔者认为这样太过繁琐,而且一旦工作目录改变还得重新设置,所以笔者换了一种方法,即使用一个引导程序来为 Chez Scheme 设置临时环境变量。
具体做法是在 工作目录/i3nt/bin/i3nt
内新建一个文本文档,打开它,输入以下代码:
1
|
@echo off
|
然后将文件名保存为launch.bat
。
是时候收获成功的喜悦了。打开你创建的引导程序。你将会见到也许是世界上最先进的编程语言的交互环境。
试着向里面输入一行表达式并执行:
(+ 2 3)
嘿,这真酷!你终于可以自豪地告诉朋友们,你已经成功的编译出了世界上最先进的编程语言的解释器,并用它运行了一行代码!
尽管这确实令人兴奋不已,但你也要知道,这仅仅是一个起点。如果你要深入体验 Scheme 之美,感受数十年来编程语言领域的发展所诞生的众多精巧的设计,你还需要花费大量时间来阅读上文列出的参考书目以及其他关于函数式编程的相关文献。正如 Matthias Felleisen 在其著作《Scheme 简明教程》中所言一般:
最终在某个下午,你会完全理解Scheme和它的标准,但在那之前没有人会知道需要度过多少个让人觉得满头雾水的下午。
rationale
Chez Scheme is fast, mature, incremental, optimizing native code compiler that produces very fast code very quickly. There is also its slower companion, Petite Scheme, a bytecode compiler within the same system, available for those who need extreme portability. Prior to 2016 it was only available for a commercial license fee, but it is now open source.
Chez's optimizing compiler works both incrementally (but still does some cross package optimization), as well as providing calls for whole-program compilation and optimization.
Chez is used in Robotic drug testing, Chip layout and design, multithreaded web services, and enterprise systems. Some users include Sandia National Labs, Motorola, Freescale, Beckman Coulter, Disney, University of Indiana (where Dybvig is a professor of Computer Science, specializing in programming languages and compiler design). It has been in development since 1985 (started on a VAX running BSD Unix), and saw nine major commercial releases prior to going open source (currently it is at version 9.5.8, released 2022 Apr 25; it is still being updated today; github history is here). Reviewing Dybvig's history paper (below) shows numerous surprising insights into producing code incrementally and online. Open source Chez development is ongoing and active today, and the last merged pull request at the time of this writing was 10 hours ago.
Chez has a generational garbage collector that automatically collects code and data that is no longer in use. Chez includes a debugger, and a full numeric tower.
Other Schemes, like Racket, have moved to Chez underneath, now that it is freely available.
background
architecture talk slides
http://icfp06.cs.uchicago.edu/dybvig-talk.pdf
history of Chez Scheme
https://www.cs.indiana.edu/~dyb/pubs/hocs.pdf
benchmarks
versus other schemes: https://ecraven.github.io/r7rs-benchmarks/
FFI documentation
https://www.scheme.com/csug8/binding.html
documentation
homepage of Chez Scheme
user's guide
R. Kent Dybvig's classic book, The Scheme Programming Language, 4th edition.
The open source github repo. Chez is Apache2 licensed.
https://github.com/cisco/ChezScheme
============== End