作者:M.蒂姆·琼斯 2011-07-21 14:17:15 Ceylon 是 Red Hat 的一个新项目,由 Gavin King 领导。 King 是 Hibernate 项目的创始人,Hibernate 项目是 Java 语言中的持久性解决方案。 通往计算机科学的道路上布满了“下一件大事”的外壳。尽管许多小众语言确实在脚本或特定应用程序中找到了一些用处,但 C(及其衍生产品)和 Java 语言很难替代。然而,Red Hat 的 Ceylon 似乎是一些语言功能的有趣组合。它使用众所周知的C风格语法,但除了强调简单性之外,它还提供了面向对象和一些有用的函数支持。看看 Ceylon,看看这种未来的 VM 语言能否在企业级软件开发中找到自己的位置。 Linux和开源往往与最前沿的语言设计有一定的关系,可能是支持语言开发的工具,也可能是平台的开放性促进了语言设计的进步。或者可能是基于开源技术的开放语言(例如 GNU 编译器集合、Ruby、Python 和 Perl)很棒,因为它们欢迎并鼓励实验(更不用说 Red Hat 是 Ceylon 背后的公司)公司)。无论出于何种原因,Linux 开发人员都可以使用多种语言,从较少使用的语言到较旧的语言,再到最新和最优秀的语言。 但在 C/C++、Java™、Scala、Ruby、Python、Perl、Erlang、Lua、Scheme 和许多其他语言的世界中,有必要关心专门用于面向业务的企业软件开发的系统。是否宣布了新语言?在很多情况下,答案是否定的。但让我们看一下红帽为未来提供的一种名为 Ceylon 的语言,看看它是否可以跻身当今最流行语言的行列。 锡兰不是爪哇 “Ceylon 不是 Java。它是一种深受 Java 影响的新语言。它是由一些 Java 爱好者设计的。他们认为没有什么问题。Java 不会立即过时,所以没有人可以杀死它。 问题。” -加文·金 锡兰简介 Ceylon 是 Red Hat 的一个新项目,由 Gavin King 领导。King 是 Hibernate 项目的创始人,Hibernate 项目是 Java 语言中的持久性解决方案。尽管 King 是 Java 技术(第一种适合大规模开发的语言)的粉丝,但他表示该语言有一些令人沮丧的方面(包括泛型等语言的复杂性)。 、设计松散且晦涩难懂的标准版 SDK、笨拙的注释语法、损坏的块结构、XML 依赖项等)。 于是 King 提出了一个问题,在吸取了 Java 语言和 SDK 的优缺点的一些教训之后,该语言应该是什么样子?他的答案是 Ceylon,这是一种静态类型语言,保留了 Java 语言和 Python(也在 JVM 上运行)的一些最佳功能,但在语言可读性、内置模块化性以及包含函数式语言功能(例如高阶函数。 Ceylon也采用了C和Smalltalk的一些特性,但它更像Java语言。这种新语言专注于商业计算,但它也很灵活,可以用于其他领域。 有人称 Ceylon 为“Java 杀手”(或许是因为 Java 语言的未来),但实际上 Ceylon 运行在 JVM 上,因此它是 Java 技术的扩展而不是替代品。使用 JVM 来支持 Ceylon 的执行是一种理想的模型,因为这意味着 Ceylon(与 Java 一样)可以跨当前支持 JVM 的各种体系结构进行移植。 锡兰语言特点 如今大多数语言不再坚持简单的分类,而是体现出多种编程风格,Ceylon 也不例外。 Ceylon 是一种静态类型语言(即在编译时进行类型检查,对应于 Lisp 等动态类型语言,在运行时进行类型检查)。 Ceylon 是一种面向对象的语言,类似于 Java 语言。它还使用典型的C语法风格来支持高阶函数(即函数可以使用其他函数作为输入和输出)。 Java 语言不直接支持高阶函数,因此此功能代表了两种语言之间的独特差异。 然而,有时,改进更多地指的是一种语言删除了什么而不是添加了什么。 Ceylon 简化并删除了 Java 语言的一些元素,用更简单的解决方案替换它们。简化的一个例子是删除 public、protected 和 private 关键字。 Ceylon 的替代方案是仅包含一个共享注释,该注释定义类的哪些元素是外部可见的。 Ceylon 还删除了重载功能,但使用更简单的语法为此功能(例如默认和有序参数)提供了一些解决方法。 Ceylon 包括对继承、序列(数组或列表构造)、泛型、命名参数等的支持。它包括一些运行时类型管理的功能(我们将在下一节中查看一个示例)。该语言目前正在积极开发中,因此其最终功能仍然开放。 锡兰的例子 尽管在撰写本文时还不存在公开可用的编译器,但 Ceylon 语言的结构已经定义,以便可以通过开发一些简单的应用程序来研究和考虑其用法和可读性。本节将介绍一些用 Ceylon 编写的示例应用程序来说明其结构。 你好世界 我将使用“Hello World”程序来说明如何创建一个在显示界面上呈现简单文本字符串的简单程序。清单 1 中给出的示例显示了一个名为 hello 的顶级方法,该方法使用 writeLine 方法将字符串发送到标准输出。 清单 1. 用 Ceylon 编写的 Hello World 程序 doc“Hello World 程序”,作者:“Gavin King” void hello() { writeLine(“Hello World.”); } 需要注意的一件事是,API 文档中也使用了注释(类似于 doxygen 等工具),它允许您描述方法和作者(分别为 doc 和 by 注释)。 锡兰的类型 Ceylon 使用一组传统的类型,它们作为普通类实现。这些类型包括: 自然:无符号整数,包括零 整数:有符号整数 float:浮点数 Whole:任意精度有符号整数 小数:具有任意精度和任意小数位的十进制数 默认情况下,Natural、Integer 和 Float 类型都是 64 位,但您可以用small 注释它们以指示 32 位精度。 锡兰班 Ceylon 是一种面向对象的语言,您使用类的概念来编写代码。在Ceylon中,类是一种封装了一组操作(称为方法)和状态的类型,并定义了当类的对象初始化时如何初始化状态(class Initializer(类初始化器,类似于构造函数)。 一个简单的例子将帮助您理解 Ceylon 的方法。清单 2 提供了一个简单的计数器类。清单 2 使用可选值来定义类,这意味着用户可以提供也可以不提供该值。它使用类型? (类型?) 模式来指示 。类主体包含类初始值设定项而不是构造函数。此代码定义私有变量(除非注释为共享,否则不可见),然后定义初始化逻辑。首先检查 start 变量是否存在。如果是,则将其用作计数的初始值。您的第一个方法被注释为共享,因此从类外部可见,它定义了增量器。调用时,此方法只会增加您的计数器。 最后,定义一个 getter 方法将当前计数器值返回给用户,并定义一个 setter 方法将当前计数器值设置为调用者提供的值。需要注意的是,这里使用了assign关键字来创建一个用于设置计数器值的变量属性。除了对构造函数的处理不同(代码嵌入类内部)之外,类没有析构函数,也没有提供实现多个构造函数的方法(这只是与Java语言的区别之一)。清单 2. 使用 Ceylon 编写的简单类 doc "简单计数类" class Counter( Natural? start ) { doc "类初始化器" 变量 Natural count := 0; if (存在开始) { 计数 := 开始; } doc“增量器”shared voidincrement() { count++ ; } doc“吸气剂”共享自然电流值{返回计数; } doc“setter”共享分配 currentValue { count := currentValue; } } 定义了这个简单的类,让我们看看如何在 Ceylon 中使用这个类。清单 3 提供了一段使用 Counter 类的代码。它首先实例化该类的 cnt 对象。您可以注意到 Ceylon 中没有 new 关键字。定义新的Counter对象后,调用increment方法,然后使用getter方法输出Counter值。需要注意的是,在 Ceylon 中,= 和 := 运算符是不同的:= 限定符只能用于不可变值,而变量赋值是使用 := 运算符执行的。 清单 3. 使用 Counter 类 计数器 cnt = 计数器(1); cnt.increment(); writeLine( c.currentValue ); Ceylon 鼓励尽可能使用不可变属性,这意味着用值初始化的对象不会再次被分配值。要指示命名变量是可变的(可以在初始化后更改),必须使用变量注释对其进行注释,如清单 2 的第 5 行所示。 最后要检查的一项是锡兰控制结构的主要差异。您应该注意,在许多语言中,条件表达式后面的花括号 ({}) 可以省略,例如,如果只出现单个语句: if (cnt > 10) 语句(); Ceylon 不允许这种语法,它需要大括号,也就是说,上面的示例代码在 Ceylon 中会这样写: if (cnt > 100) { 语句(); } 因为这是 C 语言中最常见的错误之一,所以专门强制执行这种正确的样式是可以接受的。 #p# 高阶函数 Ceylon 包含一种称为一阶函数的函数式编程风格,简单来说就是函数被视为第一类对象,可以用作函数的参数,并且可以从函数返回。请考虑 King 提供的有关重复方法定义的演示示例(参见清单 4)。在这种情况下,该方法采用两个参数:自然作为重复次数,以及要调用的函数的方法参数。 Repeat 方法的方法体只是创建一个 for 循环(使用范围操作),然后调用作为函数参数传入的方法。 清单 4. Ceylon 中的高阶函数 void Repeat(Natural times, void hfunction()) { for (Natural n in 1..times) { hfunction(); } } } 该方法的用法很简单,如清单 5 的第 7 行所示,使用不带参数的方法名称。清单 5. 在 Ceylon 中使用高阶函数 void sayhello() { writeLine( "Hello World。" ); } ...重复(10,说你好); 与其他语言提供的函数支持不同,Ceylon 不支持匿名函数(直接出现在表达式中的无名函数),但它确实支持闭包(本质上是可以引用另一个函数中状态的函数) 类型缩小 Ceylon不包含Java语言中出现的instanceof运算符;它也不包含 C 语言中的类型转换。相反,Ceylon 实现了所谓的类型缩小,该方法用于一步测试并缩小对象引用的类型。请考虑清单 6 中的以下代码片段,它使用特殊的 (is...) 构造来测试对象引用是否属于给定类型。如果确定了类型,则调用特定于类型的方法。该构造类似于您之前在清单 2 中看到的用于说明可选参数的构造(存在...)。 清单 6. Ceylon 中的类型缩小 对象 obj = ; switch (obj) case (is Counter) { obj.increment(); } case (是 ComplexCounter) { obj.incrementBy(1 ); }   else { stream.writeLine("未知对象"); } Ceylon 包含另一个类似的构造,定义为 (nonempty...),您可以将其应用于序列(数组或列表)来确定该序列是否不包含任何元素,因此您不必在其之上执行操作。 最后需要注意的一点是,Ceylon 的 switch 语句的语法与 C 和 Java 语言都不同。该语句在两种语言中都容易出错。 Ceylon 强制在 case 上使用块结构,并删除默认 case 并将其替换为 else 块。Ceylon 还确保(在编译时)switch 语句包含实例测试的详尽列表,或者至少有一个 else 语句来提供完整的覆盖范围。编译器会自动检查这些 switch 语句,如果未覆盖任何实例,则会生成错误。 其他控制结构 正如您所期望的,Ceylon 实现了传统的 if...else 语句,并且还实现了 Java 语言的异常处理功能(try、catch、finally)。 Ceylon 还创建了所谓的失败块,它与 for 循环一起使用来识别循环何时过早中断。考虑清单 7 中所示的示例。 清单 7. Ceylon 的失败块的图示 for (仪器中的仪器 i) { if (i.failing()) { 中断; } } 失败 { // 采取一些行动... } 这是 C 和 Java 语言中的常见设计模式,因此它是对 Ceylon 的有用补充。 锡兰的前景 正如 King 所说,Ceylon 是社区的成果,因此需要软件工程师和测试人员来帮助设计、构建和验证语言和 SDK。此号召性用语鼓励 Java 语言用户提供反馈,以帮助支持他们从该语言迁移到锡兰。 King 对 Ceylon 的现状保持沉默,只表示语言规范和 ANTLR(另一种语言识别工具)语法已经存在。 展望未来 虽然有些人质疑是否需要一种新语言,但看待语言的另一种方式是将其视为一组用于解决问题的工具。并非每种语言都是针对任何给定问题的合适或理想的解决方案,但某些语言非常适合特定的解决方案领域;因此,拥有多种语言是一件好事,而不是一件坏事。由于Ceylon仍处于开发阶段,因此能否在目前使用的主流语言中找到一席之地还是未知数。但这种语言引起了足够的兴趣,当它最终出现时,进一步研究它将会很有趣。原文:http://www.sxzhongrui.com/developerworks/cn/linux/l-ceylon/ 【编辑精选】 Perl、PHP、Python、Java 和 Ruby 比较 C++程序员必读:让你的代码更强大 主要.Net IOC框架性能测试对比 Ruby之父出任Heroku首席架构师,推广Ruby云计算应用 中国编程:程序员,你等不及了