Emacs 的配置文件為什麼會用 Lisp 語言來寫?
最近用 Emacs 發現配置文件是 Lisp 語言的規範。
在GNU的官網上有一篇「Richard Stallman」寫的文章《My Lisp Experiences and the Development of GNU Emacs
- GNU Project》,應該回答你的疑問。
在Emacs真正誕生前,他們用的編輯器叫「TECO」,他們用PDP-10的彙編語言為這個編輯器開發了一個解釋器,解析諸如「5l」(移動5行)、「i」(插入)(怎麼嗅到了濃濃的VI味道)等基本的編輯指令。這些指令並不是一套完備的編程語言,想用它自定義一些高級的編輯操作非常困難,因此他們對這個解釋器做了擴充,加入諸如循環、子程序等功能。但功能依舊薄弱,例如子程序名只能是單字元的,因此寫不了大的程序。他們覺得需要一門正兒八經的編程語言來代替這個語法丑到哭的語言。
於是,一位名叫「Bernie Greenberg」的大神在Multics機器上用 MacLisp 完全重寫了 Emacs 編輯器(從頭到腳都是滿滿的 MacLisp)。這個版本的 Emacs 獲得了巨大的成功——連他辦公室的秘書都開始學習如何使用 Emacs:他們寫了一份教程指導大家如何去增強 Emacs,但並沒有說這個過程叫「編程」,於是像秘書這樣自認為完全不會編程的人就不會被嚇跑,他們只需閱讀手冊,就能做點有用的事情!
做了件這麼成功的事情,Bernie肯定要出來說點什麼,於是他說了:
an application — a program that does something useful for you — which has Lisp inside it and which you could extend by rewriting the Lisp programs, is actually a very good way for people to learn programming. It gives them a chance to write small programs that are useful for them, which in most arenas you can"t possibly do. They can get encouragement for their own practical use — at the stage where it"s the hardest — where they don"t believe they can program, until they get to the point where they are programmers.
大意是:一個應用——一個能幫你做點有用事情的程序——內嵌了Lisp,並且能通過Lisp程序擴充它的功能,對於學習編程而言,這種方式非常不錯!那些自認為不會編程的人,這種方式會給他們編寫小但有用的程序的機會,讓他們在實踐中不斷成長,直到他們發現自己就是在編程。
Stallman他們覺得這個想法簡直屌炸天!就沿著這個思路重寫 Emacs,但並不是所有平台都有成熟的 Lisp 實現,如果基於現成的 Lisp,那跨平台就變成吹牛了,同時底層的編輯性能也會嚴重依賴這個 Lisp 實現。於是他們決定用C語言開發一個跨平台的 Lisp 解釋器——Emacs Lisp。這樣既能在所有平台上用統一的Lisp方言來寫 Emacs 擴展,又能兼顧性能,多NB的一件事!
還有其他好玩的故事,可以閱讀原文。寫Emacs那會兒Lisp是最靠譜的用來寫插件的腳本語言
因為 TECO 是一門很黃很暴力的語言,就是 TECO 編輯器用的擴展語言,熟練的 TECO 用戶不需要高亮補全就能手寫,(實際上也沒啥高亮規則能用,也沒啥語法可言),就和現在的熟練 Vim 用戶把按鍵順序記下來一些容易,但是要理解寫出來的東西是幹什麼用的就很蛋疼了。
比如打一句Hello world。
IHele$-cDilo W$-2c2d world$$
(絕對不是瞎編的,我現在的主力編輯器就是 TECO,其實這個東西在寫對縮進沒什麼要求的東西的時候那個行雲流水,比 vi 棒多了,而且能用來編輯很大的文件,保守估計2GB是沒問題的。)
然而 Lisp 就很好懂了,而且能很容易搞一些實現起來比較複雜的東西出來,語法也很簡單。因為最早的 Emacs 版本及其前身 TECO 都是在 ITS 系統上寫出來的,而 ITS 上面 Lisp 是最主流的語言,就像 Unix 上面 C 語言是主流一樣。
所以 Emacs 用 lisp 的方言作為配置和開發的語言是個歷史的自然而然。
emacs是在MIT做出來的,mit那幫人都用lisp.
因為Emacs就是基於Lisp的
推薦閱讀:
※Chez scheme是怎樣一個編譯器啊,聽說編譯後的scheme代碼速度能媲美C?有人用過么?
※SICP第二章里的「圖形語言」在DrRacket 或者MIT Scheme上有沒有辦法實現啊?
※想業餘時間學慣用cad二次開發,編程自動出圖,應該如何做?
※Functional Programming 說的就是 Lambda Calculus 嗎?
※clojure中 x x #x 他們之間的關係一直很暈 能給一些應用場景例子嗎?