Ceylon語言

Ceylon語言

Ceylon是一種新興的計算機程式語言,號稱“Java殺手”,它不是Java,而是一種受Java影響的新語言。

基本介紹

  • 中文名:Ceylon語言
  • 外文名:Ceylon Lang
  • 號稱:Java殺手
  • 類型:新興的計算機程式語言
  • 特點:安全性更高
語言特性,相關技術,示例代碼,Hello World,Ceylon的類,學習資料,

語言特性

Ceylon語言支持功能強大的類型系統,在設計時它考慮到了以下限制:所有類型在類型系統內部都必須是可表達的(沒有特殊的 primitive類型或者複合類型);Ceylon的通用類型系統要比Java的更簡單,而且相比於其他類Java語言,它的安全性更高;甚至元編程(reflection)也必須是類型安全的;另外,Ceylon必須是在JVM上執行,而且可以和Java互動操作。

相關技術

Red Hat正在秘密籌劃“Java殺手”Ceylon
Hibernate項目、Java EE 5套用框架Seam的創始人,來自紅帽(Red Hat)的Gavin King最近透露了他過去兩年從事的超級機密項目,一種設計替代Java的新語言和SDK。Gavin King在上周日QCon北京2011大會上演講了“Ceylon項目——下一代Java語言?”。Gavin King在演講中表示,Java語言和開發平台的出現,絕對是計算機行業里一次重大突破。
Red HatRed Hat
通過將平台無關性、自動記憶體管理、靜態類型、安全引用、靜態域和可讀性強的語法等完美地結合在一起,Java成為第一個可以在多用戶環境下安全運行的面向對象語言,也是第一個支持自動重構和其他複雜高級工具的主流語言。Java代碼健壯,而且易於理解,這使得它很適合大規模部署和大團隊開發。這一結果的背後驅動力是Java設計者的精心構建。
每一項主流的技術都不是完美的,Java也是一樣。定義用戶接口和結構化數據都是Java無法實現的,這也導致Java平台只能過度依賴XML。 Java平台也缺少內置模組的解決方案,那些試圖解決這個問題的方案相當複雜,沒有什麼競爭力。Java對高階函式(功能)支持乏力,這造成了語言上不必要的拖贅,並且它在下面幾個方面也不是很完美,包括getters/setters、數組陣列和原始類型、異常檢查、空值處理、笨拙的元模型,以及開發者難以完全掌控的多態參數系統等等。最後,還有匆匆忙忙設計出來的Java SE SDK,也一直沒有被很好的完善。
Gavin King進一步介紹說:“Ceylon語言支持功能強大的類型系統,在設計時它考慮到了以下限制:所有類型在類型系統內部都必須是可表達的(沒有特殊的 primitive類型或者複合類型);Ceylon的t通用類型系統要比Java的更簡單,而且相比於其他類Java語言,它的安全性更高;甚至元編程(reflection)也必須是類型安全的;另外,Ceylon必須是在JVM上執行,而且可以和Java互動操作。”
不過,他在個人部落格上否認Ceylon是“Java殺手”,它不是Java,而是一種受Java影響的新語言。

示例代碼

儘管在寫這篇文章的時候,一個公開可用的編譯器還不存在,但是Ceylon語言的結構已被定義出來,以便能夠通過開發一些簡單套用來研究和考慮它的用法和可讀性。本節著眼於一些用Ceylon編寫的樣例套用,以此來說明它的結構。

Hello World

