是像 Java 或者 C#这样强类型的准静态语言在实现复杂的业务逻辑、开发大型商业系统、 以及那些生命周期很长的应用中也有着非常强的优势 这是一个存在于大家心里常识了。我承认我自己在潜意识里面也觉得静态强类型语言适合开 发复杂,大型系统。而弱类型脚本语言不适合开发太复杂,太大型的项目。但是在参与这个 讨论过程中,我突然开始置疑这个观点,事实究竟是不是这样的呢? 先定义一下标准: 强类型语言是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如 C/C++/Java/C# 弱类型语言是指不需要进行变量/对象类型声明的语言, 一般情况下不需要编译(但也有编译型 的)。例如 PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell 等等。 引用 观点一:静态类型语言因为类型强制声明,所以 IDE 可以做到很好的代码感知能力,因为有 IDE 的撑腰,所以开发大型系统,复杂系统比较有保障。 对于像 Java 来说,IDEA/Eclipse 确实在代码感知能力上面已经非常强了,这无疑能够增加 对大型系统复杂系统的掌控能力。但是除了
Java 拥有这么强的 IDE 武器之外,似乎其他语 言从来没有这么强的 IDE。C#的 Visual Studio 在 GUI 开发方面和 Wizard 方面很强,但是代 码感知能力上和 Eclipse 差的不是一点半点。至于 Visual C++根本就是一个编译器而已,羞 于提及 Visual 这个字眼。 更不要说那么多 C/C++开发人员都是操起 vi 吭哧吭哧写了几十万行 代码呢。特别是像 Linux Kernel 这种几百万行代码,也就是用 vi 写出来的阿,够复杂,够大 型,够长生命周期的吧。 引用 观点二:静态语言相对比较封闭的特点,使得第三方开发包对代码的侵害性可以降到很低。 动态语言在这点上表现的就比较差,我想大家都有过从网上下载某个 JS 包,然后放到项目 代码里发生冲突的经历 也就是说静态类型语言可以保障 package 的命名空间分割,从而避免命名冲突,代码的良好 隔离性。但是这个观点也缺乏说服力。 静态类型语言中 C,VB 都缺乏良好的命名空间分割,容易产生冲突,但是并没有影响他们做 出来的系统就不够大,不够复杂。 而 Visual C++开发的 DLL 版本冲突也是臭名昭著的, 似乎 C++的命名空间没有给它带来很大 的帮助。 而动态类型语言中 Ruby/Python/Perl 都有比较好的命名空间,特别是 Python 和 Perl,例如 CPAN 上面的第三方库成吨成吨的,也从来没有听说什么冲突的问题。 诚然像 PHP,JavaScript 这样缺乏命名空间的动态语言很容易出现问题,但是这似乎是因为 他们缺乏 OO 机制导致的,而不是因为他们动态类型导致的吧? 说到大型
系统,复杂业务逻辑系统,Google 公
司很多东西都是用 python 开发的,这也证明 了动态类型语言并非不能做大型的复杂的系统。其实我个人认为: 动态类型语言,特别是高级动态类型语言,反而能够让人们不需要分心去考虑程序编程问题, 而集中精力思考业务逻辑实现,即思考过程即实现过程,用 DSL 描述
问题的过程就是编程的 过程,这方面像 Unix Shell,ruby,SQL,甚至
PHP 都是相应领域当之无愧的 DSL 语言。
而显然静态类型语言基本都不满足这个要求。 那静态类型语言的优势究竟是什么呢?我认为就是执行效率非常高。所以但凡需要关注执行 性能的地方就得用静态类型语言。其他方面似乎没有什么特别的优势。 若干评论: 1。看看 yahoo 吧,它是用 PHP 写的。给你用 JAVA 也可能做不出来那样的性能。 2。 我的一点感觉, 动态语言足够灵活, 因此虽然它能够让人更集中精力思考业务逻辑的实现, 同时也向人工智能的方向走得更近一些,但因此它也更依赖于开发人员本身的技术功底,初 学者、中级开发者,难以很好的利用它。 而静态类型语言,与我们
计算机教学的基本科目 (c/pascal/basic)延续性比较好,所以对