“D語言之父”Walter Bright為《D程式設計語言》寫的序
Andrei Alexandrescu
世界頂尖的C++專家,2001年撰寫了經典名著《C++設計新思維》(Modern C++ Design),曾榮獲2001年最佳C++圖書稱號,書中所開發的Loki已經成為最負盛名的C++程式庫之一。他被認為是新一代C++的代表人物,因為對Template技術的精湛運用,震撼了整個C++社群,開闢了C++程式設計領域的“Modern C++”新時代。他還與Herb Sutter合著了《C++程式設計規範》(C++ Coding Standards)。他花了8年的時間攻讀機器學習方面的博士學位,專門研究部分自然語言處理結構。自2006年開始,他與D語言的最初設計者及實現者Walter Bright緊密合作,設計和實現D語言及其標準庫,他是D語言很多特性的設計者,也是大多數D語言標準庫的作者。Andrei Alexandrescu在工業界和學術界都有很高的聲譽。現為Facebook研究員。
Walter Bright序
記得很久以前,我讀過一本科幻小說,其中有這麼一行:科學家在可能擴充其研究領域知識的時候,就應該勇往直前。簡單地講,它揭示了想要成為一名科學家所應具備的潛質。值得一提的是,在物理科學家Richard Feynman的影像資料和著作中,無處不體現著發現的樂趣,而且他對科學的熱情也極具感染力和非常迷人。 儘管我不是科學家,但我明白他們的動機。我的動機跟工程師的動機一樣——享受創造的樂趣,從無到有把某樣東西建造出來。有一本我很喜歡的書The Wright Brothers as Engineers,作者是Wald,書中記錄了萊特兄弟在克服一個又一個飛行難題之後逐步前進的過程,同時還記錄了他們如何應用這些知識來建立飛行器的過程。
我早期的興趣與Brinley所著的Rocket Manual for Amateurs開篇中所概述的內容一樣:“燃燒與爆炸的事物總是讓人激動和著迷”。後來又變成想去構建一些能跑得更快和飛得更高的事物。
不過構建功能強大的機器耗資巨大,於是我發現了計算機。它最神奇的地方在於可以讓你輕鬆地去構建某些事物,又不需要昂貴的製造車間和機械工廠,甚至連一把螺絲刀也不需要。只需要一臺花費不多的計算機,你就可以創造世界。
就這樣,我開始在電腦裡建造虛擬世界。第一個作品便是遊戲Empire——世紀之戰。由於當時電腦的處理能力實在太弱,這個遊戲根本就沒辦法正常執行,因此我又開始對如何優化程式的效能產生了興趣。此興趣讓我開始對可以生成程式碼的編譯器進行研究,自然而然便發展到了“我能寫出比它更好的編譯器”這樣一種自負。因迷戀C語言,我迫切希望實現一個C語言編譯器。這個也不是太難,大概只用了幾年的空餘時間。後來我又發現了Bjarne Stroustrup的C++語言,於是我認為再花上幾個月的時間應該能夠將那些擴充套件新增到我的C語言編譯器裡。
十多年後,我仍然在為此努力。在實現這個編譯器的過程中,我對C++語言的每一個細節變得非常熟悉。為一個龐大的使用者群提供支援意味著能體驗到其他人對此種語言的大量的認知:起作用的是什麼,而什麼是沒用的。我不會不加思索地去改進設計。在1999年,我決定將這一想法付諸實踐。開始時它叫作Mars程式語言,而我的同事最初是開玩笑地稱其為D語言,不過這個名稱後來被延用下來,D語言由此誕生。
在撰寫本文時,D語言已有十個年頭,而且已演變到了第二代,有時也叫D2。在這段時期裡,D語言已從由一個人敲打著鍵盤開發它,發展到由一個全球性的開發者社群來解決它方方面面的問題,以及為庫和工具的生態系統提供支援。
D語言自身(本書的焦點所在)已從卑微的初級階段成長為一門功能非常強大的語言,它擅長從多種角度解決程式設計問題。據我所知,D語言前所未有地將多種強大的程式設計範型(programming paradigm)巧妙地整合在一起:命令式(imperative)、物件導向(object-oriented)、函式式(functional)以及元式(meta)。 乍一看,這門語言肯定不簡單。的確,D語言不是一門簡單的語言。但我認為這是一種錯誤地看待一門語言的方式。更恰當的方式應該是:這門語言的程式設計解決方案看起來的樣子像什麼?D語言程式是複雜愚鈍還是簡潔優雅呢?
我有一位同事,他有著豐富的企業環境開發經驗。他注意到IDE(Integrated Development Environment,整合開發環境)是一個相當重要的程式設計工具,因為只需單擊一下滑鼠就會有數百行的樣板程式碼生成。對D語言來說,IDE不是不可或缺的,因為D語言並不依賴基於嚮導式的樣板程式碼。通過自省(introspection)和生成功能,它讓自己不再依賴於使用樣板。程式設計師不必看到樣板,負責程式內在複雜性的是語言,而非IDE。 例如,有人想要用更簡單一些的語言(對範型沒有特別的支援)來進行OOP(物件導向程式設計)設計。這也是完全可能的,但這種做法糟糕透頂,而且毫無價值。當有一門更為複雜的語言直接支援OOP時,編寫OOP程式就會變得簡潔優雅。語言越複雜,使用者程式碼就越簡單。這才是值得去做的事情。
必須有一種可以支援多範型的語言,才能支援以簡潔優雅的方式為各種型別的任務編寫使用者程式碼。正確編寫的程式碼在頁面上看起來應該是賞心悅目的,說來也奇怪,漂亮的程式碼往往就是正確的程式碼。我不確定兩者之間存在什麼樣的聯絡,但確實如此。與好看的飛機常常都飛得很好是一樣的道理。因此,讓演算法可以以一種漂亮的方式來進行表達,這樣的語言特性肯定會是件好事情。
然而,編寫程式碼時的簡潔優雅並不是衡量一門程式語言好壞的唯一標準。當前,程式的規模在無止境地迅速增長。隨著這種變化,依賴於慣例和程式設計方面的專長以確保程式碼的正確性變得越來越不實際;相反,依賴於使用機器進行檢查的保證正變得越來越有價值。為此,D語言提供了多種策略,讓程式設計師可以使用它們來實現這類保證。這些策略包括契約(contract)、記憶體安全(memory safety)、各種函式屬性、不變性(immutability)、劫持保護(hijack protection)、作用域守護(scope guard)、純潔性(purity)、單元測試(unit test)、執行緒資料隔離(thread data isolation)。
我們並沒有忽視效能!儘管有預言說效能不再那麼重要,儘管現在計算機的執行速度比我編寫第一個編譯器時快了上千倍,但對更快速程式的需求卻從未改變。D語言是一門系統程式語言。這預示著什麼呢?從某種意義上講,它意味著使用D語言除了能編寫裝置驅動程式和應用程式外,還可以用來編寫作業系統。在更為技術的層面,它意味著D語言程式可以訪問機器的所有功能,即可以使用指標、進行指標別名和指標運算、繞過型別系統,甚至可以使用匯編語言編寫程式碼。沒有什麼是D語言程式設計師無法訪問的。例如,D語言的垃圾回收器實現就完全是使用D語言編寫的。
請等等!這怎麼可能?一門語言怎麼能同時提供可靠的保證和隨意的指標操作呢?答案就是這種保證是基於語言所使用的概念。例如,函式屬性和型別建構函式可用於實施編譯時的保證,而契約和不變數(invariant)則專門用於執行時實施的保證。
D語言的大部分特性都曾以這樣或那樣的的形式出現在其他語言裡。任何特定的單個特性都無法造就一門語言,但它們組合後所產生的作用卻能超過單個部分所起作用的總和,D語言的組合造就了一種令人滿意的語言,它以優雅和直接的方式來解決各式各樣的程式設計問題。
Andrei Alexandrescu因其不拘一格的程式設計思想而著名,這些思想已成為新的主流(請參考他的重要著作Modern C++ Design)。Andrei於2006年參與到D程式語言的設計團隊。他擁有堅實的程式設計理論基礎,以及無盡創新性的針對程式設計設計問題的解決方案。D2的成型主要歸功於他,本書在許多方面都跟隨著D語言一起在演變。在這本關於D語言的著作中,你會欣喜地發現這樣一件事件,即其中包含的是很多關於設計選擇的原因,而非枯燥乏味的事實陳述。瞭解一門語言為什麼會是這個樣子能讓人更容易和更快速地理解它,並讓程式可以執行得更快。
使用D語言來解決大量基礎性的程式設計問題,Andrei不斷地採用這種方式以求闡明其中的原由。因此,他不僅展示了D語言是如何工作的,而且還說明了它為什麼會工作以及如何使用它。 正如我已把D語言融入我的生活一樣,希望你也能在D語言程式設計過程中獲得樂趣。在Andrei的這本書裡,每一頁都令人興奮不已,相信你一定會受益無窮。
Walter Bright
2010年1月
相關文章
- D程式語言基礎篇
- 利用 D 程式語言實現文字識別程式
- ‘程式語言‘ ’程式設計工具’程式設計
- c語言程式設計題C語言程式設計
- 函數語言程式設計函數程式設計
- JAVA語言程式設計思想Java程式設計
- 程式語言設計,程式設計哲學程式設計
- 程式設計中的遞迴(C語言為例)程式設計遞迴C語言
- Scala 函數語言程式設計(一) 什麼是函數語言程式設計?函數程式設計
- Java語言程式設計—迴圈語句Java程式設計
- 編譯warp,d語言寫的c/c++前處理器.編譯C++
- C語言程式設計規範——名稱縮寫C語言程式設計
- RAC的函數語言程式設計函數程式設計
- 何為程式語言?為什麼要學C語言?C語言
- 【譯】你的程式語言能做到這個嗎?(為什麼要學函數語言程式設計)函數程式設計
- 函數語言程式設計,真香函數程式設計
- Go 語言程式設計規範Go程式設計
- Go語言併發程式設計Go程式設計
- CWK100程式設計語言程式設計
- 結對程式設計(c語言)程式設計C語言
- python函數語言程式設計Python函數程式設計
- javascript函數語言程式設計JavaScript函數程式設計
- JavaScript 函數語言程式設計JavaScript函數程式設計
- Java 函數語言程式設計Java函數程式設計
- Python函數語言程式設計術語大全Python函數程式設計
- 學寫PEP,參與Python語言的設計Python
- 計算機程式語言的分類,解釋型語言、編譯型語言、指令碼語言的關係計算機編譯指令碼
- Facebook 開源 Skip 物件導向+函數語言程式設計語言物件函數程式設計
- JavaScript中的函數語言程式設計JavaScript函數程式設計
- C++的函數語言程式設計C++函數程式設計
- 為什麼自制指令碼語言是程式語言的最高境界?指令碼
- python函數語言程式設計一Python函數程式設計
- python函數語言程式設計二Python函數程式設計
- awk指令碼語言程式設計指南指令碼程式設計
- C 語言程式設計利器之 CLion程式設計
- JavaScript 函數語言程式設計(一)JavaScript函數程式設計
- JavaScript 函數語言程式設計(三)JavaScript函數程式設計
- Battleship程式設計語言與技術BAT程式設計
- 函數語言程式設計前菜函數程式設計