A.5 Ceylon

Ceylon也是一种面向对象的静态类型语言,由对Java及其生态系统有深入了解的Red Hat公司开发。与本书介绍的其他一些语言一样,除JVM外,Ceylon也可将代码编译为其他目标;例如,可将Ceylon代码编译为客户端JavaScript代码(以便在Web浏览器中运行)或服务器端JavaScript代码(使用Node.js)。

Ceylon提供的功能与Kotlin很像;它们都是静态类型语言,都在面向对象的同时提供了函数式编程功能,而且都提供了一个确保null安全的类型系统。Ceylon特有的一种功能是支持模块化应用程序。Java 9引入了新的模块系统Jigsaw,而Ceylon支持模块系统JBoss。

A.5 Ceylon - 图1 JBoss是Red Hat的一家子公司,因此它选择这个模块系统就没什么可奇怪的了。在Red Hat推出的Java EE应用程序服务器WildFly和相关的产品中,大量地使用了JBoss模块。

Ceylon网站的地址为http://ceylon-lang.org

要让Eclipse支持Ceylon,可通过Eclipse Marketplace安装Ceylon IDE插件:

A.5 Ceylon - 图2

A.5.1 Ceylon的模块系统

虽然在第9版之前,Java和JVM一直没有内置的模板系统,但它们支持JAR文件。第2章说过,单个JAR文件可包含多个类文件,模块系统又能添加什么功能呢?JAR文件缺少的一项重要功能是,定义版本信息和依赖。

为改变这种状况,构建工具Apache Maven定义了一个XML对象模型,让库(它们通常是以JAR文件的方式发布的)能够指定其依赖。如果库在Maven文件build.xml中指定了依赖,Maven(或其他带依赖管理器的构建工具,如Gradle)将下载这些依赖(包括这些依赖的依赖),并将它们都放到项目的类路径中。

然而,成熟的模块系统还有其他功能。在良好的模块系统中,应该能够指定要向模块的使用者暴露哪些代码。对于仅供内部使用的代码,应禁止从外部使用它们。虽然Java支持将类的成员声明为私有的,但无法隐藏公有类(应该让其他包能够使用的类),即便这些类是仅供当前模块内部使用的。

Ceylon内置的模块系统支持存储版本信息、指定依赖,并为类在模块外部的可见性方面提供了大得多的控制权。另外,Ceylon开发小组还维护着一个免费的在线仓库——Ceylon Herd,你可通过它下载和分享Ceylon模块。Ceylon编译器和工具全面集成了其模块系统;实际上,Ceylon JVM编译器不会将代码编译为不同的类文件,而总是为项目创建一个模块。

A.5.2 运行Ceylon

当前,Ceylon没有自带REPL,但你可使用Ceylon网站(http://try.ceylon-lang.org)提供的在线REPL。

A.5 Ceylon - 图3