Skip to content

Commit

Permalink
review c
Browse files Browse the repository at this point in the history
  • Loading branch information
ihower committed Jul 30, 2010
1 parent fd14216 commit 71a197b
Showing 1 changed file with 14 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -1,36 +1,32 @@
由於Ruby跟C/C++的差異實在太大,很難將兩者間的差異一項一項列出。其中一項差異是:Ruby和C語言的「No hidden mechanism」完全處在兩個極端上。Ruby選擇讓其自身的執行期環境(Runtime)負擔加重,以便讓人們的工作更輕鬆。在你開始對你的Ruby程式碼做最佳化之前,你不需要關心編譯器的臉色如何。
由於 Ruby 跟 C/C++ 的差異實在太大,很難將兩者間的差異一項一項列出。其中的一個重要理由是:Ruby 和 C 語言的「不隱藏內部機制(No hidden mechanism)」原則完全處在兩個極端上。Ruby 選擇讓人們的工作更輕鬆,但讓執行期環境(runtime)負擔加重。除非你要開始對你的 Ruby 程式碼做最佳化,你不需要關心編譯器的臉色如何。

也就是說,你的Ruby程式碼將會比等價的C/C++程式碼慢的多。然而,你也會驚訝於只需要寫多麼少的程式碼,便可以多麼迅速的完成你的Ruby程式。Ruby能完全滿足你的需求,又比C++簡單的多。
也就是說,你可以預期 Ruby 程式將會比等價的 C/C++ 程式慢的多。然而,你也會驚訝於只需要寫這麼少的程式碼,就可以迅速地完成你的 Ruby 程式。Ruby 能完全滿足你的需求,又比C++簡單的多。

Ruby是動態型別(Dynamically typed),而不是靜態型別(Statically typed)的程式語言。Ruby的執行期環境(Runtime)會盡可能的處理所有工作。舉例來說,你不需要事先知道你的Ruby程式將會被連結(link)到哪一個模組,或是哪一個方法(method)將會被呼叫。
Ruby 是動態型別(Dynamically typed),而不是靜態型別(Statically typed)的程式語言。Ruby的執行期環境(runtime)會盡可能的處理所有工作。舉例來說,你不需要事先知道你的 Ruby 程式將會被連結(link)到哪一個模組,或是哪一個方法(method)將會被呼叫。

幸運的是,Ruby與C有著良好的共生關係。Ruby支援所謂的「擴充模組。」這些由C語言寫成的模組能讓在你的Ruby程式中使用(而且看起來與一般Ruby模組無異。)因此,你可以將你的Ruby程式中影響效能最大的部份劃分出去,並且用純粹的C語言來完成這些部分
幸運的是,Ruby 與 C 有著良好的共生關係。Ruby 支援所謂的「擴充模組」。這些由 C 語言寫成的模組能夠在 Ruby 程式中使用(而且看起來與一般 Ruby 模組無異)。因此,你可以將你的 Ruby 程式中影響效能最大的部份劃分出去,用純粹的 C 語言來完成這些部分

最後,Ruby本身理所當然的是用C語言寫成
最後,Ruby 本身理所當然的是用 C 語言寫成



h3. 與C語言的相同之處
h3. 與C語言的相似之處

與C語言相同,在Ruby中...
* 你可以用程序式的方式寫程式(但是底層依然是物件導向的環境。)
* 大多數的運算子都是相同的。(包含複合運算子跟位元運算子。)然而Ruby並沒有@++@或是@--@運算子。
* 你可以使用@__FILE__@ 與 @__LINE__@。
* 你可以定義常數。雖然並沒有特殊的@const@關鍵字,Ruby利用命名的慣例來強迫變數為常數:第一個字母為大寫的變數便為常數。
* 你可以定義常數。雖然並沒有特殊的 @const@ 關鍵字,Ruby利用命名的慣例來強迫變數為常數:第一個字母為大寫的變數便為常數。
* 字串由雙引號包住。
* 字串是可變的。
* 就像man page一樣,你可以利用@ri@指令在終端機視窗中閱讀大多數的文件。
* 你也有一樣的指令列debugger可以使用。



h3. 與C++的相同之處

