BBS水木清华站∶精华区
发信人: KONG (霍犀子), 信区: Linux
标 题: Re: [编程] 程式设计工具杂谈
发信站: BBS 水木清华站 (Thu Dec 11 05:11:49 1997)
花两个月看懂Emacs Lisp Reference Manual知道怎么编LISP程序了,
你就什么也不愁了.那个Manual写得还是很有意思的.
【 在 fuse (保险丝) 的大作中提到: 】
∶ 我想调试我的BBS系统,可我进了emacs差点连退都没退出去,
∶ 我有看那个Tutorial, 上来先教人光标移动,吓得大跳
∶ 这位大侠,教教我如何用emacs调程序吧!
∶ (或者哪里有一些好的资料?)
∶ 多谢了
Emacs是第一个人工生命
Emacs看起来像是一个其貌不扬的普通编辑器,但实际上却是个真正意义上
的IDE(Integrated Developing Environment),和Borland,Microsoft的
东西不同,Emacs对用户和程序员区别不大,也就是用户即程序员,程序员
即用户.这一点是这样实现的:Emacs有一个C编的硬核,像其它C语言编的
程序一样,这个硬核是不能轻易改变的,除非你有源码并且对系统内部有
较深刻的了解,即使有了这些条件也必须重新make,在运行Emacs时是不能
对这个硬核做任何代码上的修改的.安装过Emacs的人知道在安装过程中会
生成一个temacs可执行文件,这个temacs就是完全由C实现的硬核,它实现
的是LISP的链表解释机制和一些基本的LISP函数,比如在Emacs的
*scratch* (涂鸦) buffer里打入:
(symbol-function 'car) <Ctrl-j>
系统会告诉你
#<subr car>
就是说car是个C实现的LISP函数,属于硬核的一部分,你不能改变它的函数
定义.
其实理论上说这个硬核完全可以最小化,只包含一些最最基本的函数,大概
用汇编就能够写出来.但为portability和performance起见,这个硬核用C
实现并包含了基本上所有的常见LISP函数.打个比方,就像逻辑运算一样,
尽管用NOT和AND就能够表示所有的逻辑运算,平常我们还是NOT,AND,OR齐上.
temacs里有些LISP函数其实完全可以用一些更基本的LISP函数实现,但为了
速度,Richard Stallman还是把它们用C实现了,这样做的好处是速度快了,
坏处看完了下面你就明白了.
有了temacs,以后的事情就是在它的基础上滚雪球,不断地在temacs里eval
LISP函数,temacs知道的越来越多,功能就会越来越强.Stallman选了几个
最基本的package,如文件操作等等,作为标准的部件,在install时就喂给
temacs,再把LISP可执行内存映象dump下来,这就是平常大家用的emacs了.
同样在*scratch*里打入:
(symbol-function 'find-file) <Ctrl-j>
结果可能是
(lambda (filename) ...............)
这就是经过eval而被temacs吸收的LISP函数;
也可能是
#[(filename) ................]
这是Stallman定义的一种LISP bytecode,用来提高LISP的运行效率,这种bytecode
一般比功能等价的C代码还是要慢一些,但和LISP的文本代码是一一对应的,并且速
度大大提高,必要时可以通过decompile恢复成LISP文本代码.猜测JAVA的bytecode
借鉴了不少LISP bytecode的技术,JAVA可以说是一个表面上C++词法风格、实际上
Object-oriented的type architecture加上LISP的run-time environment.JAVA
Virtual Machine完全就是一台最新LISP Machine.
言归正传,经eval而被temacs吸收的LISP函数和那种#[subr ...] C函数就不一样了,
你可以通过eval加入一些这样的函数,也可以通过unintern去掉一些这样的函数,
还可以现改函数定义略微增加或减少一些功能,这就把一个运行程序的部件当做一
个数据库一样可以任意剪裁,根据具体情况随意增加或减少它的功能.就像生物的
新陈代谢一样,汲取营养,排泄废物,所以说Emacs是个生物,唯一的遗憾是这个生
物还是个婴儿,不会自己觅食,需要用户喂它吃那些.el文件才行.
Internet上最大的.el文件库在
ftp://archive.cis.ohio-state.edu/pub/gnu/emacs/elisp-archive/
用户也可以自编或改编一些现成的.el文件以实现自己需要的功能.
.elc是byte-compile相应.el文件产生的byte-code文件,如何编写.el文件可参看
Emacs的online info manuals (C-h i)的Emacs Lisp reference.
用户可用load和autoload调入新的.el文件.当然调的越多Emacs就越吃内存,Emacs
有garbage-collect函数负责回收内存,硬核里有根据情况触发garbage-collect的机
制.
用户用的一切功能都是temacs + 其eval过的所有LISP函数 + 与Emacs配合的外部命令
(如gdb等)实现的.其中temacs里的链表解释机制是最灵魂的部分,从有LISP的那天起
就没变过,预eval的package可由安装者指定;与Emacs配合的外部命令可以是OS里的
任何输入输出可处理的命令,当然能像gdb那样和Emacs有所约定的更好;所eval的
LISP函数是最灵活的部分,用户可以随心所欲地configure,当然喜欢玩傻瓜机的人还
是离得远一点为好.
XEmacs在user interface上下了不少工夫,但一般而言本人觉得那并不重要.
太累了,就说这么多,如果谁有出版社扒分的路子不妨可以联系一下出本中文的
tutorial(当然应该比Emacs自带的tutorial要有意思,那个tutorial简直是降自己的格,
它说俺就是个编辑器,大家看看俺灵不灵.结果往往是用户觉得,呸,怎么这么难用.
像我这样想说它两句好话的只好说是您二位都搞错了).
--
从前的我,只会为一个目标 而奋斗;
现在的我,不为任何目标 也得奋斗.
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: casio.csc.ncsu.]
BBS水木清华站∶精华区