因为看到谈lisp的一些书,提到70年代学术界在现代编程的主流是lisp和汇编、fortran。这个并不奇怪,因为那个时候很多现代的语言,比如c,pascal还没有发明呢。然后个人计算机的主流编程是basic和汇编。 * y: b/ o+ S5 {/ B8 C3 i2 A6 c+ j* K) Z% \9 N
为什么?一个原因就是当时的计算机内存太小了。还活到现代的古代编程语言里面,fortran是靠不断更新语法特征才留下来的。早期的fortran除了有算术表达式解析,和机器码无关两个特征,其实和一个比较完善的有宏的汇编语言的复杂程度查不了多少。/ C. x$ F. W* [
3 u( O' [$ k9 m, n现在很多人都觉得写汇编好厉害……其实不用现代语言的一些特征,写汇编并不难,熟悉c的写个三天就能学会写汇编,汇编难的是记住一大堆调用的固定用法,这些并没有什么难度,就是明明是计算机擅长的东西让人类来每天写同样的东西很反人类罢了。其他一些if之类的结构,用个宏就能模拟的差不多了。估计写lisp或者java的人看用c的那些人在非系统软件里面康慈康慈写内存分配也是这个感觉吧。 T" k! I) V. n; A* A
4 p' P1 |' K( R) E
早期的basic也是这个原因,比尔盖兹写的那个basic,包括现在属于bios和操作系统的io等全部库,全部程序大小只有20k不到。现代语言就算最精简的lua,不算操作系统,也有300多k。而在早期计算机里面,300k内存哪怕是一次性rom也比计算机本身贵多了。$ r/ y# b/ H1 T5 M( O& K, Q3 d
* o# q$ w; E' z8 K6 ]! I! c
lisp的优势是它是基于数学的,所以核心部分非常小,1k内存就能完成全部解释器,剩下的功能都可以用lisp本身代码来实现,所以也是那个时候高级语言唯一的选择。lisp里面大量用到表,而这个表是用链表实现的,这也是节省内存的一个巧妙设计。因为链表在取它的后半部分,或者在头部添加内容的时候(在尾部进行改变则不行),可以共享后部的相同部分,这样就可以在进行数据操作的时候节省大量拷贝内存、分配新内存的工作。这也是lisp最早发明内存垃圾收集器的原因。- N4 y p# R M7 K( i' d' K