當前位置:首頁 » 編程軟體 » 中國編譯器高手

中國編譯器高手

發布時間: 2024-11-24 04:29:20

㈠ 從c語言到fpga高手,我是怎麼煉成的

這些日子我一直在寫一個實時操作系統內核,已有小成了,等寫完我會全部公開,希望能夠為 國內IT的發展盡自己一份微薄的力量。最近看到很多學生朋友和我當年一樣沒有方向 ,所以把我的經歷寫出來與大家共勉,希望能給剛入行的朋友們一點點幫助。一轉眼我在IT行業學習工作已經七年多了,這期間我做過網頁,寫過MIS、數據 庫,應用程序,做過通信軟體、硬體驅動、協議棧,到現在做操作系統內核和 IC相關開發,這中間走了很多彎路,也吃了不少苦。
我上的是一個三流的高校,就連同一個城市的人多數都不知道。因為學校不好也就沒有指望能靠學校名氣找一個好工作。所有的希望都寄託在自己的努力上了, 大一開學前的假期我就開始了學習,記得我買的第一本書是《計算機基礎DOS3.0》,大家別嚇著了,其實當時已經普及了DOS6.22了,只是我在書店裡 看到了DOS4.0,5.0,6.0的書,以為像英語那樣是第四、五、六冊,記得當時到處找DOS1.0,現在想想也幸好我沒有找到:)開學前我學完了 PASCAL,那時既沒有計算機也沒有人可以請教,我連程序是什麼的概念都沒有,只好死記硬背代碼,然後拿紙寫,我一直到大三才有了一台486,在這之前 用紙寫了多少程序我也記不清楚了,只知道最長的一個我拿A4大小的草稿紙寫了30 多頁,我的C語言、C++ 、VC都是在這樣的條件下入門的。所以說條件是可以克服的,希望我的經歷多少給條件艱苦的同學們一點信心。第一次上機是在我姐夫的機房,我的心情激動的無 與倫比,但是一上機我立刻傻了眼,他們用的是英文版的Win3.1,我的那點DOS知識都見了鬼,上機提心吊膽的一陣瞎摸,一不小心把Word弄成了全 屏,怎麼都還不了原,當時真是心急如焚,我以為機器被我弄壞了。第一個C語言程序,就是那個經典的HelloWorld,我調了幾個星期,上機機會非常 少,也沒有書告訴我開發環境(TC2.0)需要設置,而且開始我都不知道有編譯器,我甚至自作聰明把寫好的程序擴展名從.c改成.exe,結果可想而知。 大一學完了C、X86的匯編、數據結構、C++。由於精力都花在自學上了,大一下四門課掛了彩,三類學校就是這點好,掛上一二十門也照樣畢業。不過扯遠點 說,我那麼刻苦都及不了格,可見我們國家的計算機教育有多死板。
大二准備學VC和BC,當時難以取捨,後來選了VC,不為別的,只為書店裡兩本書,VC 那本便宜6塊錢。我的努力在班上無人能及,學的日夜不分,大三有了計算機後更是如此,很多次父親半夜教訓我說我不要命了,我一直覺得自己基礎差,記憶又不 行,條件也不好,所以覺得只有多花點時間才能趕上別人。居然後來有許多朋友說我有學計算機的天賦,讓我哭笑不得。我用的是486,16M內存,1G硬碟, 當時同學們的配置都是P166MMX,我安裝 一個Windows NT4.0需要一個通宵,編譯一個BC5.0向導生成的程序需要近兩個小時,我的顯示器是個二手的,輻射非常大,開機屏幕冒火花,看起來很酷的:),有一 次程序寫的太久,覺得怎麼白色的編輯器背景變成了紫色,以為顯示器壞了,後來才發現眼睛不行了,不過說來也奇怪,到今天我的視力還能保持1.5,真是個奇 跡。但是就是那台破機器陪伴了我兩年,讓我學會了VC、Delphi、SQLServer等。後來那台機器給我阿姨打字用,據她說一天她正打的開心,一股 青煙夾著火苗從顯示器鑽出來,之後它才壽終正寢。
大三假期找了個機會在一個計算機研究所實習,與其說實習不如說是做義工,工作了兩個月一分錢沒有拿。但是這兩個月對我的發展幫助很大,讓我早一步了解 了社會,剛去的時候我當然是一竅不通,在那裡我熟悉了網路,學會了Delphi和Oracle。由於工作很認真,得到了比較好的評價,在一位長者的引薦 下,我開始和他們一起做項目,這使我在大三大四就有了自己的收入,大四又找了兩家MIS公司兼職,雖然錢不多,但是在學生期間有1000多的收入我已經非 常滿足了,我終於用自己賺的錢把計算機換了。大四下開始找工作,這時我的工作經驗已經比較多(當然現在想想非常幼稚),開始聽父母的想去那個研究所, 實習過那個部門也希望我能去,但是不知道為什麼最後不了了之,這種單位就是比較官僚,我一氣之下就到了我兼職的一個公司做MIS的TeamLeader。 在大三到畢業一年的時間,做過了各種MIS,從煤氣、煙廠、公安、鐵路、飲食到高校,什麼有錢做什麼,工作也很辛苦,經常加班和熬通宵,從跟客戶談需求到 設計、編碼、測試、交付都要上。那時覺得很有成就感,覺得自己還不錯,現在想想真是很膚淺。
剛走上工作崗位的學生很容易被誤導,各種開發工具讓人眼花繚亂,同時也覺得很受公司器重,但這樣工作永遠是一個低層次的開發者。不要跟我說什麼系統分 析有多麼多麼重要,多麼多麼難。你以為自己跟用戶談需求做設計就是系統分析和設計了嗎,國內又有幾個公司能夠做的很到位很規范?我是ISO9000內審 員,也在Rational公司受過多次培訓,拿了4個證書,還有一個公司讓我去做 CMM。這些我聽過很多,但是很多事情到國內就變了性質,一個公司不是通過了ISO9000或者CMM就能規范了,我現在在一家有幾十年歷史的外企工作, 裡面的管理不是一般國內企業能及的。作為一個畢業不久以前沒有步入過社會的學生,幾乎不可能在很短的時間掌握系統分析和設計,面向對象、UML只是一個工 具,關鍵是人本身的思想,不是說你熟悉了C++、Rose就能夠做出好的設計,相反如果你具備了很高的素質,你可以用C寫出比別人用C++更加模塊化的程 序。
話說遠一些,國內軟體開發行業有一個怪圈,很多人覺得VC > Delphi > VB,真是很搞笑。這幾個軟體我都做過開發,說白了他們都是工具,應該根據應用的需要選擇採用哪個,而不是覺得哪個上層次。如果你因為用某個開發工具很有 面子而選擇的話,只能說明你很淺薄。如果說層次,那麼這些工具都不上層次,因為它們用來用去都是一些系統的API,微軟的朋友不會因為你記住他們多少個 API或者多少個類就會覺得你很了不起,你永遠只是他們的客戶,他們看重的是你口袋裡的銀子。我也做過系統內核,我也封裝過很多API,同樣我也不會看重 那些使用這些API做二次開發的客戶,除非他能夠作出自己獨到的設計。
至於有人認為C++ > C那更是讓人笑掉大牙,不妨你去打聽一下,現在有幾個操作系統內核是用C++寫的,又有幾個實時系統用的是C++,當然我也不是說C++不好,但是目前的 內核和實時系統中C++還無法與C匹敵,至於說C++適合做應用系統的開發那是另外一回事。所以我的觀點是不在於你用什麼工具和語言,而在於你干什麼工 作。你的設計體現了你的技術層次。
這樣幹了一年我覺得非常苦悶,做的大多數都是熟練工種的活,個人技術上沒有太多的提高也看不到方向。所以決定離開這個城市去上海,尋求更好的發展,並且打算放棄我以前的MIS轉到通信行業。
寫到這里不能不提到我女朋友,我們是在來上海前半年認識的,她大四在我公司實習,公司派她給我寫文檔,我們的感情發展的很快。她告訴我很多事情,她家 原本是改革開放的第一批暴發戶,她母親愛打牌,輸掉了幾百萬,還欠了很多債,她有男朋友,但是她對他沒有感情,只因為他給了她母親兩萬多塊錢,後來還強迫 她寫了四萬塊的借條,她男朋友背叛過她並且不止一次打她,現在逼她結婚不然就要她還錢。這人居然還是一個高校的老師!她母親把父親給她的學費花了,因為拖 欠學費她沒有辦法拿到畢業證。她母親現在有病需要錢,我拿出了自己的一點積蓄並且跟朋友們借了一些,替她交了學費並給她母親看病(後來才知道看病的錢又不 知所終,就連她母親是不是有病我都不知道,但她也是沒有辦法)。這個時候我家知道了一些事情,堅決反對我和她在一起,她原來的男朋友也極力破壞。無奈之下 我們決定早一點離開這個傷心的城市,並且瞞著我們家。由於時間倉促,我只准備了4000塊錢,她僅有的幾百塊錢也被她母親要去了,我買了三張票,一張是中 午的,兩張是晚上的,中午我的家人把我送上船,他們一離開我就下了船,我和她乘坐晚上的船離開了這個我和她生活了很多年的城市,帶走的只是一身債務。沒有 來過上海的我們兩個性倔強,都不願意去麻煩同學和朋友。來到上海是傍晚6點半,我們都不知道該去哪裡,我們找了一個20塊錢的旅館,這個房間連窗戶都沒 有,7月份的天氣酷熱難耐,房間里非常悶熱。第二天我們開始租房子,因為身上的錢不多,我們基本都是步行,花了一個星期時間,不知道在浦東轉了多少圈後找 到了一個400塊的房子,但是我們都不了解上海是付三壓一,還要付半個月的中介費,買了一些鍋碗瓢盆後,我們身上只有800塊錢了,工作都還沒有著落,這 800塊錢要支持到我們拿到第一個月工資,為了省錢我們自己做飯,每天買菜只花兩塊錢,她非常喜歡吃(也可能她在大學經常挨餓的原因),看到她現在這樣省 吃儉用我真的很不忍心。她以前的男朋友也沒有放過她,經常打電話來騷擾,並且來上海看她,還說了不少恐嚇她的話,她過於善良,說他以前畢竟幫助過她,叫我 不要與他一般見識。以後的每天在家就是苦等面試通知,原本我想迅速找一家MIS公司解決眼前的困難,但是她堅持讓我不要放棄自己的理想,終於功夫不負有心 人,我找到了一家通信公司,4000塊的工資雖然趕不上MIS公司給我開出的價位,但也夠在上海生存。她也找到了工作,第一天上班她哭了,這是她來上海第 一次流淚,我心裡很難受也很感動。
由於是全新的行業,我把自己降到了零點,我學的VC、Delphi、資料庫派不上用場,擺在我面前的是嵌入式、協議、信令一些我從未接觸過的知識。我 知道我沒有退路,於是拚命的學習,我把自己當做一個應屆畢業生一樣,一分努力一分收獲,半年過去我終於熟悉了工作,並且得到了公司的表彰,薪水也加了一 級。後面的日子裡我們省吃儉用,把欠朋友的1萬多塊錢還了,日子終於上了正軌。這時女朋友告訴我她想考研究生,我也很支持,於是她辭職在家備考。
另外,在這里我要感謝我的ProjectManager,他原來是一個大通信公司的產品經理,對人非常和善,我從他那裡學到了很多知識,而且他也給了 我許許多多無私的幫助。在工作上他給我充分的空間和信任。記得公司安排我維護一個接入伺服器軟體,由於代碼量不算太小(5萬行),資料和文檔都不齊全,我 維護起來非常吃力,所以想重新把它做一遍,公司領導不太支持,可能覺得工作量太大,但是他極力支持我,私下裡他讓我放手去做,我的維護工作他擠時間做。在 他的支持下,我花了半年時間完成了接入伺服器的軟體,並且實現了一個相對完整的TCP/IP協議棧。在這里我學會了嵌入式系統設計、驅動開發、TCP /IP和很多通信的知識,我花了一年時間終於使自己從MIS開發轉到了通信行業,並且站穩了腳跟。我的開發大量是對硬體的直接操作,不再受微軟的操作系 統,VC、Delhpi這些開發工具的約束,我終於看到了另外一片天空。
我做事情喜歡追根問底,隨著開發的深入,軟體開發與硬體聯系越來越緊密,硬體知識的匱乏又對我的發展產生了障礙,而且晶元技術基本上掌握在國外公司的 手裡,這對做系統級設計是一個非常大的制約,一個新產品出來,第一道利潤(也往往是最豐厚的利潤)常常都被IC公司如Intel、Motorola賺去 了,國內的廠商只能喝點湯。所以我決心解決自己的硬體技術障礙,並打算離開通信行業,進入IC設計相關領域。
當然我明白如果我對硬體了解的非常少,沒有哪家IC公司會仁慈到招我這樣一個一竅不通的人來培訓。所以我必須努力打好基礎,學一些相關知識為以後做准 備。就像我開始從MIS轉到通信一樣,我看過大量通信方面的書,並且給一個ISP做過RADIUS計費分揀台,在這樣的背景下這家通信公司才給了我這個機 會。我在的通信公司是做系統設計的,有不少PCB Layout硬體人員,平常我就注意向他們學習,由於我做的是軟體,在公司看硬體資料不好意思,所以開始只好在家看,剛來上海工作我連續一年都在加班,後 來不加了,因為我要擠出時間學習,通常我12點左右睡,第二天5點半起,我上班比較早,地鐵上如果人不多我也用來看書。學習當然不會是一帆風順的,有些實 在不懂的問題就積累起來問硬體人員,他們的幫助使我學習進度快了很多,因為在沒有人點撥的情況下自學,我的一半時間是花在解決疑難問題上,但這種問題經常 是別人的一句話就可以讓我豁然開朗,我非常慶幸我有這樣的學習環境。在後面的一年裡,我學會了看硬體原理圖,學會了簡單的硬體設計(模擬電路方面還有不小 的差距),事情就是這樣的,當你安安份份做軟體,別人永遠認為你是軟體開發人員,在你開始學習硬體時別人未必會認同,有位中興通訊的朋友還對我說過,一個 人不可能把所有東西都學完。我也明白這一點,但我希望自己做的更好。但當你熟悉硬體後大家又會覺得你好像原本就是軟硬體都懂的,同事們也都習以為常了。這 個時候我可以把硬體資料堂堂正正的拿到公司看,沒有人再大驚小怪了。讓我比較自豪的是我通過自己的努力做了一個IAD(軟交換的終端設備)系統方案,包含 軟硬體的選型、設計等內容,這個方案得到了公司和同事們的認同,讓我感到非常欣慰。
技術是相輔相成的,當我的硬體有了一定的進步後,我的軟體設計也有了很大的提高,我可以從更深層次理解問題,我做的接入伺服器CPU是 Motorola PowerPC860,熟悉的朋友都知道860 QMC與軟體的批量數據傳輸通常採用BD表的方式,硬體人員做驅動的時候習慣採用固定BD表,每接收或發送數據都將數據從BD表拷貝到用戶Buffer, 或從用戶Buffer拷貝到BD表,由於理解的比較深入,我自己重新實現了這個過程,採用動態BD表的方式,驅動從一個網口接收數據,提交給我的軟體進行 三層交換,直至從另外的介面發送出去,沒有進行一次拷貝。這樣的設計大大提高了性能,使系統的指標接近理論值。軟硬體的結合使我的設計水平上了一個台階。 我現在寫的這個操作系統,編譯後我把程序反編譯成匯編,找出其中不優化的代碼,然後在C程序中進行調整。舉個例子,很多CPU沒有專門的乘法指令,這個大 家應該都知道,在這種CPU上進行一個乘法操作常常會花費大量的指令周期,有的朋友會說這個我知道,我會盡量避免採用×號,但是事情往往不是那麼簡單,你 知道 C語言中數組的下標操作是怎麼實現的嗎?仔細看看反匯編的代碼你就會明白,同樣是通過下標的定位操作,C編譯器會有時候會產生位移指令,但有時候會用乘法 實現,兩者效率往往是天壤之別,所以明白這些問題你才能將系統性能提升到極致。這些問題就不多說了,有興趣的話以後可以共同探討。
話說遠一點,我由衷的希望在軟體上做的比較深入的朋友們有機會學學硬體以及其它相關知識,尤其是做底層開發和嵌入式設計的。這對軟體技術的提高有非常 大的幫助,否則很多事情你只知道該這樣但不會明白為什麼該這樣。我這個觀點在我現在的IC公司Project Manager那裡也得到了驗證。他告訴我們公司現在的802.11晶元產品的軟體經理原本是做該晶元硬體設計的,某某某原本是做軟體的,現在在做IC, 類似的例子還有很多,只是在國內這樣的風氣不是非常流行。
我有一些心得體會與大家分享,只有當我干好本職工作後,我才會學習與工作關系不大的技術,這樣公司的上司才不至於反感,在入門階段的問題我通常不去問 那些資深人士,而是問一些資歷比較淺的朋友,比如剛畢業不久的學生,因為他們往往會跟你詳細的講解,而資深人士通常覺得你的問題太簡單,所以回答的也很簡 單,我又不好意思多問。等技術上了一定的層次後我才會問他們,他們也能給你比較深入的回答。另外,有些朋友說我機會比較好,他們也希望能從事新的工作可惜 沒有機會,我聽了只有苦笑,我的機會了解的人都應該知道,我沒有出生在什麼IT世家:)也沒有誰一路提拔我,所有的路都是自己走出來的,我母親去世比較 早,我的後母(我叫她阿姨)看著我努力過來的,一次她看我大年30還在寫程序,她說像我這樣努力木頭都能學出來。
我的最終目的是IC而不是PCB,所以我下一步的准備開始學習IC設計的知識。公司的同事沒有懂IC設計的,後面的路又要靠自己了,我買了不少相關的 書,在網上也查了很多的資料,我花了大量的時間去學習VHDL,並且用軟體進行了一些簡單的設計和模擬(沒有設計ASIC,只是針對FPGA),隨著學習 的深入,我漸漸明白了IC設計的基本流程,同時也明白了這條路的艱辛。這個時候我已經做好了跳槽的准備,我向一家業界有一定知名度的IC設計公司投了簡 歷,並通過了漫長的面試(4個多小時)。其他的一切我都比較滿意,唯獨薪資差強人意,我也明白原因,因為我是這個行業的新人,我沒有經驗,我再一次將自己 清零了。公司老闆問我6000多一個月能不能接受,我知道他也是照章辦事。想想我通信行業的朋友們,基本上都是年薪10萬以上,月薪過萬的也比比皆是,朋 友們也幫我介紹了不少待遇不錯的公司,我該怎麼選擇,當時我很猶豫,我熱愛我的事業,我嚮往我的追求,但我也是一個普通的人,我也需要養家糊口,我也想早 一點買房買車。生活給我出了一道難題。
愛因斯坦在63歲時說過「一個人沒有在30歲以前達成科學上的最大成就,那他永遠都不會有。」這句話給了我很大的壓力和震動,我馬上就26歲了,離 30隻有四年時間,我必須抓緊這幾年寶貴的時間,努力達到我技術上的最高峰。為了這個理想,為了能離自己的夢更近一些,我選擇了這家IC公司,我明白自己 的薪資和公司剛進來的碩士研究生相差無幾,但為了今後的發展只能忍受,一切又得重新開始。換行業是一個非常痛苦的過程,尤其從一個春風得意的位置換到一個 陌生的崗位,感覺象從溫暖的被子里鑽出來跳進冰水中,讓人難以接受。在原來那家通信公司,我是唯一兩年時間漲了五次工資的員工,公司和同事都給了我極大的 認可,工作上也常常被委以重任。但現在這一切都成了過去,在新的公司我只是一個新人,沒有人知道也沒有人在意我過去的成績。我決定重新開始,我把自己看作 新畢業的學生,我要用自己的努力得到公司的認可。進入新的行業是非常痛苦的,我告訴自己必須忍受這一切,雖然外面有很多誘惑,但是既然作出了選擇我就不允 許自己輕易放棄。
我現在已經在這家新公司上了一個多月的班,開始非常艱難,現在慢慢適應了。第一 個月結束時,Team Leader找我談話,說我是新進員工中最優秀的一個,我心裡很欣慰,這也算對我努力的一個肯定吧。在這里還要感謝我的女朋友,她給了我很大的支持和鼓 舞,每次在我動搖的時候她都在鼓勵我,讓我堅持自己的理想,剛來上海是她讓我不要勉強去做MIS,這次也是她讓我頂住了月薪過萬的誘惑,沒有她我可能不會 有今天的成績。現在的公司有自己的操作系統,自己的CPU、DSP和其它晶元,在這里我能學到世界上最先進的技術,我們的設計開發不再完全依賴別人的硬體 和系統,這讓我很開心。我打算等工作步入正軌後,全力學習新的知識,實現我的理想。在後面的兩年裡我給自己定下了幾個目標:
努力做好本職工作,在工作上得到公司和同事們的認同;
努力學習IC硬體設計知識,多向同事請教,並利用一切機會多實踐;
實現我的實時操作系統的主要部分,完成TCP/IP協議棧模塊,並免費發布源代碼;
和我女朋友結婚並買一套小房子,這是最重要的,因為我明白事業是可以重來的,但是珍貴的感情很難失而復得。
在這里提一下我現在開發的操作系統,它是一個實時嵌入式系統,目前支持:
a.時間片輪轉調度和基於優先順序調度,最多64個優先順序;
b.搶占式實時內核;
c.為了便於移植,主體用標准C實現;
d.匯編代碼非常少,不到100行;
e.支持任務管理,各任務有獨立的堆棧;
f.進程同步和通信目前完成了Semaphore,Message Queue正在調試;
g.實現了定時系統調用;
h.可以在windows上模擬調試
我還打算下一步實現優先順序反轉保護,Event Flag,Data Pipe,內存管理(以前實現過)、驅動介面等。 在這之後我還會努力完善它,比如加入文件系統,協議棧、調試介面等。希望朋友們提出自己的意見和建議,在此不勝感激!
就像有的朋友說的,我的經歷或許會給一些朋友產生誤導,在這里我必須說明一下。我來上海以前學習過於拚命,常常晚上只睡3個多小時,我身高1米71, 那時只有108斤(我現在130多),家人也說我這樣拚命活不過60歲,但是當時的我太固執,我對他們說只要能實現理想活50歲我就夠了。那時的拚命使我 的身體受到了影響,有一次早上突然腰肌劇痛難忍,痛的我倒在床上站不起來。雖然我現在已經比較注意,但有時候還會隱隱作痛。後來在女朋友說服了我,來上海 以後我不再如此。我經常引用父親的一句話,而且我也發現拚命不是辦法,我可以熬一兩個通宵,最多的一次我連續工作了三天三夜,但是我半個月都沒有恢復過 來,這樣是不是得不償失?
學習工作應該是一個長期的過程,像馬拉松而不是百米沖刺。我現在非常注意調整學習和工作的強度,我要保證每天盡量有相對充沛的精 力,一些年輕的朋友覺得自己也應該拚命努力,這讓我多少有些擔心,如果我的故事能讓你在學習工作上多一點興趣,我會感到很開心,但如果誤導了某些朋友,讓 你做一些不值得的付出,我會感到很內疚。

