本专栏专门介绍编程语言,但您会发现有时语言理念不需要直接进行修改就可以转换成其他语言,这 一点很有意思。
Microsoft Research 语言 C-Omega 就是这样的一个例子,该语言有时简写为 Cw,因为希腊语 Omega 符号看起来很像 US 键盘布局上的小写字母 w。C-Omega 除引入了许多数据统一和代码统一概念 (可最终作为 LINQ 转换为 C# 和 Visual Basic 语言)之外,还提供了一种新的名为“chords”的并 发方法,可将 C-Omega 保存到 Joins 库中。虽然在撰写本文时,Joins 产品尚未推出,但整个 chords 并发概念可通过某个库进行提供,这意味着任何普通的 C# 或 Visual Basic(或其他 .NET 语言)程序 都可以利用此概念。
除了此概念外,还提供了一个 Code Contracts 工具。契约式设计是一种语言功能,在 Eiffel 等语 言中起到了显著作用,该功能最初通过 Microsoft Research 语言 Spec# 应用于 .NET。类似类型的契 约式保证系统也是通过 Microsoft Research 引入的,其中包括我最喜欢的产品之一 Fugue,它利用自 定义属性和静态分析检查客户端代码是否正确。
再次重申,尽管 Code Contracts 尚未作为正式产品发布,也没有获得允许在生产软件中使用的许可 证,但它作为一种库而不是一种独立的语言存在,本身就意味两层含义。首先,在理论上,Code Contracts 可由任何 .NET 开发人员作为库编写,这足够说明具有类似的功能。其次,该产品提到的功 能(假定确实具有这些功能)可用于各种语言,包括 C# 和 Visual Basic。
如果您嗅到了一丝主题的气息,那么您猜对了!本月,我要重点介绍一个最近发布的源于多语言世界 的库:软件事务内存或 STM。STM.NET 库可通过 DevLabs 网站下载,但与我提到的其他一些实现大相径 庭的是,它不是一个独立的库,不可以链接到程序或作为静态分析工具运行,从整体看,它是 .NET 基 类库的一个替代和补充等。
但是请注意,STM.NET 的当前实现与当前 Visual Studio 2010 Beta 的兼容性不是很理想,所以在 这种情况下,您所关心的有关在计算机上安装未完成的/Beta/CTP 软件的常见免责声明,一定要加倍注 意。该产品应该与 Visual Studio 2008 一起安装,但我仍不会将其安装在您的工作机上。下面是另一 个示例,其中 Virtual PC 是您主要使用的工具。
入门
虽然 STM.NET 综合了多种不同的语言,但 STM 的概念非常直观并易于理解:并非强制开发人员重点 研究实现操作并发的方法,如锁定等,而是允许他们在具备特定的支持并发特性时标记应该执行哪部分 代码,并在必要时使用语言工具(编译器或解释器)管理锁定。换句话说,STM.NET 与数据库管理员和 用户的性质一样,可使程序员使用 ACID 样式的事务性语义标记代码,并将管理锁定的单调工作留给基 础环境。
虽然 STM.NET 可能看起来只是管理并发的另一种尝试,但实际上 STM 的作用远不止这些,它尝试将 数据库 ACID 事务的全部四种特质引入内存编程模型。除了代表程序员对锁定进行管理外,STM 模型还 提供了原子性、一致性、隔离和持续性,无论同时存在多个执行线程,单凭这些特性就可使编程更简单 。
下面以伪代码(已屡见不鲜)为例,请注意这种情况:
BankTransfer(Account from, Account to, int amount) {
from.Debit(amount);
to.Credit(amount);
}
如果 Credit 失败并引发一个异常,将出现什么情况?如果来源帐户的借方仍有记录,而贷方却没有 相应进项,显然用户会很不乐意,此时开发人员就得去补救了:
BankTransfer(Account from, Account to, int amount) {
int originalFromAmount = from.Amount;
int originalToAmount = to.Amount;
try {
from.Debit(amount);
to.Credit(amount);
}
catch (Exception x) {
from.Amount = originalFromAmount;
to.Amount = originalToAmount;
}
}