Lisp真是一门好语言

lisp真是一门终极的编程语言。我接触lisp也不过一个月时间?现在发自肺腑的这么觉得。为什么?因为lisp又高级又基础,lisp没有python或者ruby里那些便利的数组或者hash操作函数,很多时候,lisp的数据只由2个部分组成:

(AAA . BBB)

第一个元素AAA称为car部分,剩下的另外一半。不管有多少,称为cdr部分。也就是对称的第二个元素。这叫con cell元素。很多复杂的数据结构,比如数组,hash表,红黑树,二叉树都是由它实现的。你说它不基础?但是lisp又很高级,c语言的一个特性是,机器效率虽高,但是人工效率很低。而lisp不同,《黑客与画家》中指出,lisp只需要c语言十分之一的代码就能实现同等的功能。而lisp甚至能直接操作cpu的寄存器,这是哪种高级虚拟机语言能实现的?

lisp很简洁,用一句话就能概括lisp的语法:

例如(A B C)

用圆括号括起来称为一个列表,列表中第一个原子被视为函数,其他原子被视为变量。而由单括号‘前导的元素什么也不视为(不求值),只按原样返回。

完了,就这么简单。剩下的都是细节。要知道真理都是很简洁的,比如e=mc2,真理总结出来都这么简单。所以lisp很强。

用多数人可以理解的话说,lisp没有”保留字“。我们知道每种语言包括c但是有保留字的。这意味着2点:

1.他们的处理语句和数据是分开的,不一样的。
2.他们都是被限制了的

但是lisp没有保留字,为什么呢?你看多数语言像c++,Java根本就没有所谓符号(symbol),ruby有符号,但是应用很少。lisp不同,lisp大多数原子都是符号。比如(print atom-1 atom-2),每一个符号可以连接着一个函数定义,或者一个变量定义,这个例子就是对atom-1,atom-2 两个符号进行求值,找出他们的变量定义然后交给print这个函数去运算。你可以把它调过来。(atom-1 print atom-2) ,这个例子就是对print,atom-2 两个符号进行求值,找出他们的变量定义然后交给atom-1连接的函数去运算,区别可能是print可能是一个系统预先定义好的函数,而atom-1可能是用户自定义函数。所以说lisp是没有保留字,也不需要保留字的。

所以我们就可以看到了,lisp一个有名的特点,数据和语句是一样的,是怎么实现的了。非常简单,同样的东西,你把它放在列表第一个,就是函数,否则就是变量,如果加上单引号不求值,那就是数据。如此,lisp也可以实现非常强大的宏系统,这也是独一无二的,其他语言都不能,因为他们都不可以把数据和语句区别开来。简单的说,宏就是接受一个参数,然后返回对应的代码,插入到调用宏的位置