㈡ 什麼是計算機高手,電腦高手,密碼高手,編程高手呢舉例說明

這么說吧,前兩者,計算機高手,電腦高手,其實這個稱呼很籠統,舉例子的話:修電腦修的好的,精通操作系統配置設置的,而且就包括後者的編程高手其實都包括在內.而這前兩種稱呼呢,一般都是不太懂這些東西的朋友一種籠統的稱呼,而如果細化的來看,就可能有很多種了,
咱們看看密碼高手,這種人精通破譯密碼,你總看諜戰片對吧?那裡面就有人很精通破譯敵人電報密碼,這個不一定是電腦領域的,只不過現在在IT界安全變得很棘手,而試圖進行密碼破譯的人很多.舉例說明的話,你看你系統設置的那個管理員密碼,那個其實就可破解,就是由精通破解的朋友寫出程序然後開機直接進入另一個系統就可以破解掉了.
編程高手呢?就是寫代碼很厲害的,寫代碼你懂嗎?編程序,因為你所有用的程序都是要有人去寫代碼再由編譯器編譯出來的.寫代碼的人很多,厲害的也很多.這個標准嘛,就是你寫出的程序運行快,佔用資源少,別人寫1天的你1小時就搞定了,別人實現的很頭痛的功能你很輕松就實現了.包括現在跟你交流的這個網頁,都是需要人寫的.嗯就是這個樣子,例子實在太多了舉不勝舉

