為什么 BIND 10 要用C++和Python來寫
這篇博文是對來自Twitter的這個問題的答復(fù):
@nodakai: 為什么BIND10非要用C++編寫?? 我認為從這個不幸的事件中,托管語言的支持者們有許多需要學(xué)習(xí)了解的地方
當我開始進行BIND 10的項目工作時,***已經(jīng)做的決定就是要使用哪種編程語言,恰逢預(yù)料之中的關(guān)于自行車棚的那次討論之后。 那時最重要的問題是要讓項目繼續(xù)進行,而不是去重啟一場可能永無休止的爭論,一直討論到底要使用哪種(或哪些)編程。
話說到這了,我對所選語言感到非常滿意。實際上,如果開頭就要做這個決定的人是我,我選擇的也是同樣這些語言。
BIND 9 是用C語言編寫的。在它設(shè)計和編寫之時 —— 在20世紀末 —— 這真是一個***合乎邏輯的選擇。C語言在閱讀和編寫方面相對簡單,很多平臺都支持它,并且還能生成運行速度飛快的代碼。 此外,C缺乏能夠支持軟件工程的語言特性,而且完全不安全。
于是,當ISC開始正式考慮BIND 10時 ——大約是2006年左右 —— 就提出了新項目要使用哪種語言的問題。
***個很顯然的問題是,“為什么不用C?” 下面給出部分答案:
·C中的字符串操作實在是個乏味的苦差事
·C缺乏很好的內(nèi)存管理機制
·錯誤處理有隨意性且難弄
·封裝和其它面向?qū)ο蟮奶匦灾荒芡ㄟ^模仿才能實現(xiàn)
大家都一致認為,我們可以做得更好。問題是“怎樣才能準確的做到這一點?”
要選擇一門新的語言,當然要滿足一些要求:
·該語言必須處于相對主流的位置。
Wikipedia上關(guān)于編程語言的頁面 中列出了600多種語言,而且還沒有列完。然而,BIND 10有一個目標是,要讓大家很簡單就能上手。盡管使用類似Eiffel或Prolog的這類語言后,因為它們比較新奇所以有可能會吸引一些開發(fā)者,但對于大多數(shù)程序員來說卻是個難以逾越的障礙。還有第二個理由,ISC要保證,無論選什么語言都必須能夠找到熟練的開發(fā)者。
·該語言必須能夠解決C語言中的絕大多數(shù)問題。
理想情況下,這意味著,該語言必須能優(yōu)雅的處理字符串、內(nèi)存垃圾回收,異常處理,并且還是面向?qū)ο蟮摹?/p>
·該語言在CPU密集型運算方面速度要非???。
現(xiàn)代的DNS服務(wù)器很大程度上是屬于計算密集型的,無論是在有授權(quán)還是在遞歸解析的情況下都是這樣。DNS服務(wù)器要使用特定的數(shù)據(jù)結(jié)構(gòu)和算法,所以我們無法依賴用C或者C++編寫的底層庫。這個要求基本上排除了使用任何解釋性語言的可能性。
我們最終選擇的方式是混合使用兩種編程語言:
Python
只要有可能, 我們都盡量使用Python。Python是一種非常流行的語言, 通常在大多數(shù)調(diào)查中都是嘴流行的腳本語言(可能要除PHP之外)。它具有我們要尋找的所有特性。。。就是在性能方面有點問題。
C++
當有必要時,我們會使用C++.
C++也是一門非常流行的語言, 而且也具有我們要尋找的所有特性。然而,C++絕不是一門很容易就能使用起來的語言,于是我們想了個主意,就是我們在可能的情況下要避免它的復(fù)雜性。
如果你在很早的時候?qū)W過C++但沒有在現(xiàn)在的C++編程環(huán)境下編過程序,你可能會對用它來編程有著一些錯誤的觀點。我們使用了Boost庫,這里面有個共享指針,能提供一種對動態(tài)分配對象的引用計數(shù)的手段。實際上,采用資源獲得即初始化(RAII)后,就能夠解決大量的資源鎖定和泄露問題。
到目前為止,結(jié)果中我們代碼的75%用到是C++,17%用的是Python (鏈接) ,這個結(jié)果表明,BIND 10中的大部分代碼對性能要求都很嚴格。
在選擇語言時,其它的項目會有不同的考慮因素,所以,盡管C++和Python是BIND 10不錯的選擇,但它們可不是適合于每個項目。
但從大的思路上講,為BIND 10考慮語言選擇方面的動因和決策方式在我們的項目開始時很有意義,而且我想它們現(xiàn)在仍然很有意義。
有一件我們可能會以不同方式來作的事是,選擇編寫能夠同時運行于Python 2和Python 3中的代碼,而不是必須要求Python 3。隨著時間的推移,這個問題會變得越來越小,因為Python的未來是Python 3,但這個決定給人們帶來很多苦惱,為了運行個軟件還不得不安裝一個新版本的解釋器,這讓人很不高興。我希望2到3年后,我們能夠笑談這些苦惱,而Python 2已成為一段退色的記憶。
原文鏈接:http://www.oschina.net/translate/programming-languages-for-bind-10