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#的一些思考。如有雷同,纯属巧合。

大话F#和C#:是否会重蹈C#失败的覆辙?的更多相关文章

  1. F#周报2019年第7期

    新闻 Visual Studio 2019预览版3,F#性能修复 Bolero 0.3发布,HTML模版热加载 Fantomas在线升级至Fantomas 2.9.2 使用F#开发的随机访问Excel ...

  2. JavaScript RegExp 基础详谈

    前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果我们不去真正仔细研究.学习.掌握,而是抱着需要的时 ...

  3. IOS之Objective-C学习 策略模式

    对于策略模式,我个人理解策略模式就是对各种规则的一种封装的方法,而不仅仅是对算法的封装与调用而已.与工厂模式中简单工厂有点类似,但是比简单工厂更有耦合度,因为策略模式以相同的方法调用所有的规则,减少了 ...

  4. Atitit.阿里云c盘 系统盘爆满解决方案

    Atitit.阿里云c盘 系统盘爆满解决方案 Use disk parse tool to scan then C:\widnow/soursce /install.wim   迁移  3g 显示在 ...

  5. makefile基础(GNU)

    makefile的核心 targets : prerequisites ; commands...   //不分行的情况 targets : prerequisites                 ...

  6. 09_IO流

    1. IO(Input Output)流 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作数据分为两种: 字节流和字符流 流按类型分 ...

  7. C++11带来的优雅语法

    C++11带来的优雅语法 自动类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作; auto是在编译时对变量进行了 ...

  8. 二模 (15)day2

    第一题:Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/2p 的概率完成并得到2p−1分,如果完成不了,得0分.一开始每人都是0分,从Alice开始轮流做 ...

  9. C#转C++的一点分享

    前几天看到这样一篇博客<那些年·我们读过的专业书籍>,里面列了很多大家认为很好的书,加上自己在自学C++的工程中也看了不少书,感觉并不是所有的书都值得花时间去看的,毕竟很多人一年下来也看不 ...

随机推荐

  1. iOS开发——网络编程OC篇&Socket编程

    Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作 ...

  2. Unity手游之路&lt;七&gt;角色控制器

    我们要控制角色的移动,能够所有细节都由自己来实现.控制角色模型的移动,同一时候移动摄影机,改变视角.当然Unity也提供了一些组件,能够让我们做更少的工作,实现我们所期望的功能.今天我们就一起系统来学 ...

  3. 图片轮换cycle插件的运用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Android Settings 导入eclipse

    1.加载源码 Android Project from Existing Code 选择源码工程Settings: 2.加载所需要的jar包 (改下名字) out/target/common/obj/ ...

  5. MyDetailedOS

    http://njumdl.sinaapp.com/ https://github.com/mudongliang

  6. [原创]VS2013 EF6连接MySql需要几步?

    精简的美丽...... 1.安装mysql server下载地址 http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.21-winx64.zip注意: ...

  7. 《RESTful Web Services》第二章 识别资源

    引言:开放RESTful Web服务的首要步骤之一是设计资源模型. 2.1 如何从领域名词中识别资源   2.2 如何选择资源粒度     一些因素会影响数据库表和对象模型的设计,例如领域建模.需要高 ...

  8. PAT 1006

    1006. Sign In and Sign Out (25) At the beginning of every day, the first person who signs in the com ...

  9. iOS9横竖屏设置的处理方法

    在一般的视频类APP播放的时候都会支持横屏,这样做的好处就是便于观看.你的项目中支持横屏吗?我们一起了解一下,在iOS9中横竖屏设置的处理方法吧! 支持横竖屏配置 在iOS6以后,如果APP需要支持横 ...

  10. Android自定义标题TitleView

    Android开发过程中,经常遇到一个项目需要重复的定义相同样式的标题栏,Android相继推出了actionBar, toolBar, 相信有用到的朋友也会遇到一些不如意的时候,比如标题栏居中时,需 ...