㈢ 有人超越C++之父嗎

C ++ 的 背 影
——C++之父Bjarne Stroustrup印象 左輕侯 2002.11.4
熱愛C++的朋友請不要誤會,我並不是在暗示「C++已經日薄西山」,或者任何類似的意思。從語義上來說,C++作為一門編程語言,當然不會有什麼背影。事實上,我想說的是一個人的背影。因此這個題目顯得有點突兀,甚至嘩眾取寵。但是我想,在C++社群中,每一個人都會同意,有一個名字就是C++的象徵。這個名字當然就是Bjarne Stroustrup。
Bjarne Stroustrup博士,1950年出生於丹麥,先後畢業於丹麥阿魯斯大學和英國劍橋大學,AT&T大規模程序設計研究部門負責人,AT&T 貝爾實驗室和ACM成員。1979年,Stroustrup開始開發一種語言,當時稱為"C with Class",後來演化為C++。1998年,ANSI/ISO C++標准建立,同年,Stroustrup推出其經典著作The C++ Programming Language的第三版。
2002年10月,Stroustrup首次訪問中國。
接觸IT界的時間越長,我就越明顯地發現,那些曾經在媒體上喧囂一時的話題,往往只是些無關緊要的事情,而真正有著深刻意義和影響的大事,卻很容易默默無聞。
Stroustrup的訪華,在技術圈子裡引起了很大的轟動。多少年來,中國的程序員一直通過翻譯的著作這樣的間接渠道(往往滯後時間很長),在黑暗中辛苦摸索。直到互聯網普及之後,我們才能夠通過網路在第一時間追蹤最新的技術,與國外的同行進行技術交流,慢慢地、一步步地拉近與世界的距離。今天,我們終於有機會當面請教這位世界級的大師,直接聆聽這個領域中最權威的聲音。我們再也不用費盡心思去琢磨蹩腳翻譯背後的作者的思想,不用迷惑於那些經常出自於一知半解的專家之口、不知道經過多少次轉述、真偽難辨的驚人之論了。在得知Stroustrup訪華的消息之後,我就和一些朋友談到,這是一個開始,希望中國的技術界能夠契此機會,依靠大家的努力,與國際上的技術社群建立穩定的交流機制,希望這件事標志著中國的程序員們不再是一個孤立、被國際社會遺忘的群體,真真正正成為世界大家庭的一員。
不過,除了主辦方做的一些宣傳之外,Stroustrup的到來,幾乎沒有見諸於任何主流媒體,雖然Stroustrup的成就和對計算機界的影響力,足以與當代任何一個人相比,雖然這次事件的意義,遠遠超過許多國內IT圈子裡的雞毛蒜皮。
Stroustrup的這次訪華,行經北京、西安、杭州、上海四個城市,時間長達半個月。在此期間,我有幸見過他三次。
第一次是他剛剛到達北京的第二天,華章的兩位朋友請他在北海後門的一家飯店吃飯,留了一個機會給我和他共進晚餐。我至今對北京的堵車痛恨無比,因為那天正好是周末,加上大雨,我竟然比預定的時間晚了一個多小時到達目的地。當我氣急敗壞地沖進那家飯店時,一眼就看到,在最靠裡面的角落裡,華章的兩位朋友中間,坐著一位老外。
他站起來,很有禮貌地和我握手。他本人和那張著名的照片(在C++社區中盡人皆知)上的樣子很象,有點禿頂,衣著隨便,與其說是一位來中國訪問的專家,不如說是一個在自己家中隨意進餐的藍領。我用英語結結巴巴地解釋了遲到的原因,他點著頭「哦」了好幾聲,一副「理解理解」的樣子,彷彿他也曾深受堵車之苦。雖然我們素昧平生,但對方的神情和簡單的幾句話,卻一下子拉近了我們的距離。這句話聽起來象書上的套話,但身臨其境的我,卻的確有這樣的感覺。
在這次見面之前,我曾經想像過Stroustrup會是一個什麼樣的人,會不會比較高傲。因為我知道,大凡超群絕倫的人物,往往在性格上都有一些偏執,何況以C++之父的身份?但是和我想像的完全相反,Stroustrup非常和善,具有技術人員特有的那種極佳的幽默感,很愛笑,甚至可以說有點天真。當我說了一句傾慕的話之後,他居然會象個孩子一樣不好意思。
飯店裡很吵,其實不是談話的好地方。我的口語水平本來就不好,大學畢業後又荒廢了好幾年,但是面對Stroustrup,不知為什麼,我居然勇氣百倍,用這種洋涇濱英語連說帶比劃,跟他說了一些事情。我告訴他,我翻譯過他的一個關於C++的風格與技術的FAQ,而且正在閱讀他的名著《C++程序設計語言》;我告訴他,中國有很多C++程序員,大家期待他的到來已經很久了;我告訴他,中國的程序員缺乏與國外社群的交流,希望我們能夠推動這種交流;我還為自己的口語水平而道歉(BS很理解地回答英語也不是他的母語),希望能夠通過Email交流……
然後Stroustrup用一連串低沉的英語作為回答,但並不是那種嚴肅的學術性的發言,而是說得很隨意,也很投入,顯然他在打動別人之前先打動了自己。說得精彩之處,他會左顧右盼,然後和我們一起開懷大笑。
這是一家普通的飯店,菜也是很普通的菜。BS和北京街頭隨處可見的老外並沒有多少區別。說著說著,我突然有一種沖動,我想,這些坐在我們旁邊自顧自高談闊論的人,會不會知道角落裡這個談笑風生、自得其樂的老外,就是一位震鑠當代的大師,一位為人類做出過偉大貢獻的人?
「人和人,真的是很不一樣……」我想。
由於BS明天一早還要趕飛機去西安,所以我們相聚的時間相當有限。出了店門,我們揮手告別。我的收獲是BS在《C++程序設計語言》中文版上的簽名和一張合影。
回到家裡,整個夜晚我都在房間走來走去。同租的室友問我:「你今天好象很激動啊?」
「當然,」我回答說,「因為我見到了這個領域的巔峰。」
Stroustrup的行程是先到北京安頓,然後飛往西安,按照西安-北京-杭州-上海這個順序進行正式訪問。在等待Stroustrup回北京的時候,我在csdn上看到了一個貼子:《Bjarne Stroustrup在西安的講座很令人失望》。點進去看,倒不是對講座的內容失望,而是批判舉辦活動中的一些現象,這也正是我最擔心的。其實我知道舉辦方作出了很大努力,有些技術上的問題情有可原,對於這次事件本身來說,算不得什麼大不了的事情。但是觸動我的是,文中說到Stroustrup演講完以後,聽眾們提問的情況。貼子的原文如下:
「……那位主持人在宣布開始提問後,就走了出去,之後混亂的場面就開始了,我坐在地板上聽了幾個問題,大多是問C++、C#、Java哪門語言更好之類的問題,這些人可能並不了解Bjarne Stroustrup,他本人早都說過不會對語言的優劣進行評述,可這些人還是不停的問,甚至還有人問Bjarne Stroustrup,在計算機和自己的女朋友當中他更喜歡哪一個?是不是更喜歡計算機?這種問題,我不想作什麼評論,好好的機會,就這樣......唉!!我可以明顯的看到Bjarne Stroustrup的臉上有不悅的表情。在看到前面的人越聚越多,並開始拚命的想搶到話筒的時候,我決定還是早點離開為妙,我從地上站起身來,拍拍身上的塵土,大踏步的離開了。」
我以前並沒有和Stroustrup打過交道,也不知道他對中國的印象如何。我曾猜想過,Stroustrup是如何看待中國的?是不是把我們當作一個遙遠的蠻荒之地來看待,就象我們看待非洲某個小國一樣?如果真是這樣,那也一點都不奇怪,畢竟中國在國際上的形象是一個IT市場,而不是一個IT領跑者。當然隨便進行這種猜測是不禮貌的,但是那也要我們能夠贏得人家的尊敬才行。當得知有見到Stroustrup的機會時,我和朋友曾經互相勉勵:「不要丟中國程序員的臉啊。」
一年多以前,我曾對朋友說過:「這幾年中國程序員的水平是長進了很多,以前是不知道自己水平有多差,現在是知道自己水平有多差了。」IT技術的核心在國外,我們開放國門的時候也並不長,水平比不上人家,是沒有辦法的事情。知道自己水平差以後,無非是兩點,一是要承認現實,二是要想辦法追趕。
進入計算機這個行業以來,我已經見過了無數自以為或被人以為是高手的妄人,種種氣焰無庸詳說,盡管在Stroustrup面前他們連學生的資格都遠遠夠不上。中國到底有多少人在使用C++?有多少人對C++有深入全面的了解(雖然我知道水平高的人肯定是有的)?我們的民族軟體產業,到底是由一群什麼人在支撐?
期待中的大師終於來了,期望中的face-to-face的交流場面也終於出現了,面對顯示器屏幕,我突然有一種莫名的孤獨蒼涼的感覺。
第二次見到Stroustrup,也是在飯店裡,由我作東,北京的幾個程序員朋友和他進行一次小范圍的交流。該死的歷史又一次重演了,又是周末,又是大雨,我又一次遲到了。不同的是,當我再次氣急敗壞地沖進飯店時,看到了不同的場景。Stroustrup一個人坐在桌子的一邊,左右座位都是空的,其他人坐在他的對面,大家都不說話,只有他一個人在默默地吃東西。他好象已經習慣了我的遲到,問了我一句:「You got lost?」
也許是受到了這種氣氛的影響,我坐在他旁邊的時候,一時居然不知道應該說什麼好。雖然我很想為他在西安的遭遇說幾句道歉的話,但又開不了口。
他拿起手頭的一份英文報紙,指著上面的Texas大學對我說:「A small world.」原來他已經受聘擔任Texas大學的教授了。我問:「Then you leave AT&T?」他說AT&T仍然保留了他的位置。我還問過他關於Lippman加入微軟擔任VC.net首席架構師的事情,與我的預料不同,他似乎對微軟的編譯器評價很高。
但是總的來說,這一次Stroustrup比上一次要沉默得多,很少發笑,大多數時候都在默默吃東西。我終於忍不住,問了一個也許不太禮貌的問題:「Do you feel lonely in China?」Stroustrup沒有聽明白「lonely」這個詞,當他弄明白了之後,很嚴肅地說:「No.」他指指對面,又指指外面,說(當然是用英文):「他們,還有很多人,他們都給了我很好的待遇。」「希望中國能給您留下一個好印象。」「現在就已經是這樣了。」但願如此。
吃完飯後,Stroustrup去賓館接受一家媒體的采訪。我和幾個朋友繼續聊天。雖然他們和我一樣,因為口語水平的限制,沒有能和Stroustrup暢所欲言,但是興奮之情都溢於言表。有一位還嚷嚷著要去報考Stroustrup的研究生,雖然後者說他已經收到了數以千計的application。
在白石橋的人行天橋上,望著黑暗的天空下來來往往的車流,我對一個朋友說,我為Stroustrup感到不平。象比爾·蓋茨、拉里·埃利森這種人訪華,都會享受國賓級的待遇,媒體上也會鋪天蓋地地宣傳。Stroustrup無論從成就還是從影響力上來說,都和他們是一個層次的,為什麼他的中國之行會這樣樸素、低調、默默無聞?對方略作思考後回答,因為蓋茨和埃利森都身為大商業公司的首腦,可以直接影響中國的市場和政府。而Stroustrup雖然發明了C++和實際掌握著C++語言的標准,但他對業界的影響並不那麼直接,他本人也不是有錢人。我說:「這個我也知道,但我還是為他感到不平。」
Stroustrup在1979年發明C++語言,至今已經二十多年,一直在為C++的完善、發展和標准化而奮斗。在在Stroustrup的理想中(也是他一直在不懈提倡的),C++應該是一種中立的、開放的、不依賴於任何平台的、不被任何一家商業公司所操縱的語言,它的標准掌握在ISO C++標准委員會中。在這一點上,C++和Delphi與Java這樣的語言有著本質的區別。
雖然C++出現得很早,但是它的ISO標准經過千錘百煉,遲至1998年才正式出台。Stroustrup不滿商業公司為了自己的利益,把C++變成各種亂七八糟的方言,花了很多心血在C++的標准化工作上面。在來自世界各地的志願者們的共同努力下,新的C++標准和標准庫都已經臻於完美。從這個意義上來說,Stroustrup創立的不僅僅是一種語言,而是一種文化。Stroustrup成功了(C++也許是當前使用最廣泛的通用工業語言),但他仍然有很多事情要做。Stroustrup的這次中國之行,可以看作是他和他的理念與中國軟體界的一次正面接觸。從我看到的情況來說,至少中國軟體界的氣氛,與Stroustrup渾身上下的氣質並不那麼相投。
網上有一個所謂IEEE對Stroustrup專訪的文章,很明顯是一個愚人節笑話,內容是Stroustrup宣揚他故意將C++設計得難以學習,是為了提高程序員的薪水。不知哪位好事之徒把它譯成了中文,導致了我幾乎在常去的每一個論壇(包括非技術性的論壇)上都發現了這個東西的轉貼(有時還是一而再再而三的轉貼),底下跟著一大堆煞有介事的評論。在後來的通信中,我把這個事告訴了Stroustrup,他顯然當成了笑話來聽,回答說:「It doesn't matter as long as they don't believe it.」
我該怎麼回答他,告訴他其實大家都信以為真?
最後一次見到Stroustrup,是在北京大學的一個C++語言研討會上。前一天在清華的演講我沒有去,據說相當成功。北大的這個研討會是內部性質的,規模不大,實行憑證入場的方式,應該是保證了參與者的質量。與會的還有幾位重量級的人物,包括《C++程序設計語言》的譯者、北大的裘宗燕教授,另外慕名而來的估計也不少。
我無論如何不能再遲到了,提前一個小時到了會場。我剛到,就陸陸續續有人進來了,一邊互相打聽著「C++之父的研討會是不是在這里」。很多人帶著Stroustrup著作的各種版本,估計是來尋求簽名的。終於,Stroustrup在華章公司和北大計科系的人的簇擁下出現了,今天他看起來精神不錯。
首先是Stroustrup做了一個題為《Speak C++ Like a Native》(將C++作為一種母語)的演講,概要地說明了C++的設計思想和幾種編程風格。內容比較基礎,而且在西安交大和清華做的演講也是這個,我沒有太在意。接下來是由舉辦方邀請的人進行比較正式的發言,裘宗燕第一,熊節第二,我排在第三個。我提的是一個關於通過C++語言開發跨平台程序的問題,詢問C++為什麼沒有一個象Delphi那樣的跨越平台的framework,以及將現有的標准庫是否有往這方面發展的意向。這個問題發揮的彈性很大,可以詳細討論,也可以幾句話帶過去。但是Stroustrup象回答前兩個問題一樣,非常詳盡和耐心地做了回答,從C++的目標和定位說起,談到標准庫和商業公司的專有庫的區別,談到因為資金問題標准庫不太可能發展成為包羅萬象的framework,最後建議我可以嘗試一些比較優秀的第三方庫。在說話的時候,Stroustrup一直注視著我的眼睛,不斷打著手勢,認真得讓我有愧疚的感覺,因為我的理解往往跟不上他的言鋒。
最精彩的是自由答問時間,很多人都已經躍躍欲試了。我已經無法詳細地回憶起當時的具體情形,總之發言非常踴躍。在我的印象中,似乎沒有出現特別有創意的問題(當然在這種即興發言中,很難出現這種好問題),不過大多數的問題都有相當的水平。其實不用聽他們問的內容,只需要看到那一張張神情專注而略顯緊張的年輕的臉,就能夠讓人產生一種熟悉而親切的感覺……毋庸諱言的是,其實有不少問題純屬浪費時間,因為類似的問題Stroustrup早已經回答過許多次了,在網上稍微查找一下就能找到答案。這種情況應該可以從一個側面說明,中國程序員作為一個整體,與國外的交流還是太少了,仍然缺乏放眼世界的胸襟和眼光。
「Stroustrup真可憐,被人一遍又一遍地問這些同樣的問題,」負責陪同Stroustrup的一位朋友忍不住嘀咕說,很容易想像,這種場面他已經見過好多回了。盡管如此,Stroustrup仍然不厭其煩地解答著每一個問題,認真得讓人想起近代歷史上的傳教士,這份耐心真是讓我佩服無己。很顯然,今天他興致很高,特別是遇到了good question的時候,發揮的時間遠遠超過了預定的期限。幾個小時的熱烈討論,讓Stroustrup已經略顯疲態,後來不得不背靠著牆壁說話(不知為何,他就是不願意規規矩矩地坐著,整個自由答問期間都是採用站立的姿勢,甚至常常用一隻腳踩在椅子上)。但是當主持者向他示意時間已到,可以結束時,他卻搖手反對,表示要繼續討論下去。現場發出了一片善意的笑聲……
晚飯由北大的一位副教授做東,作陪的有華章的幾位編輯,C-View的孟岩和王昕,科泰的陳榕。陳榕在微軟工作過多年,英語很好,和Stroustrup聊了很長時間,談的是業界的一些事情,基本上沒有涉及技術問題。
曲終人散,我們走出北大的校門,Stroustrup將在第二天飛往上海。臨上車之前,他很嚴肅地和我們中的每一個人握手道別,並表示感謝。不知中國之行帶給他的是什麼?但我知道,他帶給我們有很多,包括以後建立的聯系。在北京的夜色中,這個年過五十、頭發已經稍微有些花白的丹麥人轉身離去,留下一個沉默的背影。

