哪些语言特性,有助于开发大型系统
刘鑫
编程话题下的优秀答主
说实话,多大算大这个问题很让我困扰。你说豆瓣那规模大不大?其实没用什么高大上的语言特性吧,Python这么憨厚的玩意儿,不也跑的挺好?
当然我知道同行们有些是看不上这种规模的项目,我也理解,也认同。但是战斗机,卫星,航空母舰,外星探险车,或者一个维护几十年,规模超过千万行的操作系统,这些项目对这个世界上多大比例的开发人员有参考和学习意义?但是如果我们无视这些极端场景下积累的知识和经验,又会错过什么?
我个人的经验来讲,“大型系统”,并不能对等于“优秀的产品”或者能让我心动的知识。做一个工程,需要各种各样的妥协,最理想的工具未必就是最终能帮助我们做成这件事的。但是我还是可以尽量的给出我自己心目中一些对项目开发有正面意义的语言特性。
- 一个安全方便的资源管理方案。主要是内存和IO资源。行内有个笑话,一群人说内存管理太重要了,不能交给程序员;一群人说内存管理太重要了,必须交给程序员。该给谁,具体的项目说了算,一个既有的质量达标的运行时,对于普遍的应用项目是有意义的。大到可以用来自夸的“大型项目”,小到手机app。GC、ARC、智能指针、内存池,都可以看作对资源管理自动化的方案。Java 虽然语法笨拙,但是JVM的质量确保它得到足够的拥护。C说不上有什么内置的自动化资源管理方案,所有优质的C项目都会自己实现一套,CPP理论上有非常好的方案,但是很多优质的CPP项目也是自己实现一套。
- 一个功能丰富好用的文本类型。这个东西在理论上根本不应该是个事儿,字符串,那玩意儿不就是个特化的线性容器么,好多专家都能说的头头是道。但是在应用领域,文本类型的支持程度,完全可以决定一个语言是否能流行开。基本上比CPP文本功能更弱的编程语言,现在是很难被广泛接受的。
- 模块和命名空间隔离能力。这个东西有些语言是放在编译和编码阶段,有的是跟运行时尽可能相关的。但是运行时的模块管理策略其实影响资源载入机制,也就一定程度上影响了效率。效率这个问题么,又是一个吵不完的罗圈架。很多人都觉得自己有过人的深刻见解。这个我无意参与争执,总之语言级别提供助记方案,通常总是有帮助的。
- 开发工具支持。我个人近几年除了iOS/Mac OS的GUI相关的开发,基本上是纯编辑器工作,这并不表示我完全否认开发工具的作用,相反好的IDE肯定对工作是有帮助的。我对IDE的负面观点主要集中在几点,一个是“好”语言不应该依赖于某一种特定的IDE,一个是语言应该对开发工具是透明的,工具能做到的,应该允许人手工也能做到,这样才能方便的发展团队自己的自动化过程。
- 类型约束。老实说我没觉得这个东西必不可少。它确实对开发有帮助,对错误容忍越少的项目,越需要类型约束帮助我们提高代码质量。但是也确实有很多项目就是用动态类型的语言哗啦哗啦写出来就最好了。程序没有面对那么极端的场景,我就用1/10的开发成本写个几万行的项目出来,再用1/10的成本写个万把行的测试,再用2/10的成本去测试行不行?很多项目是可以这么做的,而且我看这么做出来的项目很多并不小。
- 内置类型,特别是基础容器和算法库。质量高不高,好不好用,跟语言的结合程度,至少影响了使用上的舒适感。个人观点上CPP对C的优点,相当大的基于STL和BOOST,它们可以让我几乎忘了我在用一个“C” Plus Plus语言。Python 受到欢迎,很大程度也是因为[]和{}内置类型非常好用。类似的,现在对并发和异步的语言级支持,也是越来越受到重视,但是还没有内置类型这么重。很多时候我们还把它看做是需要程序员明确构造的东西。但是大概再过几年,异步和并发的细节也都移交给C和CPP这个层面了。
这些东西也只是有助于我们工作,其实没有绝对的致命因素,最终还是要讲究妥协。例如C/CPP没有那么完整的runtime,但是我们有资金,有开发周期,我们请来专家写一个专用的runtime给我们自己用行不行?其实质量可能会更高对吧。那些“只能用”C/CPP才做得到的“大型项目”,很多都要做这样的工作,另一个角度看,我们用的很多编程语言,也是在享受别人预先完成的runtime。别的我不好说,Python/Ruby就是典型。但是我不认为这就表示这样的语言格调不高,没有价值。例如CPP对C语言的很多优势,如果换个角度,把LUA看做一个C的runtime
和DSL
工具集,意思就表达到这里了。
一时能想到的,比较具体的点就这些了。至于那些形而上的理论,其实我很难说服别人,也很难被人说服。就不提了。
===========
忘了说,是否方便调试其实应该算在内,虽然抬杠的说可以说这个东西不是语言应该操心的问题,但现实是某种语言是不是方便调试除错还是可以比较的。