编程语言

(一)

毕业后相当长的时间里,只会用 C 语言。虽然大学时,学过汇编,学过 Java,但基本在工作中没有机会使用。

第一次意识到 C 语言的局限性,是想开发一些“一次性的小程序”,比如从 excel 里提取一些数据进行处理,再如,做一些自动化的工具。这种场景下,C 语言真的是力不从心,不是做不到,而是非常麻烦。由于这个动机,学习了 Python 语言,从此打开了探索编程语言的一扇窗。

很久之后,才意识到,在相当长的时间里,自己的编程思维局限在 C 语言的能力边界上。后来陆续学习并使用了 JavaScript, Java, Go, 甚至 Rust。慢慢地对编程语言有了更全面的认识。

(二)

每种编程语言都有它产生的历史背景以及设计目标,但总的来讲,一个高级语言,应该有以下几个特点。

首先,函数是一等公民。作为一等公民的函数,可以作为函数参数,可以作为函数返回值,也可以赋值给变量。在这方面,C 语言通过函数指针勉强可以实现,而且基本上已经属于“高级用法”了。但在 JavaScript, Python 这种语言里,那就真的是一等公民身份了,这种用法随处可见。JavaScript 甚至还因为过度使用,搞出 callback hell 这种陷阱。

其次,动态类型。这个话题,在程序员中争议很大,有的人是静态类型的拥趸,理由也很充分,规则越严格,越可以在早期扼杀掉错误,从而解决问题的成本越低。Rust 在这方面堪称“变态”,为了在编译期发现更多的错误,不要说数据类型错误了,就连引用“野指针”这种错误都可以在编译期检查出来。为了解决静态类型的限制,发明了类模板,泛型编程之类的解决方案。Java, C++, Go 就是这种类型的代码。另外一派人认为,动态类型更灵活,所谓的泛型编程,其实是又臭又长的裹脚布。他们认为,编程语言不应该为了防止普通程序员做傻事,而让天才程序员也带着镣铐跳舞。Python, Lisp 就是这种语言的代表。

再次,垃圾回收机制。象 Python, Java, Go 这种,确实解放了程序员的一些负担。C 语言这种不支持垃圾回收机制的语言,引起程序崩溃的首要原因,就是内存问题,包括内存溢出,踩踏,泄漏等等。当然,垃圾回收机制并不能完全杜绝内存泄漏,而且内存泄漏地更“隐蔽”。

再次,支持宏编程。这里的宏和 C 语言里的宏有本质的区别。C 语言里的宏,是编译器在编译之前,预处理阶段处理的,只是简单的替换。而 Lisp 语言里的宏,则是一种直接操作代码本身的代码。简单地说,可以用 Lisp 的宏,写一段代码,这段代码可以生成另外一段可以运行的 Lisp 代码。Paul Graham 在《黑客和画家》中,把他的创业项目 viaweb 的成功,归功于 Lisp 的宏。他认为,使用宏编程,其开发效率可能是十倍,百倍于其他语言。

再次,函数库。一个高级语言应该要有丰富的,精心设计的函数库。函数库应该包含所有通用任务的实现。程序员的大部分任务,可以通过函数库完成。看到这条,相信经常使用 C 语言编程的程序员,都想把 C 语言开除出高级语言行列。每次看到在各个不同模块里重复实现的,不同样式的链表,我都想吐。相比之下,Go, Python, Rust 都有非常优秀的函数库。使得程序员的生产力得到极大的提高。

再次,一个优异的性能分析器。这方面,Go 语言可以说是行业标杆,它的性能分析器就是语言开发团队做的,而不是外面的第三方做的。它可以清楚地看到程序的运行效率瓶颈,统计程序的资源占用情况。看到 C 语言程序员,为了分析性能,不得不自己插入一堆临时代码,就感觉是拿着长矛和大炮打战。

再次,一个可用的语言控制台,比如 Python, Swift 这种,当你想验证一些代码片段的运行效果时,直接输入代码片段,就可以运行。C 语言程序员绝对会羡慕这种工具。

最后,简洁的语法也很重要。每次我看到 Perl 或 PHP 里一堆奇怪的符号,我就没有兴趣学下去。还有自带的单元测试框架。象 Python, Go 这种,你不需要去找第三方的单元测试框架。语言本身就支持。

实际上,在公司,特别是大公司,程序员很难选择自己喜欢的编程语言。这里面,最大的障碍是:这种语言必须是广泛使用的,这样公司才比较容易招到使用这种语言的程序员。如果是一个有自己想法的,对不同的编程语言的能力有充分理解的程序员,被强迫使用那种他“看不起”的编程语言,他会觉得浑身不自在,象是带着脚镣在跳舞。

但在程序员个人的业余项目上,程序员就可以自由地选择自己喜欢的编程语言。这个时候的编程,是在享受生活,而不是在工作。这也从另外一个层面解释了,为什么很多大公司的代码质量都不怎么样的原因。编程,一半是科学,一半是艺术。个人业余项目,程序员一般会把两者有机结合起来。但公司的项目,其艺术性将大打折扣。

(三)

Paul Graham 说过,Lisp 是当代所有高级语言的鼻祖。当代计算机技术一日千里,高级语言日新月异,层出不穷,但几乎没有一种高级语言达到或者超出 1958 年由 John Maccarthy 发明的 Lisp 语言。可能是我见识浅薄,Rust 是唯一我知道具备 Lisp 语言一些高级功能,特别是宏编程的高级语言。

1958 年,约翰·麦卡锡第一个提出了 Lisp 语言。我认为,当前最流行的编程语言不过只是实现了他在 1958 年的想法而已。

为什么呢?其本质的原因是,设计者本来没打算把 Lisp 设计成编程语言,他想用更简洁的方式定义图灵机。本质上,Lisp 是一种数学。而数学,是科学之母。

(完)


Post by Joey Huang under daily on 2022-03-16(Wednesday) 23:44. Tags: 每日随笔,


Powered by Pelican and Zurb Foundation. Theme by Kenton Hamaluik.