自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Ceylon:新的編程利器或只是另一種語言?

開發(fā) 前端 開發(fā)工具
Ceylon是一個(gè)出自Red Hat的新項(xiàng)目,由Gavin King領(lǐng)導(dǎo)。King是Hibernate項(xiàng)目的創(chuàng)始人,該項(xiàng)目是一個(gè)Java語言內(nèi)部的持久化解決方案。

計(jì)算機(jī)科學(xué)的道路上布滿了什么將成為“下一個(gè)大事件”這樣的軀殼。盡管許多的小生境語言確實(shí)在腳本或是特定應(yīng) 用中找到了一些用武之地,但C(及其衍生工具)和Java語言是難以被取代的。不過Red Hat的Ceylon似乎是一些語言功能的一個(gè)很有意思的組合,其使用了大家熟知的C風(fēng)格的語法,但是除了強(qiáng)調(diào)簡潔之外,其還提供面向?qū)ο蠛鸵恍┖苡杏玫?函數(shù)方面的支持。研究一下Ceylon,看看這一未來的VM語言是否能夠在企業(yè)級(jí)的軟件開發(fā)中找到自己的位置。

Linux和開源通常會(huì)與最前沿的語言設(shè)計(jì)之間存在著一定的關(guān)系,其可能是可用來支持語言開發(fā)的工具,或者是平臺(tái)的開放性促進(jìn)了語言設(shè)計(jì)的進(jìn)步?;蛘呖赡?是這樣的情況,基于開源技術(shù)的那些開放式語言(比如說GNU Compiler Collection系列、Ruby、Python和Perl)非常的優(yōu)秀,因?yàn)樗鼈儦g迎和鼓勵(lì)試驗(yàn)使用(更不用提Red Hat就是Ceylon背后的公司)。無論是出于何種原因,Linux開發(fā)者可以使用大量的各種語言,從較少被用到已有了一定年頭的語言到最新最先進(jìn)的產(chǎn) 品。

但在一個(gè)有著C/C++、Java™語言、Scala、Ruby、Python、Perl、Erlang、Lua、Scheme以及其他許多 語言的世界中,我們還有必要關(guān)心一種致力于面向業(yè)務(wù)的企業(yè)級(jí)軟件開發(fā)的新語言的宣告出現(xiàn)嗎?在許多情況下,回答是否定的。不過讓我們來研究一下Red Hat為未來提供的一種名為Ceylon的語言,看一看它是否能夠上升到當(dāng)今最受歡迎語言的行列中來。

Ceylon并不是Java

“Ceylon不是Java,它是一種深受Java影響的新語言,是由一些Java愛好者設(shè)計(jì)出來的,他們不覺得有什么不對,Java并不會(huì)馬上過氣,所以不存在誰殺死它的問題。”——Gavin King

Ceylon的介紹

Ceylon是一個(gè)出自Red Hat的新項(xiàng)目,由Gavin King領(lǐng)導(dǎo)。King是Hibernate項(xiàng)目的創(chuàng)始人,該項(xiàng)目是一個(gè)Java語言內(nèi)部的持久化解決方案。盡管King是Java技術(shù)的愛好者——該技 術(shù)是首個(gè)適用于大規(guī)模開發(fā)的語言——但按照他的話來講,該語言有著一些令人受挫的地方(其中包括泛型一類的語言復(fù)雜性、設(shè)計(jì)輕率和晦澀的Standard Edition SDk、笨拙的注解語法、破碎的塊結(jié)構(gòu)、XML依賴性等等)。

因此,King提出了一個(gè)問題,在從Java語言和SDK的優(yōu)勢和劣勢中學(xué)到一些教訓(xùn)之后,語言應(yīng)該具備什么樣的形式才對?他的答案是 Ceylon,一種靜態(tài)類型語言,保留了Java語言的一些最好的功能特性(也運(yùn)行在JVM上),但在語言的可讀性、內(nèi)置的模塊化以及諸如高階函數(shù)一類的 函數(shù)式語言特征的納入方面做了改進(jìn)。Ceylon還采用了C和Smalltalk的一些特性,不過它更像Java語言,這一新語言專注在業(yè)務(wù)計(jì)算上,但它 也很靈活,可用在其他領(lǐng)域中。

