Linux和开源通常与语言设计的前沿联系在一起。 它可能是支持语言开发或平台开放性的可用工具,从而促进了语言设计的发展。 也许是基于开源技术的开放语言(例如GNU Compiler Collection系列,Ruby,Python和Perl)很棒,因为它们邀请并鼓励实验和使用(更不用说Red Hat是Ceylon背后的公司) 。 无论出于何种原因,Linux开发人员都可以使用多种语言,从使用较少的历史语言到最新的尖端产品。
但是在C / C ++的世界中,我们应该关心Java™语言,Scala,Ruby,Python,Perl,Erlang,Lua,Scheme等众多语言的发布,我们是否应该关注针对面向业务的企业软件的新语言的发布?发展? 在许多情况下,答案是否定的,但是让我们探究Red Hat将来的名为Ceylon的语言产品,以了解它是否可以跻身当今最受欢迎的语言之列。
锡兰介绍
锡兰(Ceylon)是盖文·金(Gavin King)领导的红帽项目。 King是Hibernate项目的创始人,该项目是Java语言中的一种持久性解决方案。 尽管King是Java技术的拥护者(它是最早适合大规模开发的语言之一),但他被引述为对该语言有很多挫败感(包括诸如通用语言,仓促设计且晦涩难懂的Standard Edition SDK之类的语言复杂性) ,笨拙的注释语法,损坏的块结构,对XML的依赖等)。
因此,金问了一个问题,从Java语言和SDK的优缺点中汲取的经验教训,一种语言会是什么样? 他的答案是Ceylon,这是一种静态类型的语言,它保留了Java语言的某些最佳功能(并在JVM上运行),但改进了该语言的可读性,内置模块化以及功能语言功能(例如高阶)的合并。功能。 锡兰还结合了C和Smalltalk的功能。 与Java语言很像,这种新语言专注于业务计算,但在其他领域也非常灵活和有用。
有人称Ceylon为“ Java杀手”(也许是由于Java语言的未来问题),但是Ceylon实际上运行在JVM上,因此它是Java技术的扩展,而不是替代。 使用JVM支持Ceylon的执行是一个理想的模型,因为这意味着Ceylon(如Java)可在当前支持JVM的众多体系结构中移植。
锡兰语言功能
如今,大多数语言都无法进行简单的分类,而是代表多种编程风格。 锡兰也不例外。 Ceylon是一种静态类型的语言 (这意味着与在运行时执行类型检查的动态类型语言(例如Lisp)相比,在编译时执行类型检查)。 Ceylon是一种类似于Java语言的面向对象的语言,并且还支持具有典型C语法样式的高阶函数(这意味着函数可以将函数作为输入或输出)。 Java语言不直接支持高阶函数,因此此功能代表了两种语言的独特区别。
但是,有时候,改进更多的是关于语言删除的内容而不是语言添加的内容。 Ceylon简化并删除了Java语言的元素,并以更简单的方案替换了它们。 简化的一个示例是删除public
, protected
和private
关键字。 相反,Ceylon仅包含shared
注释,该注释定义了类的哪些元素在外部可见。 Ceylon还消除了重载的功能,但是使用更简单的语法为此功能提供了一些解决方法(例如默认参数和顺序参数)。
Ceylon包括对继承,序列(数组或列表构造),泛型,命名参数等的支持。 它包括用于运行时类型管理的功能(我们将在下一部分中探索一个示例)。 该语言正在积极开发中,因此最终功能集仍处于开放状态。
锡兰说明
尽管在撰写本文时,尚不存在可公开使用的编译器,但已定义了Ceylon语言的结构,从而允许示例应用程序的开发来探索并推理其使用和可读性。 本节着眼于锡兰的一些示例应用程序,以说明其结构。
你好,世界
我将使用“ Hello World”程序来说明一个简单程序的创建,该程序向显示器发出一个简单的文本字符串。 清单1所示的示例显示了一个名为hello
的顶级方法,该方法使用writeLine
方法向标准输出发出一个字符串。
清单1.锡兰的Hello World程序
doc "Hello World Program"
by "Gavin King"
void hello() {
writeLine( "Hello World." );
}
还要注意用于API文档的注释(类似于doxygen之类的工具),它允许您指定方法和作者(分别是doc
和by
注释)。
锡兰类型
锡兰合并了一组作为普通类实现的传统类型。 这些类型是:
-
Natural
。 无符号整数,包括零 -
Integer
。 有符号整数 -
Float
。 浮点 -
Whole
。 任意精度有符号整数 -
Decimal
。 任意精度和任意刻度小数
默认情况下, Natural
, Integer
和Float
类型为64位,但是您可以使用small
批注来指定32位精度。
锡兰级
由于Ceylon是一种面向对象的语言,因此您可以使用类的概念来编写代码。 类是Ceylon中的一种类型,除了定义初始化类的对象时如何初始化状态的定义外,它还封装了一组操作(称为方法 )和状态( 类构造器,类似于构造函数)。
一个简单的课程将帮助您了解锡兰的方法。 清单2为计数器类提供了一个简单的类。 第2行使用可选值定义了该类,这意味着用户可以提供或不提供它,并且用Type?表示。 模式。 类的主体包含类初始化器,而不是构造函数。 该代码定义了私有变量(除非注释为共享,否则什么都不可见),然后定义初始化逻辑。 首先检查一下起始变量是否存在。 如果是这样,它将用作您的计数的初始值。 您的第一个方法被注释为shared
,因此从类的外部可见,它定义了增量器。 调用时,此方法仅增加您的计数器。
最后,您定义一个getter方法,该方法将当前计数器值返回给用户,以及一个setter方法,该方法使用调用者提供的值来设置当前计数器值。 请注意,此处使用了assign
关键字来创建用于设置计数器值的变量属性。 除了以不同的方式处理构造函数(嵌入在类中的代码)之外,没有解构函数,也没有办法实现多个构造函数(这仅仅是与Java语言的区别之一)。
清单2.锡兰的简单类
01 doc "Simple Counting Class"
02 class Counter( Natural? start ) {
03
04 doc "Class Initializer"
05 variable Natural count := 0;
06 if (exists start) {
07 count := start;
09 }
10
11 doc "The incrementer"
12 shared void increment() {
13 count++;
14 }
15
16 doc "The getter"
17 shared Natural currentValue {
18 return count;
19 }
20
21 doc "The setter"
22 shared assign currentValue {
23 count := currentValue;
24 }
25
26 }
在定义了简单的类之后,让我们看看如何在Ceylon中使用该类。 清单3提供了使用Counter
类的代码块。 它始于将类实例化为cnt
对象。 请注意,锡兰中没有new
关键字。 定义新的Counter
对象后,您可以调用increment
方法,然后使用getter方法发出Counter
值。 请注意, =
和:=
运算符在Ceylon中不同:仅对不可变值使用=
说明符,而使用:=
运算符进行变量赋值。
清单3.使用Counter类
01 Counter cnt = Counter(1);
02 cnt.increment();
03 writeLine( c.currentValue );
锡兰鼓励尽可能使用不可变的属性。 这意味着将使用值初始化对象,而不重新分配对象。 要指定一个命名的值是可变的 (在初始化后可以更改),它必须用variable
注释,如清单2第5行所示。
最后要探讨的要素是锡兰控制结构的关键区别。 请注意,在许多语言中,条件表达式后可以省略大括号( {}
),例如出现单个statement
:
if (cnt > 10) statement();
锡兰禁止使用此语法,并要求使用大括号。 这意味着上面显示的示例代码必须用Ceylon编写为:
if (cnt > 100) { statement(); }
由于这是C
最常见的错误之一,因此是强制使用这种适当样式的令人欢迎的补充。
高阶函数
锡兰(Ceylon)包含了称为一阶函数的编程功能样式。 这仅意味着将函数视为一流对象,并且可以将其用作函数的参数以及从函数中返回。 以King的演示文稿中的示例为例,对repeat
方法的定义(请参见清单4)。 在这种情况下,它需要两个参数:用于重复次数的Natural
值和用于函数调用的方法参数。 在repeat
方法的主体内,您只需创建一个for
循环(使用范围操作)并调用作为功能参数传递的方法。
清单4.锡兰的高阶函数
01 void repeat( Natural times, void hfunction() ) {
02 for (Natural n in 1..times) {
03 hfunction();
04 }
05 }
如清单5的第7行所示,使用此方法很简单。如所示,该方法的名称不带参数。
清单5.在锡兰中使用高阶函数
01 void sayhello() {
02 writeLine( "Hello World." );
03 }
04
05 ...
06
07 repeat( 10, sayhello );
与其他具有功能支持的语言不同,Ceylon不支持匿名函数 (直接在表达式中出现的未命名函数)。 它确实包括对闭包的支持( 闭包本质上是可以引用另一个函数中的状态的函数)。
类型缩小
Ceylon不包含Java语言中的instanceof
运算符; Ceylon实现了所谓的类型缩小,该类型缩小用于一步测试和缩小对象引用的类型。 考虑清单6中的以下代码段。该代码使用特殊的(is ... )
结构来测试对给定类型的对象引用。 一旦识别出类型,便使用特定于类型的方法。 这个构造类似于清单2前面关于可选参数的(exists ...)
构造。
清单6. Ceylon中的类型缩小
01 Object obj = <some object>;
02
03 switch (obj)
04
05 case (is Counter) {
06 obj.increment();
07 }
08 case (is ComplexCounter) {
09 obj.incrementBy(1);
10 }
11 else {
12 stream.writeLine("Unknown object");
13 }
Ceylon包含另一个定义为(nonempty ...)
相似构造,您可以将其应用于序列(数组或列表)以确定该序列是否不包含任何元素,因此可能未对其应用序列操作。
最后,请注意Ceylon中switch
语句的语法,这与C语言和Java语言都不同。 在这两种语言容易出错的情况下,Ceylon强制对用例使用块结构,并优先于else
块删除default
例。 Ceylon还确保(在编译时) switch
语句包含详尽的实例测试列表,或者至少包含else
子句以提供完整的覆盖范围。 如果未涵盖实例,则编译器会自动检查这些switch
语句并生成错误。
其他控制结构
正如您所期望的那样,Ceylon实现了传统的if...else
语句,并且还实现了Java语言的异常处理功能( try
, catch
, finally
)。 锡兰还创建了所谓的fail
块,该块与for
循环一起使用,以识别何时不会过早损坏。 考虑清单7中所示的示例。
清单7.说明锡兰的故障块
01 for (Instrument i in instruments) {
02 if (i.failing()) {
03 break;
04 }
05 }
06 fail {
07 // All instruments are working...
08 }
这是C语言和Java语言中的常见设计模式,因此是对Ceylon的有用补充。
锡兰的未来
正如King所说,Ceylon是社区的一项工作,因此需要软件工程师和测试人员来帮助设计,构建和验证语言和SDK。 该电话会议可能会鼓励Java语言用户提供反馈,以帮助支持他们从该语言到锡兰的迁移。 金仍然对锡兰的现状保持沉默,只说存在语言规范以及ANTLR(另一种语言识别工具)语法。
向前走
尽管有些人可能会挑战使用一种新语言的必要性,但查看语言的另一种方法是作为一组可用于解决问题的工具。 并非每种语言都适合或适合任何给定的问题,但是某些语言很适合特定的解决方案领域。 因此,提供多种语言是一种福气,而不是诅咒。 由于Ceylon仍在开发中,因此是否会在当今使用的流行语言中找到一席之地仍是未知数。 但是该语言捕获了足够有趣的功能,当它最终出现时,对其进行进一步的探索将很有趣。
翻译自: https://www.ibm.com/developerworks/opensource/library/l-ceylon/index.html