Re: [連結] 松本行弘: Code 的世界~成為超級程式設 …

看板Ruby作者 (Eric)時間15年前 (2009/08/09 13:59), 編輯推噓14(1400)
留言14則, 14人參與, 最新討論串11/16 (看更多)
拿到書了,片段片段摘譯了前言與第一章的部份內容。歡迎指教有問題的地方。 (有些地方也沒辦法看得很懂...) = 前言 = 本書並非深入講述特定技術的書籍,也不是 Ruby 解說書,而是俯瞰程式 開發技術的一本書。不是詳細地圖,而是技術的世界地圖。 每種技術和考慮都有其目的與歷史,以及發展和進步的經緯。本書嘗試退 一步重新思考這些技術。 本書 2~14 章是以 2005/5 ~ 2009/4 間在日經 Linux 雜誌連載的專欄為底, 添加內容與修正。第一章「我為何要開發 Ruby」則是新寫的。 = 第一章 我為何要開發 Ruby = Ruby,在日本誕生的程式語言,近年來特別因為在 Web 方面的高生產力而 受到世界注目,應用範圍也廣及企業領域。 不過一開始也不是因為要讓世界使用等理由而開發的,只是身為工程師的 我為了興趣而開始的。 若問我為何要開發 Ruby,最適當的答案應該跟 Linux 開發者 Linus Torvalds 所說的一樣: "Just for fun" 從高中開始學寫程式時,不知怎麼的就被程式語言吸引。周遭喜歡電腦的 人通常是「想做遊戲」、「想計算」等「要寫什麼程式」,而我則被「要 用什麼程式語言」、「用什麼程式語言會更愉快」這些事情沒來由地吸引。 高中時還沒有自己創作程式語言的技術與技術,連自己的電腦也沒有。但 是讀了程式語言的文章與書籍,後來大學時研究主題選了程式語言,十年 後以 Ruby 的形式實現了夢想。 1993 年開始創作 Ruby 以來雖經過 16 年,中間從沒有討厭或厭煩了 Ruby 的設計過。程式語言真的很有趣。 == 程式語言的重要性 == 因為語言是人類思考的本質。語言會影響說話者的思考。(這裡還提到 Sapir-Whorf 假說,請見 http://tinyurl.com/krz6nv ) 20 年來的名著「人月神話」也提到「程式人員一定時間內能產出的程式碼 行數是一定的,不論用什麼語言」。假設這是真的,那麼一天五百行, 用組合語言,C,或是 Ruby 都是五百行。 但這五百行能做到的事有天壤之別,根據選擇的語言,可能有十倍百倍甚 至千倍的差距。 沒有軟體的電腦只不過是個箱子,能夠更快速更便宜地開發程式語言是我們 所企求的。 寫程式不只是為了樂趣,還要為了社會整體變化追求高生產力。程式語言 因此成了解決軟體危機的重要工具。 == Ruby 的原則 == Ruby 原來只是我為了興趣而作的,其設計參考了古今東西的語言,這個功 能好,那個功能有點... 等,在之間取捨平衡與選擇。 什麼都不思考就拿進來的話,會成為扭曲的語言,喪失新語言的存在價值。 語言設計困難之處就在這之間的取捨,幸好 Ruby 在這方面做得不錯,許 多人都給了不錯的評價。 Ruby 的目標是為了讓我(設計者)能夠快樂地寫程式,並因此提高生產力。 因此,有以下三個設計原則: * 簡潔性 * 延展性 * 安定性 == 簡潔性 == Paul Graham 說「簡潔就是力量」。 隨著程式語言進步,我們能夠更簡潔地書寫,更抽象化。電腦性能提昇也 讓以前程式語言不允許的事情變得可能。 譬如物件導向語言,執行時成本較高,但現在是能允許的。為了能提高開 發生產力,稍微浪費一些電腦性能,在現在這時代大家也不會生氣。 另外像是記憶體管理,現在就交給 garbage collection。變數型別在執行 期才檢查。 來看看階層計算的例子。 圖一 Java class Sample { private static int fib (int n) { if (n<2) { return n; } else { return fib (n-2) + fib (n-1) ; } } public static void main (String[] argv) { System.out.println ("fib (6) ="+fib (6)) ; } } 圖二 Ruby def fib (n) if n<2 n else fib (n-2) + fib (n-1) end end print "fib (6) =", fib (6) , "\n" 演算法相同,但 Ruby 的看起來密度較低。Ruby 不需要明確給定型別, 不必要的型別指定可以省略,因此可以較簡潔。 演算法教科書使用虛擬程式碼來描述演算法,若要實際使用,就要處理類 似指定型別這些非本質的部份,而無法集中在演算法的本質部分。 如果能直接執行虛擬程式碼不是很好嗎?像 Ruby 這樣以高生產力為目標 的語言就是這種「可執行的虛擬程式碼」。 == 延展性 == 1999 年第一本 Ruby 書寫到 Ruby 不適合的領域是「數值計算為主體的 程式」以及「數萬行的程式」。不過在幾年後,已經有數十萬行的程式, 連 NOAA 及 NASA 也在使用 Ruby。 為了程式語言的延展性,需要「抽象化」 (abstraction)。Ruby 開發當時 (1993) 沒什麼人認為可以在 script 語言裡用物件導向程式,連內建型 別都是都以 class library 方式提供的可說是相當稀奇。之後看 Ruby 的成功,我想這個判斷是成功的。 Ruby 的延展性可不只這些。 例如像 Lisp 的一樣的高階函式語言內的 block,用程式人員容易理解的 方式提供,將控制結構 (control flow) 這種高階函數語言中也能讓使用 者自行定義的延展性提供給「普通人」。另外,能夠自由擴充既存 class 的 open class,也提供了更大的彈性(以若干危險性交換)。 這些功能的共通點是,對程式語言來說,對程式人員提供最大程度的延展 性的這種態度。另外,不是保護程式人員寫錯的安全性,而是重視能自行 負責、提供最大程度能力的彈性。身為 Ruby 設計者的我是 Ruby 最初的 target user,因此,比起保護自己,能夠發揮自己最大程度的力量更為重要。 關於延展性,還有一個不能不提的是,「沒有先入為主的限制」。例如初 期的 Unicode(全世界文字只需 16-bit 即可容納),西元年份兩位就夠 引起的 Y2K 問題等。Ruby 整數的表現範圍沒有限制,盡力做到排除這種 先入為主的限制。 == 安定性 == 即使是非常重視延展性的 Ruby 也有長年拒絕加入的功能,也就是巨集 (macro),特別是 Lisp style 的巨集。有了巨集,可以隨意擴充語言。 為了 Ruby 拒絕此功能?因為此功能會造成各程式發展到最後就如同不同 語言一般,有不同的文法與單字。 程式設計除了寫以外,讀也會花許多時間。解讀時的路標就是語言的文法。 「這裡是呼叫函式」、「這裡是條件分支」等常識在解讀程式時是很重要的。 若導入巨集功能,會引起嚴重的副作用,這裡到底是函式呼叫,控制結構, 還是要代入什麼,得再查文件才能知道。 嗯,也許世界上也有不會為此所苦的 Lisp 程式人員,不過我認為這只是 少數人。 要能在世界上普及的程式語言,我相信必須要有「不為風所搖動的核心」 的文法。 == 都是為了樂趣 == 程式語言存在目的是為了生產程式,以及盡可能有效率地生產。還有與程 式設計的快樂連結在一起。 在國外活動等演講後,有許多人跟我交談,其中典型的就是「用了 Ruby 以後又能快樂地寫程式了,謝謝。」 寫程式本來就很快樂,是既刺激又富創造性,讓人興奮的知識活動。我想 起中學時用 BASIC 這種貧弱的語言寫程式時也很快樂,不過也有因為工作、 期限等而造成不快樂的程式撰寫,這是世間常情。 即使如此,Ruby 所提供的生產力若能解開程式人員身上的枷鎖,重新找回 程式設計的樂趣的話,那就是我開發 Ruby 的理由。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.31.3

08/09 14:17, , 1F
感謝分享!
08/09 14:17, 1F

08/09 16:43, , 2F
翻譯得很順暢 :D
08/09 16:43, 2F

08/09 17:08, , 3F
感謝您的翻譯,看的很快樂XD
08/09 17:08, 3F

08/09 17:12, , 4F
有看有推
08/09 17:12, 4F

08/09 18:04, , 5F
感謝翻譯及分享,我也覺得很快樂。
08/09 18:04, 5F

08/09 23:49, , 6F
不知翻譯得如何,但是文章超順的
08/09 23:49, 6F

08/10 00:14, , 7F
感謝分享!
08/10 00:14, 7F

08/10 10:41, , 8F
推推 太棒啦 還有續集嘛XDDDD
08/10 10:41, 8F
※ 編輯: ericyu 來自: 140.112.31.3 (08/10 19:06)

08/10 21:47, , 9F
感謝翻譯, 看了這篇解開我對 macro 的一些疑問
08/10 21:47, 9F

08/12 23:46, , 10F
推 看起來是很直得一讀的書
08/12 23:46, 10F

08/13 16:25, , 11F
看到 ericyu 大神快拜 m(_ _)m
08/13 16:25, 11F

08/14 22:58, , 12F
m(_ _)m
08/14 22:58, 12F

05/25 02:53, , 13F
看到還蠻想弄一本來看的
05/25 02:53, 13F

07/23 15:41, , 14F
感謝~翻譯得很好!
07/23 15:41, 14F
文章代碼(AID): #1AVcNCGX (Ruby)
討論串 (同標題文章)
文章代碼(AID): #1AVcNCGX (Ruby)