有些人把Ceylon稱作“Java 殺手”(可能是因?yàn)镴ava語言的前途問題),但實(shí)際上Ceylon運(yùn)行在JVM上,因此它是Java技術(shù)的一種延伸而不是替代。使用JVM來支持 Ceylon的執(zhí)行是一種理想的模式,因?yàn)檫@意味著Ceylon(像Java一樣)是可跨多種目前支持JVM的架構(gòu)移植的。

Ceylon的語言特性

當(dāng)今大多數(shù)的語言都不再遵從某種簡單的分類,代以體現(xiàn)的是多樣化的編程風(fēng)格,Ceylon并沒有什么不同。Ceylon是一種靜態(tài)類型語言(statically typed language)(即 類型檢查是在編譯時(shí)進(jìn)行的,相對應(yīng)的是諸如Lisp一類的動(dòng)態(tài)類型語言,這些語言的類型檢查是在運(yùn)行時(shí)進(jìn)行的)。Ceylon是一種面向?qū)ο蟮恼Z言,類似 Java語言,其還使用典型的C語法風(fēng)格來支持高階函數(shù)(higher-order function)(即函數(shù)可以使用其他函數(shù)來作為輸入和輸出)。Java語言并不直接支持高階函數(shù),因此這一功能特性代表了這兩種語言之間獨(dú)特的不同之 處。

然而,有時(shí)候,改進(jìn)更多指的是語言刪減了什么而不是添加了什么。Ceylon簡化并刪減了Java語言的一些元素,使用更簡單的方案來代替它們。 簡化的一個(gè)例子是public、protected和private關(guān)鍵字的去除,Ceylon的替代做法是只包含一個(gè)shared注解,該注解定義了類 的哪一個(gè)元素是外部可見的。Ceylon還刪除了重載功能,但使用更簡單的語法來提供了一些這一功能的變通做法(比如說默認(rèn)的和有序的參數(shù))。

Ceylon包含了對繼承、序列(數(shù)組(array)或是列表(list)構(gòu)造)、泛型、命名參數(shù)等的支持,它包含了運(yùn)行時(shí)類型管理的一些功能(我們會(huì)在下一節(jié)中研究一個(gè)這樣的例子)。該語言目前正處在積極的開發(fā)階段,因此其最終的功能依然處于一種開放的狀態(tài)中。

Ceylon的例子說明

盡管在寫這篇文章的時(shí)候,一個(gè)公開可用的編譯器還不存在,但是Ceylon語言的結(jié)構(gòu)已被定義出來,以便能夠通過開發(fā)一些簡單應(yīng)用來研究和考慮它的用法和可讀性。本節(jié)著眼于一些用Ceylon編寫的樣例應(yīng)用,以此來說明它的結(jié)構(gòu)。

Hello World

我會(huì)使用一個(gè)“Hello World”程序來說明一個(gè)簡單程序的創(chuàng)建,該程序在顯示界面上給出一個(gè)簡單的文本串。清單1中給出的這一例子展示了一個(gè)頂層的名為hello的方法,該方法使用writeLine方法來發(fā)出一個(gè)串到標(biāo)準(zhǔn)輸出上。

清單1. 使用Ceylon編寫的Hello World程序

  1. doc "Hello World Program"  
  2. by "Gavin King"  
  3. void hello() {  
  4.   writeLine( "Hello World." );  

需要注意的一點(diǎn)是,注解也會(huì)用于API文檔(類似于doxygen一類的工具),其允許你說明方法和作者(分別是doc和by注解)。

Ceylon的類型

Ceylon采用了一組傳統(tǒng)的類型,它們被實(shí)現(xiàn)成普通的類,這些類型包括:

  1. Natural:無符號(hào)整數(shù),包括零
  2. Integer:有符號(hào)整數(shù)
  3. Float:浮點(diǎn)數(shù)
  4. Whole:任意精度的有符號(hào)整數(shù)
  5. Decimal:任意精度和任意位小數(shù)的十進(jìn)制數(shù)

默認(rèn)情況下,Natural、Integer和Float類型是64位的,但你可以使用small來注解它們,以指明是32位精度的。

Ceylon的類

Ceylon是一種面向?qū)ο蟮恼Z言,你使用類的概念來編寫代碼。在Ceylon中class(類)是一種類型,其封裝了一組操作(稱作方法(method))和狀態(tài)(state),而且要定義在類的對象被初始化時(shí)狀態(tài)是如何被初始化的(類初始化器(class initializer),類似于構(gòu)造函數(shù))。

