電腦報
在開發業界,每一個時期總有一些代表的人物,代表的技術。STL就是這樣的一門技術,它是那樣深刻地影響了一個時代的C++開發。和一群聰慧的C++程序員談S
TL,就如同和資深的會計師談珠算一般。
今天我們就有幸請到了STL之父Alex Stepanov,為我們溯源STL,你甚至還能讀到對OO與眾不同的理解等內容,希望讀者能有所收獲。
當我面對面見到Alex Stepanov先生時,和像片中的感覺完全不同。從像片上看他, 我們不難對他有威嚴的感覺。但實際上那並非生活中的他——幽默風趣、平易近人才是真正的他。
Alex先生和C++之父Bjarne先生是很好的朋友,Bjarne的推薦對我們的采訪起了重要的推動作用,他告訴我:Alex先生經常有一些有趣的和重要的東西要說。
Alex先生有著非常強烈的個人魅力,他的言辭尖銳,甚至讓人想到“猛烈”“激進”等字眼,這可能也正是他對計算機內涵的深刻體會和精深的數學涵養所致——他的眼裡容不得半粒沙子。
他給我們的忠告很簡潔:“好好學數學,好好學計算機,好好學英語。”
溯源STL
追根溯源,STL起源於什麼?意大利記者的提問或許對我們有所幫助。
問:STL一開始被設想成今天這個樣子嗎?即所謂的C++標准庫,或者,它是從別的什麼項目發展變化來的?告訴我們一些關於STL的歷史好嗎?
Alex:1976年,又要說到原蘇聯了。我因為吃生魚片嚴重食物中毒而住院,在精神恍惚中,我忽然意識到並發的加法計算能力是基於加法是結合性的[譯注:比如說a+b+c+d=(a+b)+(c+d)]。因此,STL可以說是細菌傳染的結果。同時,我意識到並發的減法運算是和半群結構類型有關聯的,這就是最基本的重點:算法是定義於代數結構基礎之上的。我又花了一些年頭,意識到必須在正規公理上加入復雜性必要條件以擴展結構的概念,接著又花了15年之久才完成全面的架構(我直到現在都不能確定我是否成功地讓我朋友小圈子之外的任何人理解了這一點)。我相信迭代器理論是計算科學的中心,就像環或 Banach區間理論是數學的中心一樣。
每次當我找到一個算法時,我都要努力去尋求它所定義的結構基礎。我想做的就是泛化地描述算法,並樂此不疲。我可以花一個月時間去精確地描述一個眾所周知的算法的泛化表示。迄今為止,在向人們解釋我這種行為的重要性方面,我是異乎尋常的失敗。然而,不知何故,這種行為的結果─STL卻是如此成功。
關於STL還有很多故事:STL如何成為C++標准的呢?Alex先生有下面的表述,表述中也有他對C++之父Bjarne先生的精彩描述。
&
nbsp; 問:有一件事情我一直都很驚奇——C++標准委員會那麼快就采納了STL?我的意思是,這些委員會成員可都是以謹慎和保守而出名的。這一點,你怎麼解釋?
Alex:Bjarne的支持是至關重要的。如果說Bjarne想要什麼東西的話,那就是他真的想把STL弄到標准裡,他辦到了。他像騾子一樣固執。甚至逼著我去改STL——我從來都不會為第二個人這麼做——我也是個頑固分子。但他是我所認識的最有主見的人,他花了一些時間去理解STL是干啥的,當他理解之後,他決定使它成功地被大家接受。
他對STL的貢獻還在於他支持“不止一種編程方法是‘合理的’”的觀點——這對立於十來年認同“唯一”方法的無休止的爭執和誇大——而堅持把彈性、效率、重載、類型安全結合在模板裡以至於使STL成為可能。我很樂意明白地聲明Bjarne是我這一代人裡卓越的語言設計家。
問:您是由於什麼原因開發了STL?開發的過程是什麼樣子的?它對您的生活和研究有什麼影響嗎?
Alex:STL的開發源於我多年對程序靈活性和參數化探索的結果。我對此仍不太滿意:因為C++語言上的一些缺陷,使得我不能完全表達我要表達的意思。 STL應當做將來要設計的庫的草稿。我不知道在我有生之年是否能看得到,但我堅信最終會有一個關於算法和數據結構的標准架構,說不定作為讀者的你就是這一發明人呢!
我覺得很難形容STL對我生活和研究的影響。STL並未從本質上改變我的生活,因為我沒有通過它賺到任何錢。我想向我的幾個朋友展示一下正確的編程方法,而 STL正是為他們而做的。事實上將
這項工作完成帶給我很多快樂,當我聽說它幫助某人解決了問題時,我更加快樂。當然也有人說如果讓他們設計,他們可以設計出更好的東西來,也有人對STL嗤之以鼻,這些攻擊也確實傷害到了我。
OO與編程
和STL形成對照的是OO——面向對象。OO的思想困擾著許多程序員,OO的思想一直困擾著我,從未有人對OO表達過如此強烈的想法——除了Alex先生。我想:作為一個程序員,這是一定要掌握的,但是……,請看下面Alex先生的觀點:
問: 您對面向對象是怎樣理解的?它是不是一種好的可接受的編程思考方式?有沒有學習OO必須的有用的工具?
Alex:我盡量避免用OO思考問題,我對他們編程的方法不感冒。在意大利的一家期刊采訪我時我曾說過:“我發現 OOP在技術上是有問題的,它妄圖用基於單一類型的不同接口來分解世界,為了處理不同的實際問題,你需要不同種類的代數方法以橫跨不同類型的接口族;我發現OOP在思想上是不健全的,它聲稱一切都是一個對象。
即使真的是這樣,也沒什麼意思——說一切都是對象跟什麼都沒說一樣;我發現OOP的方法論是錯誤的。它從類開始,就好像數學要從公理開始一樣。你不是從公理開始——你是從證明開始的。直到你找到了一大堆相關證據你才能歸納出公理,以公理結束。編程上存在著同樣的事實:你要從有趣的算法開始。只有很好地理解了算法,你才有可能提出合理的接口讓其他組件共同工作。”我再重復強調一點:程序是描述算法和數據結構的,而不是描述繼承性和多態性的。
問:您認為編程的好方法是什麼?對於編程來說,一種工具是不是必需的?
Alex:我認為學習多種不同的編程語言是非常重要的。我用過Algol-60, Common Lisp, Scheme, Ada, C, C++, Java,和多種匯編語言。然而,也不能僅僅局限於程序語言,它僅僅是種表達算法和數據結構的工具——並且是種有缺陷的工具。如Niklaus Wirth有句精辟的見解:程序=算法+數據結構。
問:您認為計算機語言和人類的語言有什麼區別?
Alex:沒有人嘗試過用計算機語言寫出詩歌來。計算機語言發展到能允許我們解決一些真正美好的現實生活中的東西,還有很長的路要走。