Chez scheme是怎樣一個編譯器啊,聽說編譯後的scheme代碼速度能媲美C?有人用過么?

Chez

現在已開源 GitHub - cisco/ChezScheme: Chez Scheme,希望看到相關的 benchmark


最新 benchmarks 出爐:http://ecraven.github.io/r7rs-benchmarks/benchmark.html

Chez 沒有讓人失望。

Larceny 一直不聲不響地開發中,性能也在第一梯隊內。另外,它最新版是 0.99 了。

Racket 的表現並不差,最近官網剛改版。以後不會是一個單純的教學語言了,工業應用會越來越多。


chez不錯,測試fib性能,免費版的petite以--program方式執行是腳本中最快的,比lua還快很多;

guilemit編譯不成,沒測,這本身就是缺點,優雅的scheme,實現卻那麼糟糕;

racket編了好久,最後安裝卻報錯,幸好基本部件在,解釋fib跟phppython差不多,慢了lua一倍,所以跟chez沒法比;開jit比luajit慢更多;

chibi0.6.1實現標準是rnr7,解釋fib跟lua近似;

vicare純jit,性能跟luajit近似;

我個人喜歡chez,除了是商業的,免費沒jit,其他各方面都好,是最配scheme的實現;

chibi也不錯,開源,小巧;

vicare也是好東西,chez、ikrus親戚。


謝謝邀請。

我的回答是:迄今為止,沒有顯然可見的公開證據表明,Chez 和同期的其他編譯器相比存在壓倒性的優勢。我希望能看到一份更精確的 benchmark 數據再做結論。

幾年前我確實用過 Petite Chez Scheme,主要是因為要讀一些編譯器方面的書,正好用它作為開發語言。用了一段時間之後轉向guile,就不再用了。正如前面指出的,我用的並不是商業版本,只有解釋器。至於編譯器,那是商業版本獨有的功能。那時我沒有付費的渠道,只得作罷。

但是很奇怪,我一直沒有查到第三方的關於 Chez Scheme 和 C 語言對比的 benchmark。所以說實話,我不明白提問者題目里說的所謂「編譯後的scheme代碼速度能媲美C」,究竟是如何而來。而就我個人而言,這些讚譽的方式實在太像廣告詞,我本能地會有一定的警惕性。

我在網上找過關於 Scheme 的 benchmark,並不算多,其中確認是 Chez Scheme 參與,且比較詳細的只有這個:Twobit: benchmarks,其中這個頁面給出了針對 R6RS 的 benchmark 的對比結果:http://www.ccs.neu.edu/home/will/Twobit/benchmarks2006.html。這個 benchmark 在一台 SunBlade 1500 工作站進行測試(Linux 結果中的對比是 Petite,不算在內)。當我試圖解讀這兩個結果時,我發現在 SunBlade 工作站上,Chez 在 fft (密集浮點運算)和 cat(文件讀寫)優勢極明顯,但仍然有一些數據,比如 puzzle(數組遍歷),prime(列表遍歷選擇素數) 以及 fib(迭代加法),它的排名並不算高。綜合來看,我粗略地認為,Chez 的優化可能更多地集中在和底層操作系統部分的介面上,而數據結構方面的優化則似乎是短板。不過,這個 benchmark 是 2007 年的,恐怕不能反映 Chez 近年來的變化。

所以我嘗試著去找了一些其他的 Scheme 解釋器的比較。

2010: Benchmarks normalized to fastest

Some Scheme Benchmarks

Twobit: benchmarks ("R6RS" mode)

The Larceny Project -- Genuine R6RS Benchmarks

我得說,我能找到的網上的 benchmark,即使是針對 Petite 的,也並不多。而從看到的結果,老實說,Petite 的表現很一般。當然,也許實驗者並沒有正確使用 Chez 的編譯選項提高執行效率,也未可知,但這就不是我能知道的事了。


ikrus有一個後繼叫vicare


這兩個算fib的速度跟c差不多,比racket之流快多了

找到當初做的測試結果了:

chaoseternal/performance


這裡有個小 bench 類程序叫 swapview GitHub - lilydjwg/swapview: Print swap usage per process. Implemented in various programming languages ,測試場景是「日常用的一次性執行的命令行程序」,本身也是個有用的程序,可以用來看 Linux 上的 swap 佔用。現在這個 benchmark 有 59 個不同的語言/實現,我這兩天給這個 port 了個 ChezScheme 的實現(參考已有的 Guile 實現和 Chicken 實現),然後稍微跑了一下我感興趣的幾個實現(沒有全跑因爲我機器上沒有裝那麼多編譯器和運行時環境)。不多說了先上結果:

