[翻譯]Brian W. Kernighan談程式設計語言

何逸勤發表於2012-04-13

在準備對Brian W. Kernighan的訪談時,發現一篇很有意思的舊訪談,其中談程式設計語言的部分尤有啟發性,於是節譯如下。

問:很多人都是因那本C語言的書而知道你,所以我自然想問幾個關於C語言的問題啦。C無疑是影響深遠,你覺得C語言中最有價值的是哪些特性呢?

**答:**C是我所見過的能力與表現力的最佳平衡。我們能夠以相對直觀的程式設計方式使用它完成幾乎一切任務,同時擁有明晰的心智模型來掌握機器正在做什麼。我們可以合理地預測程式執行的速度、理解執行的狀況,並完全自由地程式設計實現所有事情。C不會約束你的實現方法,也不會強迫你使用特定的程式設計風格。另一方面,C沒有提供數之不盡的工具,也沒有龐大的庫。不過,要不太費力地能把事情做好,我是至今為止都還沒見到比它更好的工具。誠然,其他語言會擅於完成某些應用,但如果被流放到荒島上,只給我一個編譯器的話,我希望那是C編譯器。

問:其實C也是我最喜歡的程式語言,我用C寫了大量程式。但坦白說,自從開始為C語言編寫編譯器,我就沒那麼喜歡它了,因為有些東西非常難以優化。能不能跟我們說一下,從你的角度看,哪些是C裡面比較差的特性呢?

答:我不認為有哪些是“比較差的”。要知道,C語言完全是Dennis Ritchie的作品,而我僅僅是推廣者,更加無法說得出C裡面哪些是容易或難以編譯的。C裡面有些無傷大雅的小錯誤:switch的語法還有改進的空間、某些操作符的優先順序有誤,不過那些都是無關緊要的,大家完全能習以為常。我覺得C裡面真正算得上問題的是它並沒有提供足夠的機制來讓使用者規劃真正大型的程式,或者讓使用者在程式中建立“防火牆”以保持各部分的獨立。我不是說使用者無法用C來做這些事情,只是無法像物件導向程式設計那樣做。我們還是可以模擬這樣的做法,只不過編譯器、C語言本身不起任何作用而已。但是,要知道這是30年前發明的語言(譯註:採訪於2000年),那時候的機器跟現在的相比是小巫見大巫的。C真可謂久經考驗,是令人歎為觀止的作品,我也無法再挑剔其他地方了。

有時候,我還真的用C++而不是C來寫程式。基本上,我認為C++是一門龐大的語言,儘管它的幾乎每一個特性都算得上有的放矢。要是我寫C程式的話,不管程式規模大小,我最終很可能都會用到75%、80%甚至90%的語言特性。換句話說,C語言的大部分特性在幾乎所有型別的程式中都是常用的。然而,如果寫的是C++程式,很可能我都用不到語言中的10%特性,而另外那90%的特性我真的不是太懂。在這種意義上,我會認為C++過於龐大了,不過C++確實提供了在編寫大型程式時需要的東西:使用者可以建立物件、可以保護資料的內部表現而讓其他人無法看到“門後的祕密”。C++擁有大量很有用的機制,而這些是C所沒有提供的。

問:在研究語言設計的時候,我有個疑問。很有趣的事實是,Java被極度誇大了,開發社群因語言中的優缺點而劃出楚河漢界。這門語言本身確實因領域專家的提議而擁有一些很好的特性(例如垃圾收集),而專家們也指出了它的一些不足(例如陣列不應該是協變的)。對當今的程式語言,其實都有整套的研究結果;對函數語言程式設計語言,也出現了非常有意思的研究。不過,我們看到這些研究並沒有對現實世界起到任何影響,也就是說,人們並不會將這些結果應用在實際的語言設計中。相反,各種特定語言如Perl或Python之類的紛紛出現。你覺得問題在哪裡呢?

答:很不幸,這是個非常好的問題。在貝爾實驗室,大力支援函數語言程式設計語言和大量使用特定功效的語言的群體之間有過很多討論。坦白說,我真的不知道為什麼函式式語言沒有成功。我們就說ML語言吧,它可能是兩種語言的最佳結合,照理說是最應該成功的:儘管它是設計得非常優秀的語言,經過眾多高手的深思熟慮,並吸收了編輯器技術的大量新進展,但看來也沒有得到廣泛的應用。我覺得大家唯一使用ML的機會就是編寫ML編譯器了。這樣說可能太武斷,很可能還冒犯了我的那些朋友們。(笑)

我有點言過其實了,但確實有那麼點意思,而原因我真的不知道。從自己的角度出發,我覺得各種函數語言程式設計語言、特別是ML沒有能被廣泛採用的部分原因,在於它們的目標使用者是有數學嚴密性的、能以抽象方式思考的,除外的其他人,包括我自己,用起來都有點困難。反之,像C這樣的語言是操作性很強的,使用者可以非常直觀地把程式中的每一部分對應到機器的執行情況。如果是在不同的時空下成長,那我說不定會對ML如魚得水,而覺得C不太安全、有點危險、表達力也不足。總之,我的感覺是,函式式語言來自於更偏向數學化的社群,要求一系列相應的邏輯數學能力,而這樣對普通人來說是有點困難了。

問:我猜,對那些研究者而言,你的建議是不是放下語言的層次之爭,而設法提升優良品質呢?

答:我前面並沒有回答你那問題的另一部分:為何對語言的研究並沒有起到應有的效果。我認為它其實在諸如語法分析器技術、程式碼生成等方向是有效果的。對所有的語言,這些研究在建立語言工具方面都影響巨大,而對語言本身的設計的影響則會小一些。

成功的語言都很注重實效,常常還有點不擇手段,因為它們試圖解決的是實際問題。要說有嚴重缺陷的語言,C++可算很好的示例。其中一個缺陷就是它不顧一切地要跟C相容:在物件層面要相容、在原始碼層面也要密切相容。因此,語言中就會有些很彆扭的地方:古怪的句法問題、異常的語義行為等。在某種意義上這是不好的,沒有人想這樣做。但是,C++成功的其中一個原因恰好就是與C的相容性:可以使用C的庫、現成的C程式設計師群體都懂得用C++,因此大家都會來使用,而且是不需要重新學習開發的新方法就能高效地使用。ML就不是這樣,它幾乎在同一時間、同一地點完成,但卻以完全不同的視角看待世界。作為注重實效的產物,C++非常成功,但也因要與已有語言相容而付出了相當代價。


相關閱讀:

“圖靈訪談”系列的更多精彩內容

相關文章