锡兰:真正的进步,还是只是另一种语言?

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语言的元素,并以更简单的方案替换了它们。 简化的一个示例是删除publicprotectedprivate关键字。 相反,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之类的工具),它允许您指定方法和作者(分别是docby注释)。

锡兰类型

锡兰合并了一组作为普通类实现的传统类型。 这些类型是:

  • Natural 无符号整数,包括零
  • Integer 有符号整数
  • Float 浮点
  • Whole 任意精度有符号整数
  • Decimal 任意精度和任意刻度小数

默认情况下, NaturalIntegerFloat类型为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语言的异常处理功能( trycatchfinally )。 锡兰还创建了所谓的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值