Chicken (Scheme實現)
来自维基百科,自由的百科全书
Chicken(風格化為CHICKEN),是一個Scheme語言的編譯器和解釋器,能夠將scheme代碼編譯成標準C代碼。它基本上遵守R5RS標準並且提供了很多擴展。新近的R7RS標準是通過擴展庫支持的[3]。Chicken是一個採用BSD許可證的自由軟件。
關注
從Chicken的標誌下的口號可以看出它的關注非常明確:「一個實用的可移植Scheme系統」。
Chicken的主要關注是將Scheme應用到業界的軟件中。Scheme在計算機科學課程和編程語言實驗中非常有名,但在工業界卻沒有什麼應用。[4] Chicken社區已經編寫了大量的庫,能勝任各類任務。Chicken的維基(底層也是Chicken編寫)有一個用Chicken寫的軟件的列表[5]。
Chicken的另一個關注是可移植。通過編譯成C代碼,Chicken寫的程序可以編譯到常見的平台,如Linux、Mac OS X和其他類Unix系統以及Windows和Haiku[6]。它還內置程序和擴展的交叉編譯功能[7],使它能夠在嵌入式系統上使用。
設計
和許多Scheme編譯器一樣,Chicken使用標準C作為中間語言。一個Scheme程序透過Chicken編譯器翻譯成C,然後一個C編譯器將C程序編譯成目標機器的機器碼,生成一個可執行程序。C的通用性使它非常適合這種用途。
Chicken的設計靈感來自電腦科學家亨利·貝克的1994年論文[8],這篇論文提出了一個將Scheme翻譯為C的新方案,把一個Scheme程序翻譯成一些C函數。這些C函數永遠不會到達return
語句;而是在結束時調用一個新的續體。這些續體是C函數,並作為參數傳遞給其他的C函數。它們是由編譯器計算出來的。
這些正是續體傳遞風格的核心。Baker的新想法是使用C調用棧來作為Scheme的堆。如此一來,一般的C的棧操作如自動創建變量、變長數組分配等就可以用上了。當棧滿時就會觸發一個垃圾回收機制。垃圾回收設計採用了Cheney算法,這種方法將所有的活躍續體和其他活躍的對象都複製到堆[9]。儘管如此,C代碼並不複製C棧中的幀,只複製Scheme對象,所以不需要了解C的實現。
總體而言,Scheme的堆有一個C棧作為「溫床」,還有兩個堆用來做分代垃圾回收。這種方式使得許多操作具備了C棧的速度,並且允許通過續體做簡單的C調用。更重要的是,Baker的方案保證了漸進尾部遞歸,這是Scheme標準所要求的。
不足
Chicken Scheme在大部份上遵守了R5RS,但具有一些明顯的限制和偏差[10],比如目前只能保證每個過程最多1000個參數。R7RS兼容性是通過擴展庫提供的[3]。
核心系統有對UTF-8字符的基本支持,但是字符串索引和操縱過程不察覺UTF-8。存在增加支持完全的UTF-8察覺的擴展庫[11]。
擴展
Chicken有一個站點提供了大量的叫做eggs[12]的附加的庫和程序。這個eggs系統非常像RubyGems,並不集成到用戶操作系統的軟件包系統中去。
另見
參考
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.