正文

F# 中的 LOP ——“面向语言编程”2012-01-15 09:21:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/iamben250/53145.html

分享到:

   http://blog.csdn.net/hikaliv/article/details/4420391
 又一次谈到 F#。话说,听说过“面向对像”,那“面向语言”是什么玩儿?只听说过“面向对像的语言”,难道说还有“面向语言的语言”?
      我个人觉得“面向某某”与其非要形像化成某种语言,不如将之抽象成一种不受语言约束的思想。语言可以对“面向某某”的思想进行支持和实践,而不要受其桎梏。像 C#.net 这种,“专为面向对像而设计的语言”最终是失败的,残酷的现实已经逼得 C# 不得不每升级一次版本,就完成一次“变态”,结果现在的 C# 就是一个大变态,四不像。
      那 F# 呢?在这方面 F# 会重蹈覆辙吗?源自伟大的 ML,经由 Objective Caml 而派生出的 F#,立志通过“面向语言”理念这条新的途径实现 C# 之力所不及的微软的野心——整合、垄断并统治整个软件工业,显然,微软已然默认了变态的 C# 的彻底失败。C# 依然在不断完善,但它的变化更像是一种挣扎,给自己一种活下去的理由而已,它的变化是一种变态。C# 已经不再是微软战略的中坚,而在不知不觉中完成了新战略实验田的转变。C# 在为谁做实验?F# 么?
      哈哈,微软曾主打 VB,后来微软改为主打 C#.net,于是 VB.net 成为了 C# 的实验田,如今,C# 却又要为它人保驾护航了,哈哈……飞鸟尽,良弓藏;狡兔死,走狗烹!到底是微软帝国,Microsoft Empire,办的那事儿,也像一个皇帝治国之术……
      既然微软对 F# 如此下本儿,我们就来好好认识一下 F# 的 Features 吧,先从 LOP 说起。

      什么是 LOP?

       LOP,Language – Oriented Programming,面向语言编程,好像 ML 所表达的“元编程”思想一般乍看起来概念很模糊。与其一下子生硬地将之具体化,不如从广义的定义去解释它。

       搞明白 LOP 之前需要先理解 DSL,Domain Specific Language 的概念。设计 DSL 是为了解决特定目的的难题,而不像 C# 等是为了普适地解决问题而设计。DSL 一个著名的实践就是 Excel 语言。将两个单元格内容相加,你可以编写如下公式“= A1 + B1”,并不需要指定数据类型、函数或转化程序等。Excel 语言中烙刻着 spreadsheet cell 的概念,使你无需描述 “A1”意味着什么。然而在 C# 里,你必须指明:

[c-sharp] view plaincopy
  1. MasterSheet.GetCell(new CellObject(Row=“A”, Column=1));  

       DSL 的主要优势在于其代码相较 C# 等普适编程语言而言极其简练。使用 DSL 可使你摆脱在某一架构内表达思想的编程模式,比如 C# 中你就不得不严格地在类中写代码。DSL 之所以能做到这一点,是由于所有的问题领域的关键概念都已被刻进语言之中,无需你自己建模。

       但 DSL 语言有两大硬伤。首先,从使用者的角度来说, DSL 使你不得不学习一门新语言,因为省去你自己建模的代价就是你不得不了解它为你准备好的关键模型,比如 matlab 的矩阵模型,mathematica 的符号模型等。再者,从发明者的角度来说,DSL 使你不得不创造出一门新语言用以描述你的模型,并费力地编写编译器。倘若涉及到描述某个公司的整个业务规范这样复杂的问题时,DSL 的硬伤就很致命了。

       好了,DSL 说得已经够多了。那 LOP 呢?先引用 Google Code 上面 FsUnit 项目来举个例子吧。FsUnit 是一个用以编写 F# 单元测试的简易库。相比标准写法:

[c-sharp] view plaincopy
  1. Assert.IsTrue ( x )  

       可以将之简化为:

c1

       FsUnit 可使你使用不同的人类语言中的单词和概念编写 F# 代码,这里示例以英语。由此,引出 LOP 的定义:

       Language - Oriented Programming is a style of programming that tries to produce code that looks like it came from a Domain Specific Language but is still valid in a general purpose programming language.

       此定义引用  F# 大拿 Chris Smith 的表述。

       F# 中的 LOP 使用简单代码描述复杂问题的优势体现在如下三个方面:

  1. 抽象表述—— F# 使你在代码中描述特定领域概念时,不需要引入新的抽象层
  2. 具体表述—— F# 使你可使用其它语言描述问题,然后在 F# 中读取。
  3. 计算表述—— F# 使你使用其它语言编码处理本地概念时,不需要借用第三者更专业化的语言。

       依上所述三点,似乎 F# 中的 LOP 在尝试肩负起 .net framework 之力所不及的使命。而讽刺的是,Microsoft F#.net 却是基于 .net framework 的。截止发此稿之日止,Microsoft F#.net 已升级至 1.9.6 19 版,基于 .net framework 2.0 架构,捆绑在 VS 2010 和 .net framework 4.0 beta1 平台上。预测等 F#.net 正式推出时,将架构在 .net framework 4.0 之上。F# 今后的路到底怎么走,是否比 C# 活得还长,F# 是否能实现它的野心,包括微软帝国的野心,我们拭目以待。

阅读(1957) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册