收一些关于lisp的杂文

Lisp的本质》是一篇雄文 作者是美国的俄罗斯移民,一位常年从事IT的程序员,写了这么一篇“洗脑文”,一篇类似传播宗教福音的宣教文

作者叙述了自己被Lisp洗脑的过程,从开始对Lisp的不解、甚至有些鄙视,到如何听到Lisp“先知”的教瑜,出于对大神的崇敬和膜拜,强迫自己开始洗脑的征程

突然有一天,作者“顿悟了”,羽化成仙了,在升天前的最后一刻,向尚未开化的芸芸众生们留下了这篇雄文

作者的“悟”来自于对先前的编程经验与Lisp之间的神秘联系

第一个出场的就是XML语言

21世纪初各大商业IT公司、大学和研究机构看好的,用来描述数据格式的语言

随Web Services的兴起,开始取代相类似的各种专用协议,成为网络传输数据和方法的标准格式

后成为各种编程语言的附属物:各种环境参数配置文件,甚至像迅雷bolt界面引擎这种

XML使用范围的扩大,逐渐发展出一套完整的XML技术,对XML文档的格式的专用语言、对XML文档数据的查询语言等等

XML最大优点,可以定制文档操作符的语义。付出的代价就是语言的笨重,句法多于语义

既可作标准的数据文件也可对某些操作定义其接口或者叫”签名”(signature),这样,XML实际上兼有数据和处理两方面的特征

而这,正是Lisp语言最本质的特征——自定义语言的语义。我不想掩饰当我看到这一段时的拍案叫绝心情

Lisp 以及基于此的语言好到不行,为什么基于 C 的语言一经问世便占据统治地位?

一个显而易见的可能回复是这样的语言的门槛太高,智商一般的程序员根本不能拿来实用。如果是这样,一群智商一般的程序员反而成就这个信息世界,是不是有点反讽呢?


早期的 Lisp 语言有缺陷

社区对新人不友好

Lisp 用户喜欢单干,把代码写到自己能用即可,不会为其他使用者考虑

Lisp 程序员更难被取代,对雇主而言不好招人

方言太多,花了大量时间,也没搞清哪个方言适合我

很多语法特性只能读写得很学术的文档,并且解释很少,实在难以理解

读起来离自然语言很远

早期的硬伤太大,就被滚雪球了,后期很难翻身

老用户花了多少工夫才能精通啊,智商必须高人一等啊,这么牛逼怎么还能去做引导和帮助新人的事呢,没骂他们傻逼就很不错了。社区不能健康发展,就越来越小众 人少也就话语权低,继续被滚雪球

代码和实际执行的指令序列可能差别大到无法想象。lisp程序员知道万物的value, 但不问cost


现代的lisp非常优美?但以牺牲可用性为代价。何为可用性?快速构建解决方案的可能性

依赖于强大的库,而库则依赖于语言的直观与简单

lisp相比C并不简单,尽管其思想很简单,但是深入学习你会发现要理解的地方很多。比如等价关系就有至少三种不同深度

lisp并不对应的到大规模使用的物理机器模型,并不适合硬件实现。这种不对应造成的一个后果是对硬件的理解无助于你对软件的理解,这种知识上的割裂是致命的,特别是在编程语言发展的早期。而C直接就是基于简单的抽象硬件

c语言是基于冯诺依曼体系的,而lisp不是

lisp背后的思想一页纸就可以写下。它把大量的复杂性推到了前端。lisp程序员需要完成好多编程语言才需要关心的工作(lisp迷热衷于基于lisp构造自己的编程世界),这应该就是lisp的受众为什么很小的重要原因之一

而解决现实问题需要的是成熟的工程实践,一致的接口,模型,范式,甚至纪律。lisp自由主义的范儿,哪受得了这样的约束?

说到支撑环境,lisp社区的混乱有目共睹,商业支持泛善可陈。方言有几百种,来自其他的语言的程序员如果学习lisp,一周之内就可以搞出另一种方言。现在Common Lisp和Scheme分庭抗礼,似乎要二统山河。但是仍然问题多多


要解决的问题(目标域)是复杂的, 实现的机器(实现域)是不完美的, 人类的自然语言体系(表达域)就更是不完美和复杂的

而一门成熟的通用编程语言, 要在这三极之间保持平衡, 就不可能简单了

Java语言通过削减矛盾(用虚拟机代替真实机器), 削减表达能力来获得简单性

C++更适合大规模的需要运行效率的核心应用

