跳至內容

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頁面存檔備份,存於網際網路檔案館

外部連結

[編輯]