一個(gè)簡單的例子會(huì)有助于你理解Ceylon的做法。清單2為一個(gè)計(jì)數(shù)器類提供了一個(gè)簡單的類,清單2使用一個(gè)可選值來定義類,這意味著用戶可以提供該值也可以不提供,它使用Type?(類型?)這 種模式來標(biāo)明。類主體包含的是類初始化器而非構(gòu)造函數(shù),這一代碼定義私有變量(除非注解成shared,否則不可見),然后定義初始化邏輯。你先從查看 start變量是否存在開始,如果存在的話,其就被用作計(jì)數(shù)的初始值。你的第一個(gè)方法,被注解成shared,因此是從類外部可見的,其定義了增量器。在 調(diào)用時(shí),這一方法簡單地遞增你的計(jì)數(shù)器。

最后,定義一個(gè)getter方法來給用戶返回當(dāng)前的計(jì)數(shù)器值,以及定義一個(gè)setter方法來把調(diào)用者提供的值設(shè)置當(dāng)前的計(jì)數(shù)器值。需要注意的 是,這里使用了assign這一關(guān)鍵字來創(chuàng)建一個(gè)變量屬性以用于計(jì)數(shù)器值的設(shè)置。除了構(gòu)造函數(shù)的處理不同之外(代碼內(nèi)嵌在類內(nèi)部),類也不存在析構(gòu)函數(shù), 也不提供實(shí)現(xiàn)多個(gè)構(gòu)造函數(shù)的方式(這僅是不同于Java語言之處之一)。

清單2. 使用Ceylon編寫的一個(gè)簡單的類

  1. doc "Simple Counting Class"  
  2. class Counter( Natural? start ) {  
  3.  
  4.   doc "Class Initializer"  
  5.   variable Natural count :0;  
  6.   if (exists start) {  
  7.     count :start;  
  8.   }  
  9.  
  10.   doc "The incrementer"  
  11.   shared void increment() {  
  12.     count++;  
  13.   }  
  14.  
  15.   doc "The getter"  
  16.   shared Natural currentValue {  
  17.     return count;  
  18.   }  
  19.  
  20.   doc "The setter"  
  21.   shared assign currentValue {  
  22.     count :currentValue;  
  23.   }  
  24.  

定義了這個(gè)簡單的類后,讓我們來看看如何在Ceylon中使用該類。清單3提供了一段使用Counter類的代碼。其開始先實(shí)例化類的一個(gè)cnt 對象,可以注意到Ceylon中沒有new這一關(guān)鍵字。新的Counter對象定義了之后,調(diào)用increment方法,然后使用getter方法來輸出 Counter的值。需要注意的是,在Ceylon中,=和:=運(yùn)算符是不同的:=這一限定符只能用于不可變的值,而變量賦值則是使用:=運(yùn)算符來進(jìn)行 的。

清單3. 使用Counter類

  1. Counter cnt = Counter(1);  
  2. cnt.increment();  
  3. writeLine( c.currentValue ); 

Ceylon鼓勵(lì)盡可能使用不變的屬性,這意味著一個(gè)對象使用某個(gè)值初始化后不會(huì)再次被賦值。要指明一個(gè)命名變量是可變的(在初始化之后可改變),其必須要使用variable注解,如清單2中第5行所展示的那樣。

最后要研究的一項(xiàng)是Ceylon在控制結(jié)構(gòu)方面的一個(gè)主要區(qū)別。你應(yīng)該有注意在許多的語言中,條件表達(dá)式后面的花括號(hào)({})可省略,比如說如果只出現(xiàn)單條語句的話:

  1. if (cnt > 10) statement(); 

Ceylon不允許這種語法,其要求給出花括號(hào),即上面顯示的示例代碼在Ceylon中要這樣寫:

  1. if (cnt > 100) { statement(); } 

因?yàn)檫@代表了C中最常見的一種錯(cuò)誤,因此特別地強(qiáng)制使用這一正確風(fēng)格是可讓人接受的。

