Martin演講實錄3:細數Ruby語言優缺點

發表于:2007-06-11來源:作者:點擊數: 標簽:
細數Ruby語言優缺點 解釋以上這些究竟在做什么顯得有些羅嗦了。但是我希望傳遞的是,使用 ruby 這個語言時候的體會。盡管你不能自己親自嘗試,但是你可以通過屏幕看到這一系列的過程?,F在我想展示另外一個例子。我希望你們可以所看到的內容中,得到一些體會

細數Ruby語言優缺點

解釋以上這些究竟在做什么顯得有些羅嗦了。但是我希望傳遞的是,使用ruby這個語言時候的體會。盡管你不能自己親自嘗試,但是你可以通過屏幕看到這一系列的過程?,F在我想展示另外一個例子。我希望你們可以所看到的內容中,得到一些體會。如果你之前還沒有嘗試過任何一種腳本語言,那么我鼓勵你去學習ruby。我認為ruby是非常值得學習的。因為它是很容易學習和使用的,只需要花幾分鐘去學習。腳本語言的另一個特點是,你可以寫一些代碼,然后直接去看它的運行結果。Ruby是一個非常優秀的腳本語言。

但是,我想ruby的意義不僅在于它是一個好的腳本語言。接下來的幾分鐘,我將討論這個問題。

首先,我希望通過ruby的特性來討論這個話題。這一點你可能已經從剛才的例子里面有所體會了。Ruby又很簡潔的語法,這樣你不需要寫很多的代碼,就能夠獲得很強大的功能。從剛才的例子里面就可以看到,在寫參數的時候,你不需要寫括號,當然,你也可以根本沒有參數。這個特點可以使你快速的編寫代碼,但是更重要的是,你可以快速的閱讀代碼。我們可以對比java, c系列的語言,當你試圖去閱讀代碼的時候,你的視線總是會被分散,并不容易弄明白代碼究竟在做什么。松散的類型檢查可以幫助我們更快、更好的理解代碼。嚴格的類型檢查可以導致更差的可讀性。Ruby 在這之間做了很好的一個平衡。代碼的可讀性無論是對ruby而言,還是對使用ruby的開發人員來說,都有非常重要的價值。我認為用ruby寫的代碼是可讀性很好的。這并不意味著ruby是一個很小的語言,就像smalltalk那樣。Ruby是一門很復雜的語言。它具有很多復雜的語法特性,比如在同一行代碼中實現多個任務這些小的語法點。如果你使用過其他的腳本語言的的話,(會發現)perl和python的特性都被帶到了ruby中。這些給ruby的學習增加了難度。這又是一種新的平衡。在簡單的語言里面表達事情是復雜的比如smalltalk, 然而,在ruby里,是很方便的,特別是在控制collection方面。在ruby里,List的語法是很方便的。我并沒有展示hashtable在ruby中的使用,但是它們的用法一樣是簡單的。

有一點很受到關注,不像java,c#這些主流的靜態類型的語言,你不需要在ruby中定義變量類型。它是具有嚴格的類型的。記得我們在剛才的實驗里面舉的例子,字符串類型進行減運算,是會被提示錯誤的。但是你只有在運行的時候才會被告知有錯誤存在,而不是在編譯的時候。所以ruby有嚴格的類型。但是它的類型是動態的。所以你只有在運行時才能發現錯誤。這就造成了下面這一個結果,很多人擔心在編寫ruby的代碼的時候是很難發現類型錯誤的,這不像我們通常在java和c#里面期待的那樣。但是,我發現在大多數使用ruby的開發人中并不存在這樣的問題,他們通過測試解決這個問題,尤其是單元測試。我本人是測試的擁護者,我會非常多的使用到測試,不是在當前這個小的演示程序里面,而是在以前的稍微大一些的項目里。如果你使用單元測試,你發現那些類型錯誤的速度將會像在編譯中發現錯誤一樣快捷。我非常喜歡這種特性,尤其是在一開始使用smalltalk建立大型系統的時候。只有在很少的情況下,測試是不能發現類型錯誤的。但是在這樣的語言里面有一個缺點,在閱讀代碼的時候,你不容易理解程序究竟完成了什么,因為在操控這個變量的時候你不能知道他究竟是哪一種類型的。這意味著,ruby還不能像smalltalk那樣有一些強大的調試工具,這樣可以在調試環境里面步進的運行程序,看到變量的類型??傮w來說,我喜歡動態語言帶來的這種靈活性。對象可以被替代,在很多地方都可以作為各種類型被使用。但是在另一方面,它又提高了代碼的可讀性。當你試圖去閱讀代碼的時候,它是比較容易被理解。這就需要看個人的喜好了,有的人喜歡使用靜態的語言,有的人喜歡使用動態的語言。所以,你需要挑選一種更喜歡的語言。很多人認為種類是很重要的,我認為這并不是決定性的。

