dhloveyzk(
网学)贡献
近几年来,在 TIOBE 公司每个月发布的编程语言排行榜[1]中,C#总是能挤 进前 10 名,而在近 10 年的编程语言排行榜中,C#总体上呈现上升的趋势。C# 能取得这样的成绩,有很多因素在起作用,其中,它在语言特性上的锐意进取让 人印象深刻(图 1)。
▲ 2010 年发布的 C# 4,最大的创新点是拥有了动态编程语言的特性。 1 动态编程语言的中兴 动态编程语言并非什么新鲜事物,早在面向对象编程语言成为主流之前,人 们就已经使用动态编程语言来开发了。即使在 Java、C#、C++等面向对象编程语 言繁荣兴旺、大行于世的年代,动态编程语言也在“悄悄”地攻城掠地,占据了 相当的开发领域,比如
JavaScript 业已成为 Web 客户端事实上的主流语言。 最近这几年,动态编程语言变得日益流行,比如 Python、Ruby 都非常活跃, 使用者众多。 这里有一个问题, 为什么我们需要在开发中应用动态编程语言?与 C#和 Java 这类已经非常成熟且功能强大的静态类型编程语言相比,动态编程语言有何优 势? 简单地说,使用动态编程语言开发拥有以下的特性: (1)支持 REPL(Read-evaluate-print Loop:“读入à执行à输出”循环迭代) 的开发模式,整个过程简洁明了,直指
问题的核心。 举个简单的例子, 2 所示为使用 IronPython[2]编程计算 图 “1+2+……+100” 的屏幕截图,我们可以快速地输入一段完成累加求和的代码,然后马上就可以看 到结果:
▲ 图 2 使用 IronPython 编程 如果使用 C#开发就麻烦多了,您得先用 Visual Studio 创建一个项目,然 后向其中添加一个类,在类中写一个方法完成求和的功能,再编写调用这一方法 的代码,编译、排错,最后才能得到所需的结果…… 很明显,对于那些短小的工作任务而言,动态编程语言所具备的这种 REPL 开发模式具有很大的吸引力。 (2)扩展方便。用户可以随时对代码进行调整,需要什么功能直接往动态对 象上“加”就是了,不要时又可以移除它们。而且这种修改可以马上生效,并不 需要像 C#那样必须先修改类型的定义和声明,编译之后新方法才可用。 换句话说:使用动态语言编程,不需要“重量级”的 OOAD,整个开发过程 迭代迅速而从不拖泥带水。 (3)动态编程语言的类型解析是在运行时完成的,可以省去许多不必要的类 型转换代码,因此,与静态编程语相比,动态编程语言写的代码往往更紧凑,量 更少。 动态编程语言主要的弱点有两个: (1)代码中的许多错误要等到运行时才能发现,而且需要特定的运行环境支 持,对
其进行测试不太方便,也不支持许多用于提升代码质量的各种
软件工程工 具,因此不太适合于开发规模较大的、包容复杂处理逻辑的应用系统。 (2)与静态编程语言相比,动态编程语言编写的程序性能较低。不过随着计 算机软硬件技术的不断进步,比如多核 CPU 的广泛应用,动态编程语言引擎和运 行环境不断地优化,动态编程语言编写的程序性能在不断地提升,在特定的应用 场景下,甚至可以逼近静态语言编写的程序。 拥抱“动态编程” 2 拥抱“动态编程”特性的 C# 4
为了让 C#、 Visual Basic 等.NET 编程语言能具备动态编程语言的特性, .NET 4.0 引入了一个“DLR(Dynamic Language Runtime:动态语言运行时)”(图 3)。
▲ DLR 运行于 CLR 之上,提供了一个动态语言的运行环境,从而允许 Python、 Ruby 等动态语言编写的程序在.NET 平台上运行,同时,现有的.NET 静态类型编 程语言,比如 C#和 Visual Basic,也可以利用 DLR 而拥有一些动态编程语言的 特性。 (1)使用 (1)使用 C# 4 编写动态的代码 C# 4 新增了一个 dynamic 关键字,可以用它来编写“动态”的代码。 例如, 以下代码创建了一个 ExpandoObject 对象(注意必须定义为 dynamic): dynamic dynamicObj = new ExpandoObject();
这一对象的奇特之处在于,我们