#p#

高階函數(shù)

Ceylon包括了被稱作一階函數(shù)(first-order function)的 函數(shù)式編程風(fēng)格,這簡單地意味著函數(shù)被視為第一類對象(first class object),其可被用作函數(shù)的參數(shù),以及可以從函數(shù)中返回。拿King為repeat方法的定義所提供的演示例子(參見清單4)來看好了。在這種情況 下,方法用到了兩個(gè)參數(shù):作為重復(fù)次數(shù)的Natural,以及要調(diào)用的一個(gè)函數(shù)的方法參數(shù)。repeat方法的方法體內(nèi)部簡單地創(chuàng)建了一個(gè)for循環(huán)(使 用了一個(gè)范圍運(yùn)算),然后調(diào)用作為函數(shù)參數(shù)傳進(jìn)來的方法。

清單4. Ceylon中的高階函數(shù)

  1. void repeat( Natural times, void hfunction() ) {  
  2.      for (Natural n in 1..times) {  
  3.         hfunction();  
  4.      }  
  5.   } 

這一方法的用法很簡單,如清單5中的第7行所示,使用了不帶參數(shù)的方法名。

清單5. 在Ceylon中使用高階函數(shù)

  1. void sayhello() {  
  2.      writeLine( "Hello World." );  
  3.     }  
  4.    ...  
  5.      repeat( 10, sayhello ); 

不像其他語言所提供的函數(shù)支持,Ceylon不支持匿名函數(shù)(直接出現(xiàn)在表達(dá)式中的無名函數(shù)),但它支持閉包(closure)(其本質(zhì)上是能夠引用另一個(gè)函數(shù)中的狀態(tài)的函數(shù))

類型窄化

Ceylon不包含出現(xiàn)在Java語言中的instanceof運(yùn)算符;其也不包含諸如可在C中找到的那種類型轉(zhuǎn)換,Ceylon的替代做法是,其實(shí)現(xiàn)了所謂的類型窄化(type narrowing), 這種做法被用來在一步中測試并縮窄對象引用的類型。考慮一下下面清單6中的代碼段,該段代碼使用了一個(gè)特殊的(is ...)構(gòu)造來測試一個(gè)對象引用是否為給定的類型,如果類型被確定的話,類型特定的方法接著就會(huì)被調(diào)用。這一構(gòu)造類似于你之前在用于說明可選參數(shù)的清單2 中見到的(exists ...)這一構(gòu)造。

清單6. Ceylon中的類型窄化

  1. Object obj = <some object>;  
  2.      
  3.    switch (obj)  
  4.       
  5.       case (is Counter) {  
  6.        obj.increment();  
  7.       }  
  8.      case (is ComplexCounter) {  
  9.       obj.incrementBy(1);  
  10.      }  
  11.     else {  
  12.        stream.writeLine("Unknown object");  
  13.     } 

Ceylon包含了另一種類似的定義成(nonempty ...)的構(gòu)造,你可以把該構(gòu)造應(yīng)用在序列(數(shù)組或列表)上,以確定序列中是否是不包含有元素的,這樣就可以不用在其之上執(zhí)行操作。

最后要注意的一點(diǎn)是,Ceylon的switch語句的語法,其不同于C和Java語言兩者。這兩種語言中的這一語句都很容易出錯(cuò),Ceylon 在case上強(qiáng)制使用塊結(jié)構(gòu),并去除了default這種情況,代以else塊。Ceylon還(在編譯時(shí))確保switch語句包含了一個(gè)詳盡的實(shí)例測 試清單,或者至少有一個(gè)else語句提供完整的覆蓋。編譯器自動(dòng)檢查這些switch語句并且如果有實(shí)例沒被覆蓋到的話就產(chǎn)生一個(gè)錯(cuò)誤。