我認為,ruby的另外一個特性是它具有很強的面向對象的特性。Perl并不是一門面向對象的語言,盡管后來加入了一些面向對象的機制。Python也并不是完全面向對象的。但是ruby在一開始就是面向對象的。在這里我可以展示另外一段代碼。(寫了一段代碼)。所以,在ruby里即使是Nil也有一個類,nothing也是一個對象。這就像smalltalk。一個對象和一個基本的構造類型(primitive build type) 的區別在于:在ruby中,對象就是全部。盡管你看我之前的一些代碼是,你并沒有看到初始化的代碼。Ruby 就是這樣被建立起來的。這里有另一個很不錯的例子。(寫了一段代碼)。我們看到,在這里我們得到了一些很大的整數。你能在java里面用這么簡單的語句實現嗎?不能,因為你需要考慮,當你的值增大到一定程度的時候,你應該如何處理。需要考慮類似于增大位數這樣的事情。有趣的是ruby在后臺這樣做了,但是我們看不到?,F在來輸出它的類型,看看將會發生什么。(寫代碼)這樣做可以使你的輸出居中。這里我們看到,這些數字的類型一開始是“fixnum”,是比較小的整數類。當他增長到足夠大的時候,它需要像在java里一樣,變成比較大的類型bignum. 所以,這里能夠顯示具體的實現類。這就是動態語言的優勢了,用smalltalk甚至可以做得更好,它可以根據你的需要,把數字類型轉換分數,浮點類型等等。所以,ruby具有非常好的面向對象的背景。在這樣的腳本環境中,可以使你的程序具有更好的結構。你可以有一個比較好的速度,好的機制,更好的結構,使你寫出更好的結構性程序。這是不斷結合的結果。

然而,不是ruby里面所有的東西都是好的,它有它的缺點。比較重要的一個問題是,它還沒有一個非常好的開發工具,特別是在你熟練的使用它的編輯器之后,它不能夠像java那樣的開發環境,比如eclipse和我最喜歡的Intelligent J,提供智能的提示,能夠引導程序員編寫代碼。這些在ruby的社區中還不存在。我當前推薦使用的是emacs。這對于人們來說絕對是一個缺點。這些取決于人們究竟投入多少資源。由此而引發的另外一個問題是,我們不能像在java和c#里面那樣進行重構。在動態類型的語言里,進行重構是比較困難的。這也不是絕對的,第一個開發出重構功能的是smalltalk,但是也并不完善。

Ruby的另外一個問題是,ruby在block上的時間并不快。在腳本語言的標準中,它是一門較慢的語言。但是這并不是一個很嚴重的問題。在我們開發的程序中,ruby被用來調用數據庫。跟數據庫的連接和硬件的一些功能相比,ruby還是具有比較好的性能的。但是在其他的一些方面ruby還不是最好的。人們把ruby的API內置到c的library中,是很常見的一種情況,像Perl和Python也是這樣做的。

Ruby的另外一個不足之處在于處理Unicode,Ruby 處理Unicode是很糟糕的。我剛在演示的程序實際上是使用ACSII類型的字符串。你不能像很多人那樣使用Unicode進行代碼。它并不象采用起來那么容易。這個問題將會在下一個版本中得到解決,可是,至少目前看來,ruby不能像java和python那樣,那么好的支持Unicode。

