Chicken (Scheme實現)
語言家族 | Lisp/Scheme |
---|---|
實作者 | Chicken團隊 |
釋出時間 | 2000年7月20日[1] |
目前版本 |
|
實作語言 | Scheme和C |
作業系統 | 跨平台 |
許可證 | 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寫的程式可以編譯到常見的平台,如Linux、Mac OS X和其他類Unix系統以及Windows和Haiku[5]。它還內建程式和擴充的交叉編譯功能[6],使它能夠在嵌入式系統上使用。
設計
和許多Scheme編譯器一樣,Chicken使用標準C作為中間語言。一個Scheme程式透過Chicken編譯器翻譯成C,然後一個C編譯器將C程式編譯成目標機器的機械碼,生成一個可執行程式。C的通用性使它非常適合這種用途。
Chicken的設計靈感來自電腦科學家亨利·貝克的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,並不整合到用戶作業系統的軟件套件系統中去。
另見
參考
- ^ Felix Winkelmann. Announcing the CHICKEN Scheme-to-C compiler [發佈CHICKEN Scheme到C的編譯器]. comp.lang.scheme. [2012-10-28]. (原始內容存檔於2012-11-10) (英語).
- ^ 2.0 2.1 evhan. r7rs (Chicken manual). Chicken Scheme. 2018-11-09 [2019-02-28]. (原始內容存檔於2022-12-22).
- ^ what is Scheme used for? [Scheme有啥用]. Scheme FAQ. [2012-10-28]. (原始內容存檔於2011-12-11).
- ^ 列表(頁面存檔備份,存於互聯網檔案館)
- ^ Portability [可移植性]. page on the Chicken wiki. [2012-10-28]. (原始內容存檔於2012-10-01).
- ^ Cross development [交叉開發]. Chicken manual. [2012-10-28]. (原始內容存檔於2012-11-12).
- ^ Baker, Henry CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.. [2021-12-23]. (原始內容存檔於2022-03-27).
- ^ Cheney, C.J. A Nonrecursive List Compacting Algorithm (PDF). CACM. Nov 1970, 13 (11): 677–678 [2021-12-23]. (原始內容 (PDF)存檔於2022-01-19).
- ^ Bex, Peter (sjamaan); Winkelmann, Felix. Confirmed deviations (Chicken manual). Chicken Scheme. 2016-05-28 [2019-02-28]. (原始內容存檔於2022-11-10).
- ^ Bex, Peter (sjamaan); kooda; mario; svnwiki; wasamasa; kon; mario. utf8 (Chicken manual). Chicken Scheme. 2018-08-11 [2019-02-28]. (原始內容存檔於2023-01-18).
- ^ eggs(頁面存檔備份,存於互聯網檔案館)