來源:王垠的部落格
在談論到程式語言的好壞的時候,總是有人說:“程式語言只是一種工具。只要你的演算法好,不管用什麼語言都能寫出一樣好的程式。”在本科第一堂程式設計課上,我的教授就這麼對我們說。可是現在我卻發現,這是一個根本錯誤的說法。
我不知道這種說法確切的來源,然而昨天在瀏覽網頁的時候,偶然發現了 C++ 的設計者 Bjarne Stroustrup 的一些類似的說法。這些說法來自於 2007 年 MIT Technology Review 對 Stroustrup 的採訪。
問:一個好的語言是什麼樣的?
Stroustrup:所有能幫助人們表達他們的想法的東西都會讓語言更好。一個語言在一個好的工匠手裡應該能勝任每天的任務。語言是否優美是次要的問題。被認為是醜陋的語言開發出來的有用的系統,比優美的語言開發出來的系統要多得多。
問:優雅難道不重要嗎?
Stroustrup:優雅很重要,可是你如何衡量“優雅”?可以表達問題答案的最少字數?我覺得我們應該看構造出來的應用程式的優雅程度,而不是語言自身的優雅程度。就像你不能把木工的一套複雜的工具(很多是危險的工具)叫做“優雅”一樣。但是我的餐桌和椅子卻真的很優雅,很美。當然,如果一個語言本身也很美,那當然最好。
一些基本的錯誤
對這兩個回答,我都不滿意,我覺得這只是他對於 C++ 的惡劣設計的藉口而已。下面我對其中幾個說法進行質疑:
所有能幫助人們表達他們的想法的東西都會讓語言更好。
作為一個程式語言,並不是好心想“幫助人”就可以說是好的。如果是這樣的話,那麼我就可以把所有國家的髒話都加到你的語言裡面,因為它們可以幫助我們罵人。
被認為是醜陋的語言開發出來的有用的系統,比優美的語言開發出來的系統要多得多。
系統的數量再多也不能說明這個語言好。正好相反,眾多的系統由於語言的一些設計失誤,把人們的生命置於危險之中,這說明了這個語言的危害性之大。一種像炸藥一樣的語言,用的人越多越是危險。
語言不是工具,而是材料
我這篇文章想說的最關鍵的部分,其實是他所支援的“語言工具論”的錯誤。
Stroustrup 說:
我覺得我們應該看構造出來的應用程式的優雅程度,而不是語言自身的優雅程度。就像你不能把木工的一套複雜的工具(很多是危險的工具)叫做“優雅”一樣。但是我的餐桌和椅子卻很優雅,很美。
他的言下之意就是把程式語言比作木工的工具,而餐桌也椅子就是這些工具做出來的產品。比方的威力是很大的,很多人一見到大牛給出這麼形象的比方,想都不用想就接受了。如果你不仔細分析的話,這貌似一個恰當的比方,然而經過仔細推敲,這卻是錯誤的比方。這是因為程式語言其實不是一種“工具”,而是一種“材料”。
木工不會把自己的鋸子,墨線等東西放進餐桌和椅子裡面,而程式設計師卻需要把語言的程式碼放到應用程式裡面。雖然這些程式經過了編譯器的轉化,但是程式本身卻仍然帶有語言的特徵。這就像一種木材經過墨線和鋸子的加工,仍然是同樣的木材。一個 C++ 的程式在編譯之後有可能產生記憶體洩漏和下標越界等低階錯誤,而更加安全的語言卻不會出現這個問題。
所以在這個比方里面,程式語言所對應的應該是木工所用的木料,釘子和粘膠等“材料”,而不是鋸子和墨線等“工具”。這些材料其實隨著應用程式一起,到了使用者的手裡。那麼對應木工工具的是什麼呢?是 Emacs, vi, Eclipse,Visual Studio 等程式設計環境,以及各種編譯器,偵錯程式,make,介面設計工具,等等。這些真正的“工具”醜一點,真的暫時無所謂。
現在你還覺得程式語言的優雅程度是次要的問題嗎?一個複雜而不安全的語言就像劣質的木料和粘膠。它不但會讓餐桌和椅子的美觀程度大打折扣,而且會造成它們結構的不牢靠,以至於威脅到使用者的生命安全。同時它還可能會造成木工的工作效率低下以及工傷的產生。
這也許就是為什麼我的一個同事說,他看 C++ 程式碼的時候都會帶上 OSHA(美國職業安全與健康管理局)批准的護目鏡。