工具和DSL締造Ruby魅力

最有趣的和最值得關注的地方在于它的庫(library)以及框架(framework),一個web 開發的框架。在我們參與的一些項目里面,ruby on rails是一個可以帶來高生產率的web開發框架。在開發企業應用時一個重要的問題是,數據庫的代碼和其他的代碼被糅合在了一起。你必須控制這些代碼,使數據庫的請求是有效的。當數據庫由另外公司不同的部門進行管理時候,這成了非常重要的問題。如果你對數據庫有一定的控制,那么你可以使你的環境變得混亂。Rails是專門針對某些種類的應用程序而設計的,而不是為了解決所有的問題。例如對于互聯網應用,它有著特別的優勢。

Ruby中的另一個吸引人的庫,這也是我個人認為非常有用的是,它能夠管理每一個build版本。在Unix環境中有一個非常著名的,就是可以構建C語言的程序。RAILS這個可以幫助我們描述一個build,我將要在一個小窗口里面展示這個特點, 這會非常有趣。這里是網站上的構建腳本。這里我定義個了任務和依賴。Default任務依賴于all。all任務依賴于這些所有的任務。這里是任務的邏輯代碼,它會去執行這一段代碼。我們往下看,這里有help的函數,這里還有clean任務。熟悉ruby代碼的人會熟悉這些都是在做什么。這里的task就是方法的定義。在default這里,你可以看到一個箭頭指向all,你可以在一個hashtable里面找到對應。這里用到了closure(注:就是前面講到的匿名方法)。所以特殊的build 語言,是有著特殊的用處的。Build文件有自己特別的屬性。你希望列出所有task的分支結構和依賴關系。任何人都想獲取任務間的依賴關系,所以tag標記那一個任務是必須被執行的。我在ruby的代碼里面定義這些任務。在內存中構建這些task, 然后必要任務會被執行。構建我的網站意味著構造700個文件。但是我可以知道哪一個文件是被修改過的,哪一個需要重新構建,然后做最小化的構建,得到我想要的結果。我們發現這個是非常有意思的,它可以記錄很少的歷史信息。這一類的比較早的語言是make語言,通常在Unix系統下使用。Make是一種特殊的文件格式,用來描述怎樣構建代碼,它是一種特殊的domain語言,可以用來構建應用程序。它有它自己的格式和語法,描述怎么樣構建C語言程序。Make存在一個問題,這就是它學習起來并不容易。你也很難去理解那些自動生成的makefile。但是很多程序都有自動生成make文件的能力,因為如果是你自己去寫的話,是不容易掌握的。Java一開始是沒有構建工具的。所以James Duncan Davidson寫了ant用于java的構建。Ant的作者不想讓構建涉及到語法的問題,他們使用xml作為構建的腳本。我并不是在抱怨這個問題,在那個時候xml是不錯的選擇。使用xml語法會有兩個問題。因為語法是十分嚴格的,你需要花很多精力用于關注語法,所以讀懂它執行的操作就變得困難了。另外的一個問題是,當系統越來越大的時候,build文件會包含很多邏輯,就給建立ant文件造成了困難。所以當系統變得很大,建立一個ant的文件來構建系統就會十分困難了。我們需要找到一種方式,從xml中釋放出來,用來構建這些類。

Ruby就是這樣一個強大的語言,在有一定語法限制的情況下,去驗證ruby的語法。Ruby并沒有引入太多新的語法。這看起來還不錯,因為你需要一門新的語言,來實現這個功能。但是你還是有一個局限,就是你不能在ruby以外使用它。但是另一個好處在于,當你需要做非常復雜的事情的時候,你可以使用ruby。所以,你有更強大的能力來完成這件事情。這個外部的語言讓你可以使用它的語法,使你逐漸變得更有能力應對。因為在越來越復雜的時候,它可以幫助你編譯。這種能力是很容易獲得的。它的語法是很直接的,你可以容易的學習。把這樣的語言作為宿主(host)語言是一個很傳統的想法了。但是這是很有用處的。