再見,Stroustrup。

㈣ 為什麼要學習編譯原理(轉)

大學課程為什麼要開設編譯原理呢?這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在20世紀50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間誕生不少名著的相關數論。 推薦參考書 雖然編譯理論發展到今天,已經有了比較成熟的部分,但是作為一個大學生來說,要自己寫出一個像TurbocC,Java那樣的編譯器來說還是太難了。不僅寫編譯器困難,學習悶數編譯原理這門課程也比較困難。 第一本書的原名叫《CompilersPrinciples,Techniques,andTools》,另外一個響亮的名字就是龍書。原因是這本書的封面上有條紅色的龍,也因為獗臼樵詒嘁朐?砘?嘴域確實?忻?所以很多國外的學者都直接取名為龍書。最近機械工業出版社已經出版了此書的中文版,名字就叫《編譯原理》。該書出的比較早,大概是在85或86年編寫完成的,作者之一還是著名的貝爾實驗室的科學家。裡面講解的核心編譯原理至今都沒有變過,所以一直到今天,它的價值都非凡。這本書最大的特點就是一開始就通過一個實際的小例子,把編譯原理的大致內容羅列出來,讓很多編譯螞罩首原理的初學者很快心裡有了個底,也知道為什麼會有這些理論,怎麼運用這些理論。而這一點是我感覺國內的教材缺乏的東西,所以國內的教材都不是寫給願意自學的讀者,總之讓人看了半天,卻不知道裡面的東西有什麼用。 第二本書的原名叫《ModernCompilerDesign》,中文名字叫做《現代編譯程序設計》。該書由人民郵電出版社所出。此書比較關注的是編譯原理的實踐,書中給出了不少的實際程序代碼,還有很多實際的編譯技術問題等等。此書另外一個特點就是其現代而字。在傳統的編譯原理教材中,你是不可能看到如同Java中的垃圾回收等演算法的。因為Java這樣的解釋執行語言是在近幾年才流行起來的東西。如果你想深入學習編譯原理的理論知識,那麼你肯定得看前面那本龍書,如果你想自己動手做一個先進的編譯器,那麼你得看這本《現代編譯程序設計》。 第三本書就是很多國內的編譯原理學者都推薦的那本《編譯原理及實踐》。或許是這本書引入國內比較早吧,我記得我是在高中就買了這本書,不過也是在前段時間才把整本書看完。此書作為入門教程也的確是個不錯的選擇。書中給出的編譯原理講解也相當細致,雖然不如前面的龍書那麼深入,但是很多地方都是點到為止,作為大學本科教學已經是十分深入了。該書的特點就是注重實踐,不過感覺還不如前面那本《現代編譯程序設計》的實踐味道更重。此書的重點還是在原理上的實踐,而非前面那本那樣的技術實踐。《編譯原理及實踐》在講解編譯原理的各個部分的同時,也在逐步實踐一個現代的編譯器TinyC.等你把整本書看完,差不多自己也可以寫一個TinyC了。作者還對Lex和Yacc這兩個常用的編譯相關的工具進行了很詳細的說明,這一點也是很難在國內的教材中看到的。 推薦了這三本教材,都有英文版和中文版的。很多英文好的同學只喜歡看原版的書,不我的感覺是這三本書的翻譯都很不錯,沒有必要特別去買英文版的。理解理論的實質比理解表面的文字更為重要。 編譯原理的實質 幾乎每本編譯原理的教材都是分成詞法分析,語法分析(LL演算法,遞歸下降演算法,LR演算法),語義分析,運行時環境,中間悶悉代碼,代碼生成,代碼優化這些部分。其實現在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內容的,所以那本龍書的內容格式幾乎成了現在編譯原理教材的定式,包括國內的教材也是如此。一般來說,大學裡面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重於前面幾個部分。像代碼優化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對於本科生,對詞法分析和語法分析掌握要求就相對要高一點了。 詞法分析相對來說比較簡單。可能是詞法分析程序本身實現起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然後以一種十分標準的方式來講解詞法分析程序的產生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。 語法分析部分就比較麻煩一點了。現在一般有兩種語法分析演算法,LL自頂向下演算法和LR自底向上演算法。LL演算法還好說,到了LR演算法的時候,困難就來了。很多自學編譯原理的都是遇到LR演算法的理解成問題後就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR演算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現。對於LL演算法中特殊的遞歸下降演算法,因為其實踐十分簡單,那麼就應該要求每個學生都能自己寫。當然,現在也有不少好的LL演算法的語法分析器,不過要是換在非C平台,比如Java,Delphi,你不能運用YACC工具了,那麼你就只有自己來寫語法分析器。 等學到詞法分析和語法分析時候,你可能會出現這樣的疑問:詞法分析和語法分析到底有什麼?就從編譯器的角度來講,編譯器需要把程序員寫的源程序轉換成一種方便處理的數據結構(抽象語法樹或語法樹),那麼這個轉換的過程就是通過詞法分析和語法分析的。其實詞法分析並非一開始就被列入編譯器的必備部分,只是我們為了簡化語法分析的過程,就把詞法分析這種繁瑣的工作單獨提取出來,就成了現在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語法分析也是有用的。比如我們在DOS,Unix,Linux下輸入命令的時候,程序如何分析你輸入的命令形式,這也是簡單的應用。總之,這兩部分的工作就是把不規則的文本信息轉換成一種比較好分析好處理的數據結構。那麼為什麼編譯原理的教程都最終把要分析的源分析轉換成樹這種數據結構呢?數據結構中有Stack,Line,List這么多數據結構,各自都有各自的特點。但是Tree這種結構有很強的遞歸性,也就是說我們可以把Tree的任何結點Node提取出來後,它依舊是一顆完整的Tree。這一點符合我們現在編譯原理分析的形式語言,比如我們在函數裡面使用函樹,循環中使用循環,條件中使用條件等等,那麼就可以很直觀地表示在Tree這種數據結構上。同樣,我們在執行形式語言的程序的時候也是如此的遞歸性。在編譯原理後面的代碼生成的部分,就會介紹一種堆棧式的中間代碼,我們可以根據分析出來的抽象語法樹,很容易,很機械地運用遞歸遍歷抽象語法樹就可以生成這種指令代碼。而這種代碼其實也被廣泛運用在其它的解釋型語言中。像現在流行的Java,.NET,其底層的位元組碼bytecode,可以說就是這中基於堆棧的指令代碼的。 關於語義分析,語法制導翻譯,類型檢查等等部分,其實都是一種完善前面得到的抽象語法樹的過程。比如說,我們寫C語言程序的時候,都知道,如果把一個浮點數直接賦值給一個整數,就會出現類型不匹配,那麼C語言的編譯器是怎麼知道的呢?就是通過這一步的類型檢查。像C++語言這中支持多態函數的語言,這部分要處理的問題就更多更復雜了。大部編譯原理的教材在這部分都是講解一些比較好的處理策略而已。因為新的問題總是在發生,舊的辦法不見得足夠解決。 本來說,作為一個編譯器,起作用的部分就是用戶輸入的源程序到最終的代碼生成。但是在講解最終代碼生成的時候,又不得不講解機器運行環境等內容。因為如果你不知道機器是怎麼執行最終代碼的,那麼你當然無法知道如何生成合適的最終代碼。這部分內容我自我感覺其意義甚至超過了編譯原理本身。因為它會把一個計算機的程序的運行過程都通通排在你面前,你將來可能不會從事編譯器的開發工作,但是只要是和計算機軟體開發相關的領域,都會涉及到程序的執行過程。運行時環境的講解會讓你更清楚一個計算機程序是怎麼存儲,怎麼裝載,怎麼執行的。關於部分的內容,我強烈建議大家看看龍書上的講解,作者從最基本的存儲組織,存儲分配策略,非局部名字的訪問,參數傳遞,符號表到動態存儲分配(malloc,new)都作了十分詳細的說明。這些東西都是我們編寫平常程序的時候經常要做的事情,但是我們卻少去探求其內部是如何完成。 關於中間代碼生成,代碼生成,代碼優化部分的內容就實在不好說了。國內很多教材到了這部分都會很簡單地走馬觀花講過去,學生聽了也只是作為了解,不知道如何運用。不過這部分內容的東西如果要認真講,單獨開一學期的課程都講不完。在《編譯原理及實踐》的書上,對於這部分的講解就恰到好處。作者主要講解的還是一種以堆棧為基礎的指令代碼,十分通俗易懂,讓人看了後,很容易模仿,自己下來後就可以寫自己的代碼生成。當然,對於其它代碼生成技術,代碼優化技術的講解就十分簡單了。如果要仔細研究代碼生成技術,其實另外還有本叫做《》,那本書現在由機械工業出版社引進的,十分厚重,而且是英文原版。不過這本書我沒有把它列為推薦書給大家,畢竟能把龍書的內容搞清楚,在中國已經就算很不錯的高手了,到那個時候再看這本《》也不遲。代碼優化部分在大學本科教學中還是一個不太重要的部分,就是算是實踐過程中,相信大家也不太運用得到。畢竟,自己做的編譯器能正確生成執行代碼已經很不錯了,還談什麼優化呢? 編譯原理的課程畢竟還只是講解原理的課程,不是專門的編譯技術課程。這兩門課程是有很大的區別的。編譯技術更關注實際的編寫編譯器過程中運用到的技術,而原理的課