( defmacros (args)
`(defun aaaaa(,args)
;; process ))
这样的东西

把对应的代码恢复到对应位置,只要求值,就和普通的代码无异。所以lisp可以。而其他语言不可以。你返回一段语句,这段货的数据类型是啥?它就是数据,不是语句。要运行它,eval它,然后只能得到一个结果(以我对ruby粗浅的了解,它已经比java灵活太多了)。不像lisp可以替代源代码中的一个部分,比如替代函数中的一部分,这段代码可以操作参数,其他语言可以么?

但是lisp这么强大,为什么1958年就被发明,半个世纪以来,lisp没有广泛的应用?

lisp并非没有得到过应用。在教学领域,lisp是一门非常广泛使用的语言,那些不急功近利的学校比如麻省理工,入门课都采用schme(一门lisp的方言),而在商业领域,有名的《黑客与画家》的作者P··G在创立世界第一家互联网企业viaweb时,使用的是lisp。lisp之所以没有被广泛应用,是因为它太强大了,这么说似乎有点欠揍,但强大就意味着灵活,而灵活就意味着几乎没有语法。那些商业公司想要的只是稳定,把工作完成,他们并不在乎你用什么语言开发。他们才恨不得每一行都是钉死的,所有人都用一个名字写函数,因为这样可以花更少的钱维护。ruby之父松本行宏曾这么说:

而lisp的问题在于,只要你掌握了s表达式,想写出什么样的程序都行,这意味lisp是没有语法的。这在应用上带来了一定的麻烦。我不希望自己的语言是没有语法的。所以ruby加入了一定的语法限制。

而在程序员的角度来说,以我看来,大多数人似乎不那么聪明,多数人喜欢用一种死语言(java/c++)也无可厚非,因为他们的思维可能就是死的。lisp可能更适用于强大的黑客,自己或者少数人每个人都很强的类型,它是一种黑客语言,而不是一种商业语言。

综上所述,lisp是灵活的,天马行空的,没有限制的。在我看来,一旦使用lisp,就不会想在去使用其他语言。lisp有一种和谐的美。我认为,Fortran,c++,java这样的东西是应需而生的,他们是为了满足当下的需要和硬件条件而设计使用的。而lisp从开始就是为了迎合真理和美而生。所以50年过去了,lisp还没有过时。lisp就是计算机界的真理,记得漫画《风云》中有这么一句,因为不管到哪里,真理(或者是类似的词)就是真理,所以绝世好剑的形状在哪都是一样的。lisp也是一样。以后可能会出现别的名字的语言,也可能不叫lisp,但是真理总是真理,所以绝世好剑的形状总是一样的。

但是从现实的角度来看,我们要编程,如何运用lisp呢?

  1. emacs使用emacs lisp作为架构语言(不仅仅是扩展语言),这是绝佳的学习lisp的途径
  2. common lisp和scheme作为lisp最有名的两门方言,广为人知。但是在教育领域应用比较多。实际用途似乎比较少
  3. GNU组织使用guile作为gnu通用扩展语言,但是我没听说哪有它的应用。
  4. 时下最火的clojure,你可能听说过,这是一种运行在java虚拟机上的lisp,编译为java字节码,具有和java一样的速度,使用它可以无缝使用jdk里的所有库和java的无数第三方库,现在你知道它为啥火了。clojure的一个子集可以编译为javaascript运行在浏览器中,这带来了无尽的可能,尽情的享受那些愚民们的成果吧,node.js貌似也行。

使用emacs而非普通ide的几个理由

轻便:emacs包括海量的文档也只有28M, 而eclipse一般是100多M,这就算轻便的了,visual studio是以G记的。而且emacs在启动时会占用更小的内存,更小的资源占用意味着更稳定,可以反复启动多次也不觉得浪费时间

支持:ide里eclipse只有对java和c++算是全功能,其他语言支持较少。visual studio因为是微软产品,除了对微软自家东西之外没有任何支持。而对python和ruby等开源语言或者clojure等新兴语言甚至是小众语言。这些ide要对一门新语言支持,等把。而emacs和vim等文本编辑器就好得多。

可定制性:在ide中想增加一个新功能,哪怕比较简单。提交bug报告然后等新版本吧,还不一定有。在emacs里你只要用lisp写新的代码然后hook到已有的模式,甚至直接改写已有模式就行了。

文本编辑功能:在emacs中即使在特定模式一般全局按键都是可用的,比如跳转到行首行尾,按词移动等。eclipse里也有类似特性但是emacs里更多。

因为ide能做的emacs大部分都能做到,而emacs能做的很多ide都无法实现,所以干嘛要用ide呢,无非是要付出时间去学习而已

为什么字节码+虚拟机的模式比机器码+编译器更流行?

众所周知现在的软件行业是解释型语言的天下,无论是开源轻量级语言Python/Perl/Ruby还是企业级应用Java甚至微软新搞出来的.Net系列/C#,都基于字节码+虚拟机模式。这么做毫无疑问比机器码+编译器更慢,而且机器码+编译器也并非不能实现高等语言,那么why?

Hacks and Painters里给出的解答是:字节码十分接近机器码,因此为字节码编写基于硬件的解释器比编写编译器更容易!

想象一下。接近自然语言的高等语言+编译器+机器码与接近机器语言的字节码+解释器+机器码。当然是后者更容易,但是后者就额外需要把源代码翻译成字节码的编译器,但这个编译器只要实现一次就够了!(最复杂的部分只要做一次就够),而针对不同的硬件编写解释器是相对十分容易的。

另外如Hacks and Painters所说的,增加软件中间层,会降低执行效率,但能使编程更灵活,开发出的东西更强大。换句话说,这是一个不断抽象,不断接近人类自然思维的过程。

字节码更通用,更灵活,更强大,不拘于平台限制。其唯一的缺点是降低代码运行效率,但是在硬件速度18个月翻一番的今天,这并不重要。

关于编程的一些感悟

这几天我在虚拟机里安装了ruby version manager,试图重写自己过去留下的几百行乱成一团的代码(虽然都还能用),并打算进个小步啥的,结果几天下来,一无所获。

于是我想:what the hell are you doing?

然后我试着又去搜索,看库文档,重新翻看编程书籍,但是感觉还是没什么进展。你没找到自己想要的。but why?我躺在床上一遍又一遍想这个问题,后来忽然有种悟的感觉:
那一切都他妈是扯淡。

当然,编程书籍是重要的,文档也是重要的。但是一本书并不能提供你的水平。我甚至购买了O’Reilly出版的ruby编程语言,结果呢,我懂得很多一般开发人员都不知道的细节和诀窍,但是我能独立开发一个web网站吗?显然不能。

书和文档,提供给你的只是零件,怎么把这些乱七八糟的齿轮组装成能用的机器则是你的问题,是人的问题,要解决这个问题,唯有学别人的样——读源代码。

因此一门好学的语言,当然语法简单也很重要,但更重要的是能不能找到好读的项目代码。ruby大部分的gem,都属于web开发领域,少数web无关的也都很陈旧,而他们往往依赖于其他gem,被依赖的gem很多已经升级换代导致api都不兼容了,所以这些web无关的玩意儿可能根本就跑不起来,本身都需要改写,谈不上再从中学习。(我感觉)python和perl就好一点。但更好学的,当然就是javascript,丫几乎无处不在,所有的web网站都有javascript,userscripts.org上有成堆的js脚本,firefox和chrome所有的扩展都用js写成并且可以拆开来看,要获取源码实在是太容易了!而且依赖google的v8引擎,js是现在几乎最快的可媲美c++的脚本语言,用node.js,可以脱离浏览器使用。

所以我将学javascript。其实api,库文档,书籍都不重要,那些标准,三年之后就全变了,干嘛要努力去记住呢?重要的是学习的速度,是结果

由Win7语言包所想

最近下载了一个win7旗舰的英文语言包。以为自己系统可以变成win7英文版了。可是开机关机还是中文。经高人指点后才知道,这些所谓的语言包只是类似程序的东西,开机需要启动,关机需要关闭。

于是唏嘘不已,原来英文只是它的一张皮,中文还是它的本质与核心。当这层皮被剥掉,它的本质也就显露出来了。问:难道不可以改掉核心吗?答:貌似不容易。

于是想到了我们的人。人又何尝不是如此?荀子认为,人性本恶,只有后天的不断教育才能让本性变得有道德、有责任心。江山易改,本性难移,我们性格的塑造,经历了多么漫长的时刻。终于,我们承认了,我们的核做完了。

这只是做完了,但并不是做好了。现实生活中,总有一些人的“win7内核”出这样那样的问题,就说我们平常生活吧,总有一些人,不骂人不打架不抽烟不喝酒就不痛快;总有一些人,拿着有色眼镜看别人;总有一些人,出世如此阴险……

这些人,有些人确实受教育程度不足,表示理解;可是有些人呢?从小受到了先进教育,进入名牌大学,掌握高等学历……这些人,在漫长求学阶段里,只是更新了自己的皮,而内核的质量不可恭维。甚至遇上病毒寒流,让自己的内核更加倒退、迟钝……在社会中,这些人犹如带病毒的计算机,不断传染那些本质率真、淳朴的人……社会在退化,但是,我们却没有杀毒软件来处理它。于是只能用各种各样的美好的外皮来掩饰内心的腐烂……

还是让我们花点时间,打造一下我们的内核吧。所有的皮总有磨破的时候,而只有内核会跟随你一生。(文:天才机灵鬼  346078115)

同登世界排行的D语言与C++之间的关系

      很久很久以前就听说过有一种叫做C语言的东西,但不知道是哪国语言,后来又听说过一中叫做D语言的编程语言。

      据Tiobe2009年5月发布的编程语言排行榜,Java、C、C++以绝对优势占据前三甲的位 置前十名的语言分别是:Java、C、 C++、PHP、VisualBasic、Python、C#、t、Perl、Ruby。

      D语言是由 DigitalMars公司的WalterBcenter所开发的面向对象、指令式、多范型系统程式设计语言。D语言起源自C++,并受到C++很大的影 响,不过D语言并不是C++的变种。D语言对C++的部分特性重新设计,并受到其它编程语言观念的影响,如Java、C#以及Eiffel。D语言从 2004年开始开发,2007年1月2日释出1.0稳定版本。实验性版本2.0 释出于2007年1月17日。

      D语言的设计来自实际的C++ 用法的经验教训,而不是从理论的角度。尽管D 用到很多C/C++观念,D同时也废除了某部分,因此D语言并不完全向后相容C/C++ 源代码。D加入了 C++的功能,也实作了契约式设计(designbycontract)、单元测试、真正的模组性、自动化内存管理(垃圾回收)、第一类阵列 (firstclassarray)、关联阵列、动态阵列、阵列切片、嵌套函式(巢状函式)、内部类别、闭包的限制形式、匿名函式、编译时期函式执行、惰 性计算以及革新的模板语法。D保有C++ 的性能以进行低阶程式设计,并加入完整的内联组译器支援。C++ 的多重继承改以 Java单继承与接口混合的风格取代。D的宣告、语句和表达式语法几乎和 C++ 一样。

撰稿人:root@linux
如若复制、转载请注明原文地址:http://mtoou.info/biancheng-c-d/