使用媒体编辑软件, 你肯定不希望大型媒体内容还没装入内存, 编辑软件本身先吃掉一半内存

机场调度软件, 你肯定不希望飞机准备降落的时候, 控制中心却在忙于整理内存垃圾

无论是调度仿真实时控制还是媒体编辑, 一触及重量型的关健性应用, 除了C++你别无选择


新人试着学了一下Lisp, 结果马上就撞了墙。被那些范例代码吓坏了

Lisp的语法太次了。一个语言的发明人, 居然不肯用心弄出一套漂亮的语法, 那谁还会愿意学它。反正, 我是确确实实被那些难看的无数的括号搞蒙了

回过神来之后, 我和Lisp社区的那伙人交谈, 诉说我的沮丧心情。结果, 立马就有一大套理论砸过来, 这套理论在Lisp社区处处可见, 几成惯例

比如说: Lisp的括号只是表面现象

Lisp的代码和数据的表达方式没有差别, 而且比XML语法高明许多, 所以有无穷的好

Lisp有强大无比的元语言能力, 程序员可以写出自我维护的代码

Lisp可以创造出针对特定应用的语言子集

Lisp的运行时和编译时没有明确的分界

等等


我在公司中见到一类人,就是工作中的东西都没做好,细节方向处理的很粗糙,就是不把实际工作中的问题放在心上,最后问来问去,总要我最后帮他们擦屁股,相反,他们反而对非工作外的技术热心的很,工作上的任务的优先级始终是最低的,我分配的任务明知道有难度,还敢这么做,简直服气+心大,平时找他们,总是在看最新的技术文档,rust 之类的,嗯,看起来很牛逼,实际中和他们讨论到项目具体问题,没有独立见解,讨论简直浪费双方时间,于是,项目中这类人我是直接踢出去的,这类人在一个小组内,不会增加团队战斗力,是负分,最后,我只会给他们分派低级重复任务,把某些实习生提升,嗯,题主你说这类 狂热粉 ,实际项目的贡献几何呢,我自认智商一般的程序员,但是我能提高实际一半的工作开发效率工具,就想着优化流程,节约软件整体开发流程,PK PM,驳回他们幼稚的需求和想法,让团队不加班,避免重复工作,不疲劳奔命,一年结束都不知道自己做了什么。实际开发如果是这样的情况,和语言有什么关系,应该问:为什么学lisp语言的人这么NB,为什么成为软件基石的能用的东西这么少,有几样是lisp做的,那这些人从行业起初到现在究竟在干嘛,做了什么东西出来?


因为早期 Unix 以交流学习为目的大量免费分发(主要在各大学),各厂不用花大成本就能生产便宜的 Unix 工作站。然后计算机行业就因为 Unix 的流行保守估计退步 30 年

因为 Unix 流行,C 就成了标配。关于 Unix 的流行,原因在 The Arise of Worse is Better

这个世界上绝大多数重要的软件都是使用这类语言实现?

你们用的 Window System,Mouse,Leaser Printing,LAN,还是在 Lisp Machine 上实现的

所谓“基于 C 的语言”,其实一个个和 C 没大关系,反而深受 Lisp 影响

比如 Java 的一票设计者都是 Lisp 专家,James Gosling 写了 Gosling Emacs,第一个在 Unix 上运作的用 Lisp 作扩展语言的 Emacs

Guy Steele 是 Scheme 之父,还是 Common Lisp 标准制订者之一

比如 C++,Haskell,Rust,深受 ML 影响,ML 又叫 Lisp with type。你们以为是 C,实际是包着糖衣的 Lisp

Python 都有人吹是 Lisp 方言

Lua 是由 Scheme 催生的

JavaScript 有着基本只在 Lisp 中看到的 dynamic binding


为啥现在大家都说lisp好?

现在的硬件和编程发展刚好弥补了当年lisp的很多短板

当时软件工程膨胀到 传统的oo解决边界的时候,大家发现lisp系居然可以避免这些因需要多重继承啊 接口啊之类的引入的复杂性

lisp设计的目标就是为了计算,而且天然的代码即是数据的设计可以自行削减编程上的复杂性

可惜现在的主流编程语言只引入了函数式编程和一堆语法糖,部分引入了代码即数据,自己编写自己的概念

缺点

不用的代码很快就忘记怎么工作的了,虽然重新算下很容易找回来。 水平低的程序员容易看不懂,不利于团队合作

一年内就能自己给自己搞出三种新方言