㈤ 現代C/C++編譯器有多智能

最近在搞C/C++代碼的性能優化,發現很多時候自以為的優化其實編譯器早就優化過了,得結合反匯編才能看出到底要做什麼樣的優化。
請熟悉編譯器的同學結合操作系統和硬體談一談現代c/c++編譯器到底有多智能吧。哪些書本上的優化方法其實早就過時了?
以及程序員做什麼會讓編譯器能更好的自動優化代碼?
舉個栗子:
1,循環展開,大部分編譯器設置flag後會自動展開;
2,順序SIMD優化,大部分編譯器設置flag後也會自動優化成SIMD指令;
3,減少中間變數,大部分編譯器會自動優化掉中間變數;
etc.
查看代碼對應的匯編:
Compiler Explorer
【以下解答】
舉個之前看過的例子:
int calc_hash(signed char *s){ static const int N = 100003; int ret = 1; while (*s) { ret = ret * 131 + *s; ++ s; } ret %= N; if (ret < 0) ret += N; //注意這句 return ret;}
【以下解答】
舉個簡單例子,一到一百求和
#include int sum() { int ret= 0; int i; for(i = 1; i <= 100; i++) ret+=i; return ret;}int main() { printf("%d\n", sum()); return 0;}
【以下解答】
話題太大,碼字花時間…
先放傳送門好了。
請看Google的C++編譯器組老大Chandler Carruth的演講。這個演講是從編譯器研發工程師的角度出發,以Clang/LLVM編譯C++為例,向一般C++程序員介紹理解編譯器優化的思維模型。它講解了C++編譯器會做的一些常見優化,而不會深入到LLVM具體是如何實現這些優化的,所以即使不懂編譯原理的C++程序員看這個演講也不會有壓力。
Understanding Compiler Optimization - Chandler Carruth - Opening Keynote Meeting C++ 2015
演示稿:https://meetingcpp.com/tl_files/mcpp/2015/talks/meetingcxx_2015-understanding_compiler_optimization_themed_.pdf
錄像:https://www.youtube.com/watch?v=FnGCDLhaxKU(打不開請自備工具…)
Agner Fog寫的優化手冊也永遠是值得參考的文檔。其中的C++優化手冊:
Optimizing software in C++ - An optimization guide for Windows, Linux and Mac platforms - Agner Fog
要稍微深入一點的話,GCC和LLVM的文檔其實都對各自的內部實現有不錯的介紹。
GCC:GNU Compiler Collection (GCC) Internals
LLVM:LLVM』s Analysis and Transform Passes
========================================
反模式(anti-patterns)
1. 為了「優化」而減少源碼中局部變數的個數
這可能是最沒用的手工「優化」了。特別是遇到在高級語言中「不用臨時變數來交換兩個變數」這種場景的時候。
看另一個問題有感:有什麼像a=a+b;b=a-b;a=a-b;這樣的演算法或者知識? - 編程
2. 為了「優化」而把應該傳值的參數改為傳引用
(待續…)
【以下解答】
推薦讀一讀這里的幾個文檔:
Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X
其中第一篇:http://www.agner.org/optimize/optimizing_cpp.pdf
講解了C++不同領域的優化思路和問題,還有編譯器做了哪些優化,以及如何代碼配合編譯器優化。還有優化多線程、使用向量指令等的介紹,推薦看看。
感覺比較符合你的部分需求。
【以下解答】
一份比較老的slides:
http://www.fefe.de/source-code-optimization.pdf
【以下解答】
利用C++11的range-based for loop語法可以實現類似python里的range生成器,也就是實現一個range對象,使得
for(auto i : range(start, stop, step))
【以下解答】
我覺得都不用現代。。。。寄存器分配和指令調度最智能了
【以下解答】
每次編譯poco庫的時候我都覺得很為難GCC
【以下解答】
有些智能並不能保證代碼變換前後語義是等價的
【以下解答】
誒誒,我錯了各位,GCC是可以藉助 SSE 的 xmm 寄存器進行優化的,經 @RednaxelaFX 才知道應該添加 -march=native 選項。我以前不了解 -march 選項,去研究下再來補充為什麼加和不加區別這么大。
十分抱歉黑錯了。。。以後再找別的點來黑。
誤導大家了,實在抱歉。(??ˇ?ˇ??)
/*********以下是並不正確的原答案*********/
我是來黑 GCC的。
最近在搞編譯器相關的活,編譯OpenSSL的時候有一段這樣的代碼:
BN_ULONG a0,a1,a2,a3; // EmmetZC 註:BN_ULONG 其實就是 unsigned longa0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
【以下解答】
提示:找不到對象
【以下解答】
忍不住抖個機靈。
私以為正常寫代碼情況下編譯器就能優化,才叫智能編譯器。要程序員絞盡腦汁去考慮怎麼寫代碼能讓編譯器更好優化,甚至降低了可讀性,那就沒有起到透明屏蔽的作用。
智能編譯器應該是程序猿要較勁腦汁才能讓編譯器不優化。
理論上是這樣的。折疊我吧。
【以下解答】
編譯器智能到每次我都覺得自己很智障。
【以下解答】
雖然題主內容里是想問編譯器代碼性能優化方面的內容,但題目里既然說到編譯器的的智能,我就偏一下方向來說吧。
有什麼更能展示編譯器的強大和智能?
自然是c++的模版元編程
template meta programming
簡單解釋的話就是寫代碼的代碼,寫的還是c++,但能讓編譯器在編譯期間生成正常的c++代碼。
沒接觸過的話,是不是聽上去感覺就是宏替換的加強版?感覺不到它的強大呢?
只是簡單用的話,效果上這樣理解也沒什麼
但是一旦深入下去,尤其翻看大神寫的東西,這明明看著就是c++的代碼,但TM怎麼完全看不懂他在干什麼?後來才知道這其實完全是另外一個世界,可是明明是另外一個世界的東西但它又可以用來做很多正常c++能做的事....
什麼?你說它好像不能做這個,不能做那個,好像做不了太多東西,錯了,大錯特錯。就像你和高手考試都考了100分的故事一樣,雖然分數一樣,但你是努力努力再努力才得了滿分,而高手只是因為卷面分只有100分.....在元編程面前,只有想不到,沒有做不到。
再回頭看看其他答案,編譯器順手幫你求個和,丟棄下無用代碼,就已經被驚呼強大了,那模板元編程這種幾乎能在編譯期直接幫你「生成」包含復雜邏輯的c++代碼,甚至還能間接「執行」一些復雜邏輯,這樣的編譯器是不是算怪獸級的強大?
一個編譯器同時支持編譯語法相似但結果不同卻又關聯的兩種依賴語言,這個編譯器有多強大多智能?
寫的人思維都要轉換幾次,編譯器轉著圈嵌著套翻著番兒地編譯代碼的代碼也肯定是無比蛋疼的,你說它有多強大多智能?
一個代碼創造另外一個代碼,自己能按照相似的規則生成自己,是不是聽上去已經有人工智慧的發展趨勢了?
上帝說,要有光,於是有了光。
老子曰,一生二,二生三,三生萬物。
信c++,得永生!
===
FBI WARNING:模板元編程雖然很強大,但也有不少缺點,尤其對於大型項目,為了你以及身邊同事的身心健康,請務必適度且謹慎的使用。勿亂入坑,回頭是岸。
【以下解答】
c++11的auto自動類型推斷算么....
【以下解答】
智能到開不同級別的優化,程序行為會不同 2333
【以下解答】
這個取決於你的水平

熱點內容
擴大器管理密碼在哪裡 發布:2024-11-24 06:22:08 瀏覽:597
sqlschema 發布:2024-11-24 06:18:18 瀏覽:921
有演算法 發布:2024-11-24 06:18:18 瀏覽:103
sqlserver2012導出數據 發布:2024-11-24 06:09:18 瀏覽:633
什麼意思安卓手機 發布:2024-11-24 05:39:54 瀏覽:975
linux怎麼連接資料庫 發布:2024-11-24 05:39:14 瀏覽:547
高頻電子零件分析儀配置的校正模塊有哪些 發布:2024-11-24 05:39:10 瀏覽:987
雲裳羽沒有其他伺服器嗎 發布:2024-11-24 05:34:16 瀏覽:220
編程發燒友 發布:2024-11-24 05:34:16 瀏覽:727
android獲取應用大小 發布:2024-11-24 05:33:34 瀏覽:28