原文(英文版本)見這裡.
以下是我的翻譯兼一些技術方面的背景資料:
1 1980年,我開始編程.2 Basic,400 steps (此句不知如何翻譯)3 1988年,我遇到了Emacs,在學校的Sun-3上,和200多個學生共用.4 Emacs實際上是被禁止使用的,因為消耗太多記憶體.所以我只是嘗試了一下了.5 我可以自由下載Emacs並閱讀其原始碼.6 Emacs是我的第一個Lisp解譯器.7 從Emacs我學到了很多關於語言實現的知識.8 例如,emacs的整數實現(Embedding integer in pointers)
參考Lisp_Object定義,在Emacs原始碼的lisp.h中,Lisp_Object是一個既可以作為指標使用又可以作為整數使用的類型具體代碼見下,注意Lisp_Int為0,使得非負整數可以直接轉換為對應的List_Object類型:
#define VALBITS 29#define GCTYPEBITS 3enum Lisp_Type { Lisp_Int = 0, /* Symbol. XSYMBOL (object) points to a struct Lisp_Symbol. */ Lisp_Symbol = 2, /* Miscellaneous. XMISC (object) points to a union Lisp_Misc, whose first member indicates the subtype. */ Lisp_Misc = 3, /* String. XSTRING (object) points to a struct Lisp_String. The length of the string, and its contents, are stored therein. */ Lisp_String = LISP_STRING_TAG, /* Vector of Lisp objects, or something resembling it. XVECTOR (object) points to a struct Lisp_Vector, which contains the size and contents. The size field also contains the type information, if it's not a real vector object. */ Lisp_Vectorlike = 5, /* Cons. XCONS (object) points to a struct Lisp_Cons. */ Lisp_Cons = 6, Lisp_Float = 7, };typedef union Lisp_Object { /* Used for comparing two Lisp_Objects; also, positive integers can be accessed fast this way. */ EMACS_UINT i; struct { EMACS_INT val : VALBITS; enum Lisp_Type type : GCTYPEBITS; } s; struct { EMACS_UINT val : VALBITS; enum Lisp_Type type : GCTYPEBITS; } u; }Lisp_OLisp_Stringbject;
9 又例如Emacs的記憶體自動回收機制(Mark and sweep garbage collection)
具體細節參考這裡的討論.
10 C和Lisp的Calling conventions(不好翻,基本上就是函數如何調用,函數參數的記憶體模型之類…)11 我完全理解Lisp怎麼工作的12 我被Lisp Objects迷住了13 當我得到Sparc工作站時我開始使用Emacs14 我完全被迷住了,Emacs成為我的一部分15 而且Emacs任何我不喜歡的部分我都可以改,Emacs完全可配置.16 Emacs使我明白了任何東西都可以被程式員改變17 完全的自由18 編輯時可以無視鍵位設定19 我想用Emacs做所有的事,編程,文檔,郵件…20 所以我寫了"cmail",我的第一個嚴肅的Lisp程式,我每天用它21 1993年,我開始搞我的Ruby22 Ruby的設計受到Emacs實現的影響,例如整數和tagged pointer合用,相似的GC,和Lisp類似的Object Model
tagged pointer的細節請參考上文的C代碼,高地址的3bit用作判別資料類型,低地址的29bit用作指標或者整數(取決於資料類型)
23 接下來我把Smalltalk的OO系統加上去24 文法我用Algol/Ada/Eiffel25 但是我是Emacs狂,所以在Emacs中支援auto-indent是必須的26 在1993年,類似的文法要支援auto-indent很難27 所以我就寫了自己的ruby-mode.el,試圖用elisp和Regex(regex)解決這個問題.28 一個禮拜後,我在給Ruby加上end關鍵字後終於成功了29 如果我不能讓我的emacs下的ruby-mode成功,那麼Ruby的文法會更像C30 這樣就和其他指令碼語言差不多,Ruby也不會那麼受歡迎31 小結
- Emacs教我什麼是軟體自由(freedom for software)
- Emacs教我如何讀代碼
- Emacs讓我認識到Lisp的威力
- Emacs教我如何?語言核心
- Emacs教我如何進行記憶體自動回收(Garbage Collector)
- Emacs有助於我寫代碼和調試
- 我用Emacs寫文檔郵件
- Emacs讓我成為高效程式員
- Emacs讓我成為駭客
- Emacs永遠改變了我的人生