跳转到内容

Chicken (Scheme实现)

本页使用了标题或全文手工转换
维基百科,自由的百科全书
Chicken Scheme
Logo for Chicken Scheme
语言家族Lisp/Scheme
实现者Chicken团队
发行时间2000年7月20日,​24年前​(2000-07-20[1]
当前版本
  • 5.3.0(2021年11月18日)
编辑维基数据链接
实现语言SchemeC
操作系统跨平台
许可证BSD许可证
网站call-cc.org

Chicken(风格化为CHICKEN),是一个Scheme语言编译器解释器,能够将scheme代码编译成标准C代码。它基本上遵守R5RS标准并且提供了很多扩展。新近的R7RS标准是通过扩展支持的[2]。Chicken是一个采用BSD许可证自由软件

关注

[编辑]

从Chicken的标志下的口号可以看出它的关注非常明确:“一个实用的可移植Scheme系统”。

Chicken的主要关注是将Scheme应用到业界的软件中。Scheme在计算机科学课程和编程语言实验中非常有名,但在工业界却没有什么应用。[3] Chicken社区已经编写了大量的,能胜任各类任务。Chicken的维基(底层也是Chicken编写)有一个用Chicken写的软件的列表[4]

Chicken的另一个关注是可移植。通过编译成C代码,Chicken写的程序可以编译到常见的平台,如LinuxMac OS X和其他类Unix系统以及WindowsHaiku[5]。它还内置程序和扩展的交叉编译功能[6],使它能够在嵌入式系统上使用。

设计

[编辑]

和许多Scheme编译器一样,Chicken使用标准C作为中间语言。一个Scheme程序透过Chicken编译器翻译成C,然后一个C编译器将C程序编译成目标机器的机器码,生成一个可执行程序。C的通用性使它非常适合这种用途。

Chicken的设计灵感来自计算机科学家亨利·贝克英语Henry Baker (computer scientist)的1994年论文[7],这篇论文提出了一个将Scheme翻译为C的新方案,把一个Scheme程序翻译成一些C函数。这些C函数永远不会到达return语句;而是在结束时调用一个新的续体。这些续体是C函数,并作为参数传递给其他的C函数。它们是由编译器计算出来的。

这些正是续体传递风格的核心。Baker的新想法是使用C调用栈来作为Scheme的堆。如此一来,一般的C的栈操作如自动创建变量、变长数组分配等就可以用上了。当栈满时就会触发一个垃圾回收机制。垃圾回收设计采用了Cheney算法,这种方法将所有的活跃续体和其他活跃的对象都复制到堆[8]。尽管如此,C代码并不复制C栈中的帧,只复制Scheme对象,所以不需要了解C的实现。

总体而言,Scheme的堆有一个C栈作为“温床”,还有两个堆用来做分代垃圾回收。这种方式使得许多操作具备了C栈的速度,并且允许通过续体做简单的C调用。更重要的是,Baker的方案保证了渐进尾部递归,这是Scheme标准所要求的。

不足

[编辑]

Chicken Scheme在大部分上遵守了R5RS,但具有一些明显的限制和偏差[9],比如目前只能保证每个过程最多1000个参数。R7RS兼容性是通过扩展库提供的[2]

核心系统有对UTF-8字符的基本支持,但是字符串索引和操纵过程不察觉UTF-8。存在增加支持完全的UTF-8察觉的扩展库[10]

扩展

[编辑]

Chicken有一个站点提供了大量的叫做eggs[11]的附加的库和程序。这个eggs系统非常像RubyGems,并不集成到用户操作系统的软件包系统中去。

另见

[编辑]

参考

[编辑]
  1. ^ Felix Winkelmann. Announcing the CHICKEN Scheme-to-C compiler [发布CHICKEN Scheme到C的编译器]. comp.lang.scheme. [2012-10-28]. (原始内容存档于2012-11-10) (英语). 
  2. ^ 2.0 2.1 evhan. r7rs (Chicken manual). Chicken Scheme. 2018-11-09 [2019-02-28]. (原始内容存档于2022-12-22). 
  3. ^ what is Scheme used for? [Scheme有啥用]. Scheme FAQ. [2012-10-28]. (原始内容存档于2011-12-11). 
  4. ^ 列表页面存档备份,存于互联网档案馆
  5. ^ Portability [可移植性]. page on the Chicken wiki. [2012-10-28]. (原始内容存档于2012-10-01). 
  6. ^ Cross development [交叉开发]. Chicken manual. [2012-10-28]. (原始内容存档于2012-11-12). 
  7. ^ Baker, Henry CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.. [2021-12-23]. (原始内容存档于2022-03-27). 
  8. ^ Cheney, C.J. A Nonrecursive List Compacting Algorithm (PDF). CACM. Nov 1970, 13 (11): 677–678 [2021-12-23]. (原始内容 (PDF)存档于2022-01-19). 
  9. ^ Bex, Peter (sjamaan); Winkelmann, Felix. Confirmed deviations (Chicken manual). Chicken Scheme. 2016-05-28 [2019-02-28]. (原始内容存档于2022-11-10). 
  10. ^ Bex, Peter (sjamaan); kooda; mario; svnwiki; wasamasa; kon; mario. utf8 (Chicken manual). Chicken Scheme. 2018-08-11 [2019-02-28]. (原始内容存档于2023-01-18). 
  11. ^ eggs页面存档备份,存于互联网档案馆

外部链接

[编辑]