其他的控制結(jié)構(gòu)

Ceylon實(shí)現(xiàn)了傳統(tǒng)的if...else語句,正如你所期望的那樣,它也實(shí)現(xiàn)了Java語言的異常處理功能(try、catch、 finally)。Ceylon還創(chuàng)建了所謂的fail塊,其和for循環(huán)一起使用以識(shí)別循環(huán)何時(shí)被提早打斷??紤]一下清單7中展示的例子。

清單7. 說明Ceylon的fail塊

  1. for (Instrument i in instruments) {  
  2.     if (i.failing()) {  
  3.        break;  
  4.      }  
  5.    }  
  6.    fail {  
  7.     // Take some action...  
  8.   } 

這在C和Java語言中都是常見的設(shè)計(jì)模式,因此對Ceylon來說是一個(gè)有益的補(bǔ)充。

Ceylon的前景

正如King所說的那樣,Ceylon是社區(qū)的努力成果,因此需要軟件工程師和測試人員來幫助設(shè)計(jì)、構(gòu)建和驗(yàn)證語言和SDK。這一號(hào)召能夠鼓勵(lì) Java語言用戶做出反饋,這有助于支持他們從該語言到Ceylon的遷移。King依然對Ceylon的當(dāng)前狀態(tài)保持適當(dāng)?shù)某聊?,只是說語言規(guī)范以及 ANTLR(Another Tool for Language Recognition)語法都已存在了。

展望未來

盡管有些人會(huì)質(zhì)疑一種新語言的必要性,不過另一種看待語言的觀點(diǎn)是把它們作為用來解決問題的一系列工具。并非每一種語言都是任何指定問題的適 合的或是理想的解決工具的,但某些語言本身能夠很好的適用于某些特定的解決方案領(lǐng)域;因此,有多種語言可用是一種福氣,而非禍端。因?yàn)镃eylon仍處于 開發(fā)階段,因此其是否能夠在目前正在使用的主流語言行列中找到一個(gè)位置還是未知的。不過該語言捕捉了足夠多的興趣點(diǎn),因此等其最終出現(xiàn)時(shí),對其進(jìn)行進(jìn)一步 的研究將會(huì)是一件很有趣的事情。

原文:http://www.ibm.com/developerworks/cn/linux/l-ceylon/

【編輯推薦】

  1. Perl、PHP、Python、Java和Ruby的比較
  2. C++程序員必讀:讓你的代碼更強(qiáng)大
  3. 各大主流.Net的IOC框架性能測試比較
  4. Ruby之父出任Heroku首席架構(gòu)師 推進(jìn)Ruby云計(jì)算應(yīng)用
  5. 漢語編程:程序員你們等不到了
責(zé)任編輯:陳貽新 來源: IBM developerWorks
相關(guān)推薦

2014-09-17 14:37:06

2018-04-18 07:34:58

2013-05-22 15:31:07

AOP的CGlib實(shí)現(xiàn)

2016-03-03 10:29:31

用戶信息改進(jìn)

2010-07-21 16:23:09

運(yùn)行telnet程序

2011-12-29 21:28:31

Metro UI

2023-06-18 23:19:17

ChatGPTPPT方式

2016-07-11 16:18:26

互聯(lián)網(wǎng)

2014-01-13 10:36:53

C++錯(cuò)誤

2020-10-20 09:45:28

Facebook AI翻譯

2019-01-02 08:04:29

GAN損失函數(shù)神經(jīng)網(wǎng)絡(luò)

2013-09-30 10:13:08

IT女程序員

2013-03-12 14:07:06

Java編程

2016-09-30 12:49:14

區(qū)塊鏈安全

2013-10-21 15:11:15

OrmsqlOrm設(shè)計(jì)

2009-06-17 12:01:21

Linux

2010-09-02 09:14:35

CSS浮動(dòng)

2015-07-28 13:36:04

2009-06-17 09:05:05

Linux隱藏網(wǎng)絡(luò)鏈接命令

2021-03-17 10:00:37

物聯(lián)網(wǎng)安全漏洞物聯(lián)網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)