在coders的生活中,编程语言一直是经常讨论的话题,自己不敢发表什么大言论,但也有不少体会。记得2010年刚开始找工作时,自己在编程语言方面写的是:基本理解以c和lisp为代表的程序设计哲学,致力于研究人工智能技术在各项工程领域的实际应用,对神经网络,机器学习,计算机视觉和语音识别等有一定的基础知识和研究能力。
正如上面对人工智能和机器学习方面的粗浅认识一样,但毕竟走对了方向。时隔3年,自己对未来的技术发展判断还是没变,对编程语言的选择也是如此。在公司写代码也有2年半,还是觉得c和lisp的设计哲学最为简单实用,算是完美了。c和lisp之父已经先后去世了,但影响会继续随着移动互联网的发展流传下去。
今天看博客发现一篇文章,说couchdb的作者将底层代码从erlang改回了c,也算很好的案例吧。最近准备将3年来的所学总结一下,写个简单的server框架和search框架,也是打算参考一下nginx和redis的设计,学学他们在c语言核心库的设计思想。这2年一直在研发搜索和推荐方面的项目,服务也是主要用c风格的c++代码,数据挖掘可以用java和python,有很多的开源资源可以使用。在c和c++上也积累了一些心得,Damien Katz的相应总结,自己还是很认同的。
我觉得长期来看,还是c风格的c++实现较好,用c写一些核心的基础库,然后用c++做简单的封装,会是自己以后长期的做法。
虽然一开始使用Erlang编写了CouchDB的很多代码,但在花费了“2+个人月来处理Erlang VM中的一个崩溃问题”之后,Katz感到非常不爽。
我们浪费了大量时间追踪核心Erlang实现中的一些问题,不敢保证发生什么以及原因,我们觉得也许问题出现在我们自己的插件C代码中,希望我们自己能够发现并修复问题。但事实并非如此,这是核心Erlang中的一个竞态条件Bug。我们只能通过Erlang的代码查看器来找到这一问题。对于那些对计算机进行了过多抽象的编程语言来说,这是个很基本的问题。
出于这一点以及性能因素,Katz决定逐步重写,“将Couchbase的代码换成C,并将其作为大多数新特性的首选实现语言”。有趣的是,C证明了“当我们遇到问题、调试与修复问题时,C更具备可预测性。长远来看,C的生产力更高”。
Katz列出了对于后端来说,C要优于更高层次语言如C++、Java等的若干原因:
- 表现力
C的语法与语义非常强大且具有极强的表现力。凭借C,我们既能预测高层算法,又能预测低层的硬件。它的语义非常简单,语法足够强大,能够极大降低认知上的负担,让程序员专注在重要的事情上。
- 简单
C是一种弱、静态类型语言,其类型系统非常简单。我们所说的弱最后会变成一个优点:C APIs的“表面”是非常简单且小巧的。相对于大多数框架来说,C的一个明显趋势与文化就是创建小型的库,对简单类型进行轻量级的抽象。
- 速度与内存使用
C是速度最快的语言,无论是部分还是完整的基准都表明了这一点。它不仅仅运行时是最快的,其内存使用与启动时间也是效率最高的。如果需要在空间与时间上进行折衷,那么C并不会对你隐藏任何细节信息,我们可以很容易地做出估计。
- 更快的开发周期
对于开发者效率与生产力来说最为重要的就是‘构建、运行与调试’周期。周期越快,开发的交互性就越好,你就更容易处在任务的流态上。相对于所有主流的静态语言来说,C拥有最为快速的开发交互性。
- 调试
对于纯C代码来说,你可以查看调用堆栈、变量、参数、线程局部变量、全局变量,基本上可以查看到内存中的一切。这是非常有用的,特别是当你遇到了问题,这个问题在运行的服务器进程中出现了多日,并且无法重现的情况下更是如此。如果在更为高层的语言中失去了这个上下文,那么你就等着痛苦去吧。
- 跨平台
有一个标准化的应用二进制接口(ABI),可为现有的所有操作系统、语言与平台所支持。它无需运行时,也不需要其他额外内容。这意味着你使用C所编写的代码并非仅仅可由C代码中的调用者所调用,还可以由现有的所有库、语言与环境所调用。
Katz也认为C有“很多瑕疵”:
没有范围检查,不小心就会导致内存出现问题、存在野指针与内存/资源泄露情况、对并发的附加支持、没有模块、没有命名空间。错误处理非常麻烦且冗长。很容易就会搞出一堆错误,调用堆栈也找不到了,恶意输入会控制你的进程。闭包?哈哈