大话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#的一些思考。如有雷同,纯属巧合。
大话F#和C#:是否会重蹈C#失败的覆辙?的更多相关文章
- F#周报2019年第7期
新闻 Visual Studio 2019预览版3,F#性能修复 Bolero 0.3发布,HTML模版热加载 Fantomas在线升级至Fantomas 2.9.2 使用F#开发的随机访问Excel ...
- JavaScript RegExp 基础详谈
前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果我们不去真正仔细研究.学习.掌握,而是抱着需要的时 ...
- IOS之Objective-C学习 策略模式
对于策略模式,我个人理解策略模式就是对各种规则的一种封装的方法,而不仅仅是对算法的封装与调用而已.与工厂模式中简单工厂有点类似,但是比简单工厂更有耦合度,因为策略模式以相同的方法调用所有的规则,减少了 ...
- Atitit.阿里云c盘 系统盘爆满解决方案
Atitit.阿里云c盘 系统盘爆满解决方案 Use disk parse tool to scan then C:\widnow/soursce /install.wim 迁移 3g 显示在 ...
- makefile基础(GNU)
makefile的核心 targets : prerequisites ; commands... //不分行的情况 targets : prerequisites ...
- 09_IO流
1. IO(Input Output)流 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作数据分为两种: 字节流和字符流 流按类型分 ...
- C++11带来的优雅语法
C++11带来的优雅语法 自动类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作; auto是在编译时对变量进行了 ...
- 二模 (15)day2
第一题:Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/2p 的概率完成并得到2p−1分,如果完成不了,得0分.一开始每人都是0分,从Alice开始轮流做 ...
- C#转C++的一点分享
前几天看到这样一篇博客<那些年·我们读过的专业书籍>,里面列了很多大家认为很好的书,加上自己在自学C++的工程中也看了不少书,感觉并不是所有的书都值得花时间去看的,毕竟很多人一年下来也看不 ...
随机推荐
- iOS开发——UI篇OC篇&UICollectionView详解+实例
UICollectionView详解+实例 实现步骤: 一.新建两个类 1.继承自UIScrollView的子类,比如HMWaterflowView * 瀑布流显示控件,用来显示所有的瀑布流数据 2. ...
- Java ServletContext 详解
ServletContext, 是一个全局的储存信息的 空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而 servletContex ...
- [012]泛型--lambda表达式捕获
lambda表达式的捕获跟参数差不多,可以是值或者引用. 1.值捕获 与传值参数类似,采用值捕获的前期是变量可以拷贝:与参数不通透的是:被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝. ...
- 如何把 excel 设为文本格式?
选择要设置的单元格,右键选择 --- “设置单元格格式” --- 选 “ 分类 ” 下面的 “ 文本 ” --- 确定. 修改前: 修改后:
- GoF的23个经典设计模式
以文本和思维导图的方式简明扼要的介绍了GoF的23个经典设计模式,可当成学习设计模式的一个小手册,偶尔看一下,说不定会对大师的思想精髓有新的领悟. GoF(“四人帮”,又称Gang of Four,即 ...
- CSS3——选项卡切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- swift和oc区别----属性部分(参考官方swift2.1文档)
对于实用过OC的人来说实用swift上手时非常容易的,swift包括了oc的大部分功能,但是swift毕竟是一门新的编程语言,它和OC还是 有很多不同的地方,而且提供了不少新功能,所以本人在读swif ...
- servlet案例
1.重定向 方式1:在servlet中写:response.setStatus(302); response.setHeader("Location","路径& ...
- CentOS7 service/chkconfig replace commands
对比表,以 apache / httpd 为例 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.serv ...
- Excel导入导出帮助类
/// <summary> /// Excel导入导出帮助类 /// 记得引入 NPOI /// 下载地址 http://npoi.codeplex.com/rele ...