有的時候,使ruby能夠吸引使用者并不是一件容易的事情。我成為ruby的愛好者已經有幾年了。我致力于把它推廣用于我們的工作中。我告訴別人我喜歡ruby,并且鼓勵別人去使用它。但是在一個產品中使用或者不用并不是非常重要的。我并不推薦所有的工程都使用。但是在最近半年的許多項目里面,我們都使用了ruby。我們發現,在一些工程里面ruby可能并不適合,但是在另一些工程里面使用ruby是非常適合的。這個核心在于,那些成功的案例證明,那樣項目,才是ruby真正適合的。盡管Rails提供了一個大的框架,但是如果不用ruby的話,幾乎不可能成功。這也是項目成功的原因之一。

我的同事正在做的一個項目是需要大量操作數據庫的。把數據從數據庫中取出來,在內存中進行計算,再把數據放回數據庫是沒有必要的。你希望用spl進行這些操作。而使用sql是有一定限制的。它很強大,但是不容易使用。Sql的一個最主要的問題在于,它完全基于domain. 它可以對表格式的數據進行很好的操作,但是沒有把表抽象出來的能力。所以如果你想要對表進行操作,這個是非常好的。但是如果你想進行其他操作,就非常麻煩了。典型的例子是:具有層級結構的數據庫是比較復雜的,用sql來操作它也變得復雜和困難。在這個項目里面,使用了ruby語言,允許輸入domain specific language的ruby, 可以生成sql代碼對數據庫進行操作。這樣的特殊的語言是非常好用的。領域的專家可以脫離出來,去閱讀和理解這些代碼,不用去考慮語法和究竟如何產生這些??梢园丫Ψ旁谄渌牡胤?。ruby這樣的domain specific language的特點使它非常具有吸引力。

Ruby社區令人激動

現在來看幾張照片來總結這個演講。Ruby是一個有趣的系統。我不能說它適合用于任何地方,但是它的確適合用在很多地方。DSL是它的核心。一些特定類型的網站,特別是那些需要用到數據庫的,還有使用RAILS框架的。幾乎所有的administrating work和scripting work都適合使用ruby。你可以開始使用ruby,因為他是一個非常強大的工具。Ruby是我見過的最好的腳本語言,你也會有同樣的體會。在構建方面,Rake(注:ruby的構建工具)是非常好的構建工具。大約在六個月以前,我把我的網站全部換成使用它進行構建和維護這些構建的文件。我想你一定不會后悔的,因為構建和維護這些構建文件都是非常容易的。

在我完成這次演講之前,我還有最后一件事情。當我談論軟件開發的時候,我一直在強調,無論你使用什么樣的工具,什么樣的實踐,比如對編程、測試驅動,關于軟件開發項目成功與否的最重要的因素是工作在項目中的人以及這些人如何一起工作。在敏捷軟件宣言中,首要的價值觀就是個體與交互比過程和工具更重要、更有價值。Ruby值得關注的原因不在于它的特性也不是它的框架,也不是它帶來的在RAILS中的生產率的提高,而是ruby社區成員的工作。Dave Thomas (注:<< pragmatic programmers >>一書的作者)多次提到了這一點,這是正式它吸引我的地方。我在最近的二三年內一直很感興趣。Ruby社區吸引著越來越多高手的加入,從而使它本身不斷進步。另一個優點在于,Ruby的開源作品都可以通過網絡直接安裝,如果你想要使用,那么可以非常容易的通過RubyGem安裝——這是一個package management system。(注:就好像debain的Unix package management system) 。Ruby的社群正在飛速成長,因為不斷有優秀的成員加入到這個團隊,在這個環境中工作,這使得這個團隊非常值得關注。這也是我一直關注ruby的最主要的原因,因為很多值得關注的人都在這個社區里面工作。

這就是我關于ruby的第一次演講。我希望它不是一個語無倫次的演說。

(責任編輯 火鳳凰 sunsj@51cto.com  TEL:(010)68476636-8007)



原文轉自:http://www.anti-gravitydesign.com

...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97