筆記與流年

沒有太多的話,這只是一個普通的Blog,想用它來記錄我的閱讀和學習筆記。

Haskell史傳:帶類的惰性語言(九)

By Mountain • Jun 25th, 2007 • Category: 技術話題

上周周末加班,所以僅翻譯了一節。這周繼續努力!

3. 目標、原則和過程

本節我們反思我們思考的原則,我們所作的大的選擇,以及導致它們的過程。

3.1 Haskell是惰性的

惰性無疑是把貢獻於Haskell設計的不同小組團結在一起的唯一主題。技術上講,Haskell是一種有著非嚴格語義(non-strict semantics)的語言;惰性僅僅是非嚴格語言的實現技術之一。不過“惰性”這一術語比“非嚴格”更有穿透力(pungent)和召喚力(evocative),所以我們遵循更流行的用法把Haskell描述為惰性的。當專門指稱實現技巧時,我們使用“按需調用”(call-by-need),以對比於象Lisp和ML中的傳值調用(call-by-value)。

到八十年代中期,人們在實踐惰性函數式編程方面已經有了一個時代的經驗,并且它的魅力也獲得了更好的理解。Hughes的論文《為什么函數式語言重要》(Why functional programming matters)便捕獲了這一主題,該文為惰性編程作了一篇有影響的宣言,并且也恰巧在Haskell設計的早期階段。(首先在其1984年申請入職Oxford的評審會演講上,Hughes發表了它,在1989年正式發表(Hughes, 1989)之前,該文私下流傳了一段時間。)

惰性有它的代價。按需調用比傳值調用更低效,因為為了延遲求值需要額外的記錄(bookkeeping),直到一個項(term)被需要時為止;因此有些項可能不會被求值,也不會用其值重寫一個項;因此也沒有項會被求值兩次。這個代價是巨大的,但卻只差常數比例,這一點在Haskell設計之時就已經被理解了。

一個更加重要的問題是:即使對于非常有經驗的程序員,我們依然很難預測惰性程序的空間行為,并且遠比棧的常數倍為多。如我們在10.2節討論的,普遍存在的空間泄漏(space leaks)導致我們為Haskell增加了一些嚴格的特性,如seq和嚴格數據類型(strict data types)(如更早的SASL和Miranda所作的一樣)。相對稱的,嚴格語言也已經涉足惰性了(Wadler et al., 1988)。結果,嚴格/惰性的二分不再是全或無的抉擇,每一種類語言的實踐者都意識到了對方的價值。

Mountain is
Email this author | All posts by Mountain

Leave a Reply