我會使用一個“Hello World”程式來說明一個簡單程式的創建,該程式在顯示界面上給出一個簡單的文本串。清單1中給出的這一例子展示了一個頂層的名為hello的方法,該方法使用writeLine方法來發出一個串到標準輸出上。
清單1. 使用Ceylon編寫的Hello World程式
doc "Hello World Program"
by "Gavin King"
void hello() {
writeLine( "Hello World." );
}
需要注意的一點是,註解也會用於API文檔(類似於doxygen一類的工具),其允許你說明方法和作者(分別是doc和by註解)。
Ceylon的類型
Ceylon採用了一組傳統的類型,它們被實現成普通的類,這些類型包括:
1. Natural:無符號整數,包括零
2. Integer:有符號整數
3. Float:浮點數
4. Whole:任意精度的有符號整數
5. Decimal:任意精度和任意位小數的十進制數
默認情況下,Natural、Integer和Float類型是64位的,但你可以使用small來註解它們,以指明是32位精度的。

Ceylon的類

Ceylon是一種面向對象的語言,你使用類的概念來編寫代碼。在Ceylon中class(類)是一種類型,其封裝了一組操作(稱作方法(method))和狀態(state),而且要定義在類的對象被初始化時狀態是如何被初始化的(類初始化器(class initializer),類似於構造函式)。
一個簡單的例子會有助於你理解Ceylon的做法。清單2為一個計數器類提供了一個簡單的類,清單2使用一個可選值來定義類,這意味著用戶可以提供該值也可以不提供,它使用Type?(類型?)這 種模式來標明。類主體包含的是類初始化器而非構造函式,這一代碼定義私有變數(除非註解成shared,否則不可見),然後定義初始化邏輯。你先從查看 start變數是否存在開始,如果存在的話,其就被用作計數的初始值。你的第一個方法,被註解成shared,因此是從類外部可見的,其定義了增量器。在 調用時,這一方法簡單地遞增你的計數器。
最後,定義一個getter方法來給用戶返回當前的計數器值,以及定義一個setter方法來把調用者提供的值設定當前的計數器值。需要注意的 是,這裡使用了assign這一關鍵字來創建一個變數屬性以用於計數器值的設定。除了構造函式的處理不同之外(代碼內嵌在類內部),類也不存在析構函式, 也不提供實現多個構造函式的方式(這僅是不同於Java語言之處之一)。
清單2. 使用Ceylon編寫的一個簡單的類
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 對象,可以注意到Ceylon中沒有new這一關鍵字。新的Counter對象定義了之後,調用increment方法,然後使用getter方法來輸出 Counter的值。需要注意的是,在Ceylon中,=和:=運算符是不同的:=這一限定符只能用於不可變的值,而變數賦值則是使用:=運算符來進行 的。
清單3. 使用Counter類
01 Counter cnt = Counter(1);
02 cnt.increment();
03 writeLine( c.currentValue );
Ceylon鼓勵儘可能使用不變的屬性,這意味著一個對象使用某個值初始化後不會再次被賦值。要指明一個命名變數是可變的(在初始化之後可改變),其必須要使用variable註解,如清單2中第5行所展示的那樣。
最後要研究的一項是Ceylon在控制結構方面的一個主要區別。你應該有注意在許多的語言中,條件表達式後面的花括弧({})可省略,比如說如果只出現單條語句的話:
if (cnt > 10) statement();
Ceylon不允許這種語法,其要求給出花括弧,即上面顯示的示例代碼在Ceylon中要這樣寫:
if (cnt > 100) { statement(); }
因為這代表了C中最常見的一種錯誤,因此特別地強制使用這一正確風格是可讓人接受的。
高階函式
Ceylon包括了被稱作一階函式(first-order function)的 函式式編程風格,這簡單地意味著函式被視為第一類對象(first class object),其可被用作函式的參數,以及可以從函式中返回。拿King為repeat方法的定義所提供的演示例子(參見清單4)來看好了。在這種情況 下,方法用到了兩個參數:作為重複次數的Natural,以及要調用的一個函式的方法參數。repeat方法的方法體內部簡單地創建了一個for循環(使 用了一個範圍運算),然後調用作為函式參數傳進來的方法。
清單4. Ceylon中的高階函式
01 void repeat( Natural times, void hfunction() ) {
02 for (Natural n in 1..times) {
03 hfunction();
04 }
05 }
這一方法的用法很簡單,如清單5中的第7行所示,使用了不帶參數的方法名。
清單5. 在Ceylon中使用高階函式
01 void sayhello() {
02 writeLine( "Hello World." );
03 }
04
05 ...
06
07 repeat( 10, sayhello );
不像其他語言所提供的函式支持,Ceylon不支持匿名函式(直接出現在表達式中的無名函式),但它支持閉包(closure)(其本質上是能夠引用另一個函式中的狀態的函式)
類型窄化
Ceylon不包含出現在Java語言中的instanceof運算符;其也不包含諸如可在C中找到的那種類型轉換,Ceylon的替代做法是,其實現了所謂的類型窄化(type narrowing), 這種做法被用來在一步中測試並縮窄對象引用的類型。考慮一下下面清單6中的代碼段,該段代碼使用了一個特殊的(is ...)構造來測試一個對象引用是否為給定的類型,如果類型被確定的話,類型特定的方法接著就會被調用。這一構造類似於你之前在用於說明可選參數的清單2 中見到的(exists ...)這一構造。
清單6. Ceylon中的類型窄化
01 Object obj = ;
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 在case上強制使用塊結構,並去除了default這種情況,代以else塊。Ceylon還(在編譯時)確保switch語句包含了一個詳盡的實例測 試清單,或者至少有一個else語句提供完整的覆蓋。編譯器自動檢查這些switch語句並且如果有實例沒被覆蓋到的話就產生一個錯誤。
其他的控制結構
Ceylon實現了傳統的if...else語句,正如你所期望的那樣,它也實現了Java語言的異常處理功能(try、catch、 finally)。Ceylon還創建了所謂的fail塊,其和for循環一起使用以識別循環何時被提早打斷。考慮一下清單7中展示的例子。
清單7. 說明Ceylon的fail塊
01 for (Instrument i in instruments) {
02 if (i.failing()) {
03 break;
04 }
05 }
06 fail {
07 // Take some action...
08 }
這在C和Java語言中都是常見的設計模式,因此對Ceylon來說是一個有益的補充。

