松本行弘(Ruby发明者):Emacs怎样改变了我的人生
2012-03-27 21:29
351 查看
原文(英文版本)见这里.
以下是我的翻译兼一些技术方面的背景资料:
Emacs教我如何读代码
Emacs让我认识到Lisp的威力
Emacs教我如何实现语言核心
Emacs教我如何进行内存自动回收(Garbage Collector)
Emacs有助于我写代码和调试
我用Emacs写文档邮件
Emacs让我成为高效程序员
Emacs让我成为黑客
Emacs永远改变了我的人生
以下是我的翻译兼一些技术方面的背景资料:
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 3 enum 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工作站时我开始使用Emacs
14 我完全被迷住了,Emacs成为我的一部分
15 而且Emacs任何我不喜欢的部分我都可以改,Emacs完全可配置.
16 Emacs使我明白了任何东西都可以被程序员改变
17 完全的自由
18 编辑时可以无视键位设置
19 我想用Emacs做所有的事,编程,文档,邮件…
20 所以我写了"cmail",我的第一个严肃的Lisp程序,我每天用它
21 1993年,我开始搞我的Ruby
22 Ruby的设计受到Emacs实现的影响,例如整数和tagged pointer合用,相似的GC,和Lisp类似的Object Model
tagged pointer的细节请参考上文的C代码,高地址的3bit用作判别数据类型,低地址的29bit用作指针或者整数(取决于数据类型)23 接下来我把Smalltalk的OO系统加上去
24 语法我用Algol/Ada/Eiffel
25 但是我是Emacs狂,所以在Emacs中支持auto-indent是必须的
26 在1993年,类似的语法要支持auto-indent很难
27 所以我就写了自己的ruby-mode.el,试图用elisp和正则表达式(regex)解决这个问题.
28 一个礼拜后,我在给Ruby加上end关键字后终于成功了
29 如果我不能让我的emacs下的ruby-mode成功,那么Ruby的语法会更像C
30 这样就和其他脚本语言差不多,Ruby也不会那么受欢迎
31 小结
Emacs教我什么是软件自由(freedom for software)Emacs教我如何读代码
Emacs让我认识到Lisp的威力
Emacs教我如何实现语言核心
Emacs教我如何进行内存自动回收(Garbage Collector)
Emacs有助于我写代码和调试
我用Emacs写文档邮件
Emacs让我成为高效程序员
Emacs让我成为黑客
Emacs永远改变了我的人生
相关文章推荐
- [翻译] Emacs改变了我的人生 (发生在Emacs和Ruby之间的故事)
- 一个密码怎样改变了我的人生
- Ruby之父松本行弘:编程是可以干一辈子的[问题点数:50分]
- 怎样高速正确的安装 Ruby, Rails 执行环境
- 需要为你的SaaS改变走向市场策略吗?本文介绍了ISV怎样使用Windows Azure实现它
- 怎样用js改变中的值
- UIViewController view的加载情况,以及frame怎样改变问题
- js改变Lable的innerText后,怎样在后台代码中获得Lable的值
- unity3d关于怎样动态改变物体 shader
- mutable怎样改变private成员
- VC中怎样改变TAB背景色和背景图片
- Photoshop实用技巧:怎样改变一寸照片的背景颜色
- RUBY之父松本行弘:我的编程人生
- 保险极客发布新品,保险科技正在怎样改变保险业?
- 一个密码改变了我的人生
- [Ruby]怎样用RUBY编写桌面应用程序
- 将Emacs作为Ruby On Rails集成开发环境
- 控制台程序怎样改变颜色
- 怎样在Android中监听声音改变事件