首先解釋一下怎麼看這個結果,Diff 那一列是程序的輸出和參考實現(C)的輸出的差異程度,如果差異比較大(低於90%)會被認爲沒有正確實現功能從而標註爲黃色,標註爲黃色的實現中有一部分 Diff 特別低,這是因爲我沒裝/配置相應環境所以報錯了。Cnt是程序跑的次數,這裡每個都是20次,Min/Avg/Max/Stdev是這20次跑下來的耗時的最小/平均/最大/標準差。以及還有一個 KMinAvg 是這 20 次跑下來的結果中,比較快的前 K=10 次的結果的平均,然後這些語言/實現按照 KMinAvg 排序。(具體爲什麼要考慮KMinAvg而不是直接用Avg請參考 《CSAPP》 )。

還得先聲明一下,這個 ChezScheme 的實現是我寫的,水平肯定非常差勁,沒有充分優化過,也沒有考慮過 ChezScheme 的優勢和劣勢。

然後從結果可以看到, Chez 在跑這類「一次性腳本命令」的效率上,跟在 Python3 和 Chicken 後面,在 Ruby 前面,相比於工業級別的JIT腳本語言(NodeJS, PyPy)還有一定差距,相比於最前列的編譯型系統級語言(C/C++/Rust)則差距就更大了。

不過另一方面,同樣是 Scheme 的實現,Racket 和 Guile 就……大家可以在自己的電腦上跑跑這個 swapview bench 對比一下自己機器上的表現。

順便幫這個swapview項目的作者百合仙子打個廣告,這個項目完全開源開放,歡迎改進其中的實現或者增加更多新的實現。

----------------20160503更新---------------

多裝了幾個語言,試著優化了一下 Chez(以及另外有別人優化了一下Ruby):


昨天剛開源,題主可以看一下。

傳送門:http://github.com/cisco/ChezScheme


Ikarus 大概是最接近 Chez Scheme 的一個編譯器了。作者是 Kent Dybvig 的學生,也是 Chez 的開發者之一。


關於chez scheme與petite chez scheme速度的對比測試:

georgeliu@georgeliu-ThinkPad-S2:~$ scheme

Chez Scheme Version 9.4.1

Copyright 1984-2016 Cisco Systems, Inc.

&> (define (fib n) (if (&< n 3) 1 (+ (fib (- x 1)) (fib (- x 2)))))

&> (time (fib 40)

)

Exception: variable x is not bound

Type (debug) to enter the debugger.

&> (define (fib x) (if (&< x 3) 1 (+ (fib (- x 1)) (fib (- x 2)))))

&> (time (fib 40))

(time (fib 40))

no collections

0.657475907s elapsed cpu time

0.657568048s elapsed real time

0 bytes allocated

102334155

&> exit

#&

&> (exit)

georgeliu@georgeliu-ThinkPad-S2:~$ petite

Petite Chez Scheme Version 9.4.1

Copyright 1984-2016 Cisco Systems, Inc.

&> (define (fib n) (if (&< n 3) 1 (+ (fib (- x 1)) (fib (- x 2)))))

&> (time (fib 40))

Exception: variable x is not bound

Type (debug) to enter the debugger.

&> (define (fib x) (if (&< x 3) 1 (+ (fib (- x 1)) (fib (- x 2)))))

&> (time (fib 40))

(time (fib 40))

no collections

4.739102730s elapsed cpu time

4.739160573s elapsed real time

0 bytes allocated

102334155

&>

另外還有python的:

georgeliu@georgeliu-ThinkPad-S2:~$ python3.5

Python 3.5.2 (default, Jul 5 2016, 12:43:10)

[GCC 5.4.0 20160609] on linux

Type "help", "copyright", "credits" or "license" for more information.

&>&>&> def fib:

File "&", line 1

def fib:

^

SyntaxError: invalid syntax

&>&>&> def fib(n):

... return 1 if n&<3 else fib(n-1)+fib(n-2)

...

&>&>&> fib(10)

55

&>&>&> import timeit

&>&>&> timeit.timeit("fib(40)","from __main__ import fib",number=1)

23.769101054999965

&>&>&>


Chez

2014年8月份更新的wiki,我想應該已經比較明顯了。

至於最新的benchmark,的確沒有搜到。

王垠的推薦是,買不起Chez的,就用racket代替一下吧。

racket具體的效率,他自家的document也是支支吾吾。


用阿克曼函數測試了下,Chez Scheme耗時大約是GCC的3.5倍。


王垠微博上有benchmark,速度和c慢一倍


chez 好像賣給 思科 了,發郵件也打聽不到現在怎麼賣了。。囧


推薦閱讀:

SICP第二章里的「圖形語言」在DrRacket 或者MIT Scheme上有沒有辦法實現啊?
想業餘時間學慣用cad二次開發,編程自動出圖,應該如何做?
Functional Programming 說的就是 Lambda Calculus 嗎?
clojure中 x x #x 他們之間的關係一直很暈 能給一些應用場景例子嗎?
Lisp 解釋器?

TAG:Lisp | Scheme | 編譯器 |