學習資料

1. Gavin King最初對Ceylon語言的介紹,可觀看這一30分鐘的標題為 Introducing the Ceylon Project的視頻。現有兩個來自King的Ceylon演示,包括介紹性的發言和一個標題為The Ceylon Type System的演示,該演示涵蓋了一些更先進的功能特性。
2. Gavin King提供的一個由11部分組成的描述Ceylon語言的文章系列。正如你會從針對該系列的每個元素的評論中看到的那樣,有著相當數量的反饋,並對語言進行了動態的裁剪,以此彌補所發現的問題。你可以在King的部落格中找到這一系列文章。
3. 想要關注(和參加)Ceylon的實時構建的話,可查看Ceylon核心團隊的郵件列表。
4. ANTLR是一種語言工具和框架,其被用來從語法描述中構建編譯器、解釋器、翻譯器和識別器。ANTLR出自舊金山大學(University of San Francisco),基於Terence Parr的工作成果。
5. 該篇文章提及Ceylon中實現的一些函式式編程的功能特性。可在Wikipedia中找到第一類函式(first-class function)、高階函式(higher-order function)和閉包(closure)的介紹。
6. 在developerWorks Linux zone上可找到數百篇how-to文章和教程,以及下載資源和討論論壇等,還有為Linux開發者和管理員提供的其他豐富的資源。
7. 隨時關注developerWorks technical events and webcasts,了解各種IBM產品和IT行業主題。
8. 加入a free developerWorks Live! briefing,快速獲悉IBM的產品和工具,以及IT行業的發展趨勢。
9. 觀看developerWorks on-demand demos,範圍從為初學者提供的產品安裝和設定演示到為有經驗的開發者提供的高級功能。
10. 在Twitter上關注developerWorks,或者訂閱Linux tweets on developerWorks閱讀器。

相關詞條

熱門詞條

聯絡我們