为什么总是有人说 Java 啰嗦,却没人说 C++ 啰嗦?

420 阅读4分钟

为什么总是有人说 Java 啰嗦,却没人说 C++ 啰嗦?乐字节小z为你讲解,因为Java只支持面向对象一种编程范式。

只支持一种范式,好处是严谨,风格统一;坏处就是呆板、啰嗦。

典型如它的main函数,再也不能像别的语言那样写成一个独立的函数,而是必须包在一个没有实际作用的类里面……

这样“不管有没有必要,反正你必须把任何东西都先弄成类”的要求,显然会导致许多本无必要的间接访问以及由此衍生的其他很多麻烦——和其他语言相比,当然就显得过于啰嗦了。

尤其是早期,相关理论尚未成熟,再加上单一范式的限制,就使得它相对于早已成熟的其他语言,显得表达能力过弱——有一个著名的吐槽,大意就是“之所以Java需要搞出那么多设计模式,就是因为它表达能力太弱,别的语言很简单就能做到的事,它就必须通过设计模式才能拐弯抹角的办到”(当然,这些主要还是面向过程和面向对象风格本身的区别,不能完全算是Java的缺陷)。

与之相反,C++是一种“多范式”语言,非结构化、结构化、面向对象、宏、模板……啥好用你就能得到啥——任何工作,你都有最简化实现它的可能。

但缺陷就是,再也没人能“精通C++”——你可以拿它当C用,当Java用,当object-c用,玩模板黑魔法用……但最好别把它当C++用。不然真没人hold得住它。

当年的Pascal也一样:它仅支持结构化编程一种范式,这种纯粹而“板正”的风格使得它成了当时最佳的“教学语言”,但是很少被用到实际项目中。

而当年的C,它支持结构化编程,同时也允许你任意解释内存数据。这就使得它得到了额外的许多灵活性,甚至到现在都还充满了生命力。

当然,过去和现在情况还不太一样。

过去的编辑器没现在这么强大、智能;Pascal的“板正”没能带来教学时概念清晰之外的更多好处,反而因为单一范式的束缚让人感觉碍手碍脚,自然不是C的对手。

但现代编辑器强大的语法提示功能给了程序员太大方便——“板正”的单一范式强类型语言的语法提示实在太好做太强大了,你甚至很难把语法错误留到后半拉花括号敲出来之前:付出一点点“格式化”的代价,换来这么大的好处……

与之相反,过于灵活随意的C++,它的语法提示可不是一般的难做。

别说200x年前后的“黑暗时代”,哪怕到现在,都还有不少主流编辑器没办法为C++代码提供Java级别的语法提示(我知道现在做的比较好的语法提示,其原理相当于在后台边编译边提示[实际是解析语法树]:而且这个编译器还必须支持“半拉函数”的动态编译,不然很难给出准确的输入建议)。

——亦因此,当年就没人能劝我加入VIM教:在下写C++必用eclipse/VS之类重量级IDE,不然语法提示真没法看(当然,这都是上个年代的老黄历了。现在已经有很多编辑器可以给出高水平的C++语法提示了,甚至可以自动提示模板实例化后的正确参数类型。至于VIM,它很早也已经可以配出基于语法的提示了;不过本人太懒,早年实验几次感觉效果不佳就再也没用它写过C++……)。

类似的,由于编译器发展水平所限,过去的Pascal语法“板正”,使得它需要付出很大的额外性能消耗(因为没有办法像C那样让程序员“抖机灵”);而现在的Java,却因为自己的板正,给了字节码编译器以及即地编译器大量的提示,使得它们得以完成深度优化,从而得到了极佳的执行效率……

时代不一样,配套技术成熟度不一样,很多东西就不一样了。

总之,没有免费的午餐,诸多相关也不是一成不变的;每一种成功语言之所以成功,都有其道理。评论利弊须就事论事,这才不容易翻船……

文章转自:乐字节