與C++相同,在Ruby中...
* 大多數的運算子都是一樣的(包含@::@),@<<@常常用來將元素串接在list之後。要注意的是:Ruby中你不需要使用@->@,永遠只需要@.@。
* @public@,@private@,與@protected@的功能在兩者是類似的。
* 物件的繼承一樣只需要一個字元,只是從@<@變成了@:@。
* 你可以將你的程式碼放進模組(module)之中,類似C++中的@namespace@的作法。
* 物件的繼承一樣只需要一個字元,只是從 @:@ 變成 @<@。
* 可以將你的程式碼放進模組(module)之中,類似 C++ 中的 @namespace@ 的作法。
* 例外(Exceptions)的運作方式類似。雖然為了保護無辜的人們,我們把關鍵字改了。


Expand All @@ -43,7 +39,7 @@ h3. 與C語言的不同之處
* 沒有標頭檔(header files)、沒有typedef、沒有sizeof、也沒有enums。
* 沒有<tt>#define</tt>。用常數來代替他們便可。
* 在Ruby 1.8中,程式碼在執行期才被解譯,而不是被編譯成任何一種機械語言或是byte-code。
* 所有的變數都存放在堆疊(heap)中。因此,你不需要自行釋放他們,Garbage collector會處理他們
* 所有的變數都存放在堆疊(heap)中。因此,你不需要自行釋放他們,垃圾回收機制(Garbage collector)會處理他們
* 方法的參數是傳參考,而非傳值。
* 用 @require 'foo'@ 而不是 @#include <foo>@ 或是 @#include "foo"@。
* 你不能在程式碼中插入組合語言。
Expand All @@ -52,7 +48,7 @@ h3. 與C語言的不同之處
* 呼叫方法的括號通常是選擇性的。
* 你不會常常使用大括號。一般只需要使用 @end@ 關鍵字來結束一個多行的區塊(像是 @while@ 迴圈。)
* @do@關鍵字被稱作「block」,Ruby中沒有C語言的「do statement。」
* 「block」這個詞在Ruby中有著不同的意義。它是指一段可以結合到一個方法呼叫的程式碼,使得該方法的本體在執行時可以呼叫該段程式碼。
* 「block」這個詞在 Ruby 中有著不同的意義。它是指一段可以結合到一個方法呼叫的程式碼,使得該方法的本體在執行時可以呼叫該段程式碼。
* 你不需要事先宣告變數,當你需要一個變數時直接使用一個新名字就可以了。
* 當測試真值的時候,除了 @false@ 與 @nil@ 之外的東西都視為真(包含 @0@,@0.0@,以及@"0"@。)
* Ruby沒有字元(char)型別,只有長度為一的字串。
Expand All @@ -62,8 +58,6 @@ h3. 與C語言的不同之處
* 如果你將兩個陣列相加,你會得到一個更大的新的陣列,而不是指標運算的結果。
* 大多數的情況下,一切都是一個運算式。(也就是說,@while@之類的東西實際上會被當做一個rvalue。)



h3. 與C++的不同

與C++不同的是,在Ruby中...
Expand All @@ -78,9 +72,9 @@ h3. 與C++的不同
* 本質上,Ruby沒有多重繼承。然而,Ruby可以使用"mixin"。(也就是說,你可以「繼承」某個模組的所有方法)
* 呼叫方法時的括號通常都可以省略。
* 你可以在任何時候重新打開一個類別以加入新的方法。
* 你不需要C++的template機制。(因為你可以將某個變數設值為任何一種物件,型別將在執行期自動辨識。)你也不需要轉型。
* 你不需要 C++ 的 template 機制。(因為你可以將某個變數設值為任何一種物件,型別將在執行期自動辨識。)你也不需要轉型。
* 迭代(Iteration)的運作方式有些許不同,Ruby中你會讓你的物件mixin @Enumerator@模組並且直接呼叫 @my_obj.each@ 方法,而不是使用一個獨立的迭代器(Iterator)。
* Ruby只有兩種容器類別:@Array@跟@Hash@。
* Ruby沒有型別轉換,你也會發現在Ruby中你不需要它們。
* Ruby內建了多執行緒。但是在Ruby 1.8之中只有"green threads"(只在直譯器中有效的執行緒,)而不是原生的執行緒。
* Ruby的標準函式庫中就包含了Unit test函式庫
* Ruby內建了多執行緒。但是在Ruby 1.8之中只有"green threads"(只在直譯器中有效的執行緒),而不是原生的執行緒。
* Ruby的標準函式庫中就包含了單元測試(Unit test)函式庫

0 comments on commit 71a197b

Please sign in to comment.