大话F#和C#:是否会重蹈C#失败的覆辙?
F#.net 出来有些年头儿了,将从 VS 2010 起在 .net framework 平台上以“一等公民”身份粉墨登场的它,将会给计算机科技与软件工业带来哪些悲喜剧呢?
F# 将扮演一个什么角色?在 .net fx 平台中?在软件开发的工具中?在整个软件工业的思潮中?在计算机科技的领域中?
F# 和C# 的关系是怎样的?二者将何去何从?F# 会如开发团队所预期的那样,取代C#,由其现在的“一等公民”身份晋升为“第一语言”么?F# 将靠什么来实现它的宏伟野心呢?F# 和C# 的前景?
F# 引起了我很多很多的思考……
F#.net 从 07 年有消息以来我并没有注意到它的存在。一方面是微软还觉得 F# 不够火候,仍然对主打愈加“变态” 的 C# 这张牌的策略不变;一方面是由于我有相当长一段时间着眼于算法和底层的问题,而疏远了 .net fx 平台。后来 VS 2010 的消息出来了,我才注意到这世上还有 F# 这么一个玩儿玩儿。于是近来我一直在关注微软 F# 开发团队的博客,对这门“新鲜”语言有了一定程度的了解。
这里推荐一个微软 F# 开发团队队员 Brian 的博客,还有 MSDN 上 Chris Smith 的博客。对 F#.net 还不了解的读者可以阅读他们的文章,对这门语言由浅入深有一个全面的认识。
我对 F# 真正燃起兴趣,是由于我一直在寻找一门数学化、高效、可与 C、C++ 和 .net fx 平台交互的语言。兼具面向语言、面向对像、面向多核开发特色的函数式语言 F#.net 全面地满足我当下的需要。
我曾对 matlab 寄予厚望,不过“矩阵实验室”的一些表现让我很失望。尽管从 Matlab 2008 / 2009 起其与 .net fx 平台的交互已经实现,但做为一门脚本语言,它在 .net fx 平台下的性能表现实在是惨不忍睹。它的 OOP 表现也不尽如人意——是它命中注定的。而动态数组则是 Matlab 的硬伤——这是我不得不先它搁一边的重要理由。
有人说,F# 将会出色地为科学研究领域服务。出身函数式语言的 F# 祖上可以追到 ML ……,现在的 F#.net 基于强大的 .net fx 平台,应用到科研领域将解放更强大的科技生产力,当然也将为微软开辟出又一片更广阔,也更具争议的市场,带来更多的收益和麻烦……
似乎 FP,Functional Programming 先天就是为实验室服务的。微软目前可不这么想,它就是想通过 F# 让 FP 走向软件工业。我疏漏才学,凭“感觉和经验”判断,让 FP 走向软件工业的尝试想必微软不是第一家儿,但是显然微软的动作更具市场性。
理想是好的,FP 在软件工业是否走得通呢?目前,软件工业几乎是 IP、Imperative Programming 的天下,如三巨头 JAVA、C、C++。至少在中国的大学,理工学科的学生又有多少知道这世上有 FP 这个东西?学编程就是学 C/C++/JAVA,就是学命令式编程语言,对计算机的理解也是完全机器化的、命令式的,而不是人性化的、数学化的——这一切看起来似乎都很合理,本来么,计算机就是 0 和 1。但是这种教育的直接后果就是把学计算机的人“成功”地从学数学的人当中割裂出来,使得计算机学生更倾向于向“代码民工”的方向堕落而完全忘却了计算机最初是由一帮数学家搞出来,是为数学服务的。学计算机的和学数学的学生的思维已经严重分化,学数学的对编程不感兴趣,学计算机的对数学的理解就是 ACM……
在市场和教育“狼狈为奸”的,不,是“双管齐下”的影响下,IP 在软件工业的传统势力根深蒂固。FP 被关在实验室已经很久了,F# 初出茅庐,能走得顺么?
至少,F# 的出现,让我开始重新审视自己对计算机的学习和理解。也让我有意识地去了解 FP 的历史,认识到了 IP 壮大的过程中对 FP 营养的吸收。比如早在 UNIX 和 C 之前,LISP 就已经产生了 GC 机制,再比如 C#3.0 中的 LINQ 技术。每当 IP 走到一个瓶颈,就会从 FP 那里获得灵感而改良自己。这让人看到了 FP 的优秀品质。
当今软件工业流行的是 CLR 理念,即“多种语言,一种平台”,比如微软的 CLI/.net 便是一个很好的实践。一个根植于成熟、优秀的平台的新语言,将得到更广泛的推广和使用。尽管 LISP 的历史比 C 还要早,但由于 FP 本身的高贵和平台的限制使其得不到合理的施展空间,被后来者 IP 抢先一步称霸市场。而 F# 一出世就架构在 .net fx 平台上,有利于它的推广。
不得不提一提 C#,从 C# 2.0 开始我一直在关注它。我对 C# 一直持谨慎的态度,从 C# 3.0 起,它开始“变态”……据说 C# 4.0 它将变得更变态。C#,一门静态命令式高度封装面向对像语言——这是它的完整属性定义,一个一开始被设计得以为完美无瑕的 OOP 语言,被微软赋予了整合整个软件世界的重任——可以说从 C# 诞生之初,就决定了它的“变态本质”。高度的封装化让它变得很笨,比如成灾的重载构造函数,还硬生生造出很多概念,比如委托,使用起来又是那么猥琐,于是它开始使用匿名委托,开始使用反射,于是,它开始“走向变态”。不久,C# 就傻眼了,它的 OOP 语言设计,只封装了类型,却封装不了变化,多此一举不仅没有保证“开闭原则”的理念的实践,反而捆住了自己的手脚——失败吧!C# 已经是失败的了。但丫的不服啊,你赚我笨我就开始简化——于是 3.0 开始引入了 LINQ,开始“类型推导”,于是不得不更加依赖“无耻的反射”,开始自残式地“变态”,4.0 开始,这门静态语言开始引入 dynamic,被 ILASM 编译出来之后简直就是一坨“反射”屎……,彻底地走向“变态”吧……
带四个加号的 C# 最终干不过只有两个加号的 C++,因为 C++ 是贵族,每一步尝试都走得那么小心,经过了严谨的论证。有人妄图把 C++ 给 C# 化,就是让 C++ 也走向变态,这是无耻的想法……
C# 立志让编程的体验变得愉快,VS IDE 对 C# 照顾得是那样地细致入微。到现在 2010 版 VC++ 也得不到 VC# IDE 同等的待遇。C# 造就了真正的软件工人,彻彻底底的“代码民工”,让软件产业彻底走向世俗化——本来这“殊荣”应该是 JAVA 去背的,但是明显 MS VC#.net 做得更彻底——这也完全符合 BILL GATES 创建 MS 的理念。现在微软也是这么想的——我弱智化程序员有我的道理,对于软件企业来说,人力资源的成本要比机器成本高得多,所以,弱智化程序员,降低程序员门槛,对软件公司来说,将可以创造更大的经济效益。
当然,JAVA 更烂,JAVA 是我见过的最烂的语言。我不才,可能还有更烂的我没见过罢……JAVA 是很能干,但不过是一“民工工具”而已,再能干撑死也就是一“瑞士军刀”,完全的市场化工业化的产物,从语言本身来说,它是最失败的。
F# 依然躲在后面,微软似乎已经开始默认了 C# 的失败,并开始通过引入“函数式编程思想”,尝试着 FP 在软件工业中的实践,有的人认为 F# 的发展不过是为了更加丰富完善 C# 而做的实验而已,但我不这么看,因为我个人认为 C# 失败了。所以换过来说,是 C# 在为 F# 做铺垫,更合理。
我不知道 F# 是否会重蹈 C# 失败的覆辙,至少目前我没有找到比它更符合我要求的语言,我还会继续了解它、使用它。就算它最终依然失败了,我还是会用它,就像我现在还在用着 C# 一样,因为它的确能干,尽管干得很烂——没有最烂,只有更烂,语言,也正在这样不断向前发展着。
以上,就是本人对F#和C#的一些思考。如有雷同,纯属巧合。