语言和代码的行数

程序员证明证明一个语言的优秀常常就是:用XXX行代替了YYYY重写了ZZZZ。这都快变成了一个Pattern。事实列举是对的,但是这不足以说明一个语言就超过另一个语言,哪怕是在行数上。

影响代码行数的因素有很多,重写后是最不容易说明问题的。就算使用同一种语言,你再重写自己的一个应用,也可以极大的缩短代码行数,而这是因为你站在了以前代码的基础上。

除了写Hello World这种演示级别的程序以外,当程序的代码达到一定数量后,用说明语言其实区别不是特别大,翻倍可能,但是肯定达不到数量级的区别。原因是程序本来就是现实问题的抽象,当代码行数达到一定规模后,你自然会使用一定的抽象,所谓的高级语言,也是这样出来的。

举一个例子,即使你现在翻看一些C语言写得项目,你仍然可以发现面向对象的思想在里面,而且很多都是借助struct来模拟的,即使C语言的标准库没有listmap这样的数据结构,但是有几个C语言的项目没有实现这些通用的数据结构呢?Redis包括Linux的Kernel不都是有这样的通用数据结构。

所以,当代码达到一定规模,我们就会抽象,所以会减少很多的重复,而重复才是影响代码行数的其中一个重大因素。

另一个影响代码行数的重大因素是兼容性,这也是很多软件大版本升级后,代码行数减少,性能变好的重要原因。一个大项目跨时很长,其中很大部分的代码贡献了再兼容性,包括改动时考虑对原有代码影响最小的情况。而重写完全不用考虑这些,加上更加熟悉业务,所有代码行数会有很大的减少。

所以用什么语言并不能指数级减少代码的行数,跟代码行数有关的就是减少代码行数并不能显著减少项目所用时间。再举一个例子,C#和Java相对是比较冗长的代码,但是C#和Java在工程面考虑了很多功能,比如如果你想做一些精确运算你可以直接用decimal类型,而你用Golang还真没有现成的类型,你需要用math/big库来处理。

以前听冰河的一个访谈,其中说到100W行的Lisp代码对应400W行的C代码,我认为这是靠谱的。在语言抽象度上Lisp算事比C要高出许多,但是也只是区区4:1,考虑到C语言的工程师数量,常见问题的解决范式,等等便利。Lisp剩下的优势就非常少了。
所以换语言重写缩小代码行数,真不是个什么事儿。

@ 2015-07-26 08:00

Comments:

Sharing your thoughts: