返回列表 發帖

[轉載] IronRuby 初探

【簡體中文】 IronRuby 初览
【原文地址】 First Look at IronRuby
【原文發表日期】 Monday, July 23, 2007 8:45 AM

IronRuby 初探

過去的幾年裏,我們一直致力讓.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方法暫存(Caching)的實做。它還使用了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

標籤: .NET

返回列表 回復 發帖