摘要:IronRuby 初覽
【原文位址】 First Look at IronRuby
【原文發表日期】 Monday, July 23, 2007 8:45 AM
過去的幾年裡,我們一直致力於使得.NET和CLR成為出色的動態語言環境。大概14個月前,在我的開發團隊內,我們組成了一個專門的開發組,專注於增加對動態語言的豐富CLR執行時期支援,以及推出流行動態語言的第一流.NET實現。
DLR 背景知識
今年春天,我們發佈了我們稱之為「動態語言執行時期(Dynamic Language Runtime)」(簡稱為DLR)的新.NET庫的第一個預覽版。該庫提供了一組建立在CLR基礎之上,特為動態語言場景而設計的特性。這些特性包括,一個共享的動態型別系統,語言宿主模型,以及能產生快速動態程式碼的基礎設施支援。這些特性極大地簡化了高品質的動態語言的.NET實現的構建。這些實現可以訪問和使用.NET框架中的任何API,還可以輕鬆地與用任何一門.NET語言編寫的程式碼進行互操作。譬如,你可以編寫一個Ruby類,在其中叫用一個C#類別,這個C#類別進而叫用一個Python類別。
今年春天,在MIX 07大會上,我們宣佈了微軟將發佈四門動態語言的.NET實現:
- IronPython
- IronRuby (新)
- Javascript
- 動態 VB (新)
我們的IronPython實現的程式碼,以及底層的DLR庫的程式碼四月份已經在CodePlex上發佈。你現在就可以在IronPython codeplex網站上下載這2者的程式碼。所有的程式碼都是在MSPL permissive license許可下發佈的,該許可提供了完全的商業性和非商業性改動程式碼的權利。
IronRuby Pre-Alpha 發佈
今天,我們發佈了我們的IronRuby實現的第一個公開預覽版。你可以在John Lam這裡的部落格文章裡進一步瞭解如何下載程式碼,如何編譯,以及如何試驗這個預覽版。
今天這個IronRuby預覽版還是一個非常早期的版本,幾個語言特性和大部分的庫還沒有實現(所以我們稱之為「pre-alpha」版呢)。但它確實實現了大部分的核心語言支援,而且可以使用標準的.NET型別和API。
IronRuby是被設計來利用一個我們稱之為「Dynamic Sites」的新DLR特性的,該特性提供了一個快速的,可適應性的(adaptive) call-site方法快取的實現。它還使用了CLR的輕量級程式碼生成特性。輕量級程式碼生成允許動態語言的實現在執行時期建立記憶體中的IL,繼而JIT為本機程式碼,而不用在硬碟上保存什麼東西。這可以導致比解釋性程式碼好得多的執行時期性能,輕量級程式碼生成特性確保了一旦用完JIT過的程式碼之後,我們可以將其垃圾回收以避免記憶體洩漏。
我們今天發佈的這個預覽版主要是針對那些對語言實現有興趣的開發人員的,這樣他們可以開始研究IronRuby程式碼,以及瞭解它是如何實現的。有興趣把玩Ruby的.NET實現早期版本的開發人員也可以下載相應程式碼,嘗試一下它的功能。
IronRuby 專案計劃
下個月,我們將把IronRuby原始碼庫移到RubyForge上。同時我們也將開放這個專案,允許非微軟開發人員加入這個專案的開發,以及貢獻原始碼。然後我們將繼續實現剩下的語言特性,修正隨著更多的庫和程式碼移植過來時發現的相容性問題。
其結果將是一個建立在.NET之上的,任何人都可以免費使用的,相容性良好的,快速的,和靈活的Ruby實現。
IronRuby 「Hello World」 控制台範例程式
如果你下載和編譯了IronRuby原始碼,你大概在想「我該如何開始使用它呢」?
想上手的最簡單的方法就是執行rbx.exe,一個交互性控制台應用,預設情形下是編譯在\bin\release目錄裡的:
這個控制台shell提供了交互性編寫Ruby程式碼的功能。在寫完每一行後,這個shell就會立刻執行相應程式碼。
例如,我們可以鍵入 puts 「Hello World」 來輸出「hello world」:
想連續輸出這個字串10次,我們可以鍵入下列程式碼:
要在IronRuby中使用Windows Forms功能的話,我們可以鍵入一個require語句,來引用System.Windows.Forms程式集,然後使用MessageBox.Show方法來在一個模態對話框裡顯示消息:
IronRuby 「Hello World」 WPF 範例程式
在.NET之上實現一門語言的一個好處是,它允許使用該語言的開發人員完整地訪問.NET框架提供的豐富的框架庫。
作為對這個好處的一個簡單示範,我將建一個HelloWPF.rb文字文件,在其中輸入下列Ruby程式碼:
上面的程式碼使用了WPF UI框架,建立一個視窗,內含一個StackPanel佈局管理器,開始時只包含一個按鈕。按鈕被點擊後,建立了一個新的標籤控制項,加到StackPanel中 (導致該控制項在Window中自動流動到相應位置)。
然後我可以將HelloWPF.rb文件作為參數傳給rbx.exe來執行上面這個應用:
當我執行它時,我將得到一個內含一個WPF按鈕的視窗(注意上面,我在上面的程式碼裡給這個按鈕加了一個好看的DropShadowBitmapEffect效果):
我每按一下這個按鈕,一個新的標籤控制項就會添加進上面的視窗中:
可以使用所有的.NET API自然威力無比,但你也可以注意到,在我們編寫的程式碼中,是如何自然地將.NET API整合進其他的語言句法的:
在上面的程式碼片段裡,我使用了Ruby的block語言特性(類似於C# 3.0和VB9中的Lambda運算式),來實現WPF按鈕的Click事件處理方法。注意在該block裡,是如何使用標準的Ruby命名模式來訪問任何.NET API的。比如,不是使用WPF Label控制項的「FontSize」屬性,我們用了「font_size」作為屬性訪問名字來訪問該屬性。IronRuby自動處理這樣的命名轉換,允許開發人員使用一致的命名模式來程式設計,而不用管他們所選擇的語言。
結語
如果你有興趣試驗一下IronRuby這個早期版本的話,你可以在這裡下載和編譯其原始碼。
然後,你可以在這裡下載我上面的WPF範例程式,自己執行一下(注:你必須預先安裝了.NET 3.0 或 3.5,因為這些版本才提供WPF API)。想進一步瞭解WPF的話,我強烈推薦Adam Nathan的優秀著作《WPF Unleashed》(閱讀一下Amazon上該書的評語就知道我推薦的理由了)。
希望本文對你有所幫助,
Scott