什么是 LOP?
LOP,Language – Oriented Programming,面向语言编程,好像 ML 所表达的“元编程”思想一般乍看起来概念很模糊。与其一下子生硬地将之具体化,不如从广义的定义去解释它。
搞明白 LOP 之前需要先理解 DSL,Domain Specific Language 的概念。设计 DSL 是为了解决特定目的的难题,而不像 C# 等是为了普适地解决问题而设计。DSL 一个著名的实践就是 Excel 语言。将两个单元格内容相加,你可以编写如下公式“= A1 + B1”,并不需要指定数据类型、函数或转化程序等。Excel 语言中烙刻着 spreadsheet cell 的概念,使你无需描述 “A1”意味着什么。然而在 C# 里,你必须指明:
- 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# 单元测试的简易库。相比标准写法:
- Assert.IsTrue ( x )
可以将之简化为:
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 使用简单代码描述复杂问题的优势体现在如下三个方面:
- 抽象表述—— F# 使你在代码中描述特定领域概念时,不需要引入新的抽象层。
- 具体表述—— F# 使你可使用其它语言描述问题,然后在 F# 中读取。
- 计算表述—— 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# 是否能实现它的野心,包括微软帝国的野心,我们拭目以待。
评论