1.2.2 編譯技術(shù)與開發(fā)環(huán)境
很多用戶在被計算機強大而豐富的功能所折服的同時,也不禁會感到詫異!簡單的計算機程序設(shè)計語言何以完成如此復(fù)雜的功能?這種與硬件之間的交流是如何完成的呢?筆者曾經(jīng)使用C++語言在C++ Builder 6環(huán)境下編寫了一個小的色彩編輯軟件,圖1-6給出了該軟件運行的界面。

圖1-6 使用C++語言編寫的色彩編輯軟件
這樣一個漂亮的程序,是如何被編寫出來的呢?它的本來面貌是否也如此花哨?為了讓讀者看清它的廬山真面目,筆者使用UltraEdit 32將上述色彩編輯軟件的源文件顯示出來,同時也將其對應(yīng)的目標文件(*.obj)顯示出來,如圖1-7所示。顯而易見,其目標文件是一些看似毫無規(guī)則的數(shù)字,這就是機器語言!只不過UltraEdit 32采用了十六進制顯示方式,所以原來的二進制代碼就變成了0到9,以及字母A到F的組合。關(guān)于數(shù)值的內(nèi)容會在下一章討論,這里就不再贅言了。

圖1-7 源文件和目標文件
現(xiàn)在一定有兩個問題困惑著讀者!第一,編譯程序是如何讀懂源文件中的C++代碼并把它轉(zhuǎn)換為等價的目標文件(機器語言代碼)的呢?第二,計算機是如何解讀這些看似毫無規(guī)則的二進制序列(機器語言代碼)的呢?第二個問題,會在本書的后續(xù)內(nèi)容中進行研究。我們先來研究一下第一個問題,要回答這個問題,就必須要涉及計算機語言的編譯技術(shù)。
如圖1-8所示,一個典型的編譯器通常由8個部分組成,即詞法分析程序、語法分析程序、語義分析程序、中間代碼生成程序、代碼優(yōu)化程序、目標代碼生成程序、錯誤檢查和處理程序及信息表管理程序。

圖1-8 編譯程序的邏輯結(jié)構(gòu)
1.詞法分析程序
編譯器接收到的源文件應(yīng)該是一組運用特定語言寫成的文本,也就是說,待處理文件就是一個有限長度的字符串。這時首先需要通過詞法分析程序?qū)υ撦斎脒M行預(yù)處理,這些預(yù)處理工作包括識別源程序中的各個基本語法單位——也就是單詞;識別并刪除無用的空白符、換行符等非實質(zhì)性字符,以及注釋;并進行詞法檢查,檢查源文件中是否有不屬于本語言的非法字符。
對于一種計算機語言來說,其單詞常常劃分為多種類型,主要有:
(1)標識符,它可能在源程序中充當函數(shù)名,也可能充當變量名等,甚至充當標號。例如,在C語言中,goto語句是用來標識跳轉(zhuǎn)地址的標識符號。
(2)關(guān)鍵字,例如,C語言中的char、int、if、else、switch、case、while、for等都是關(guān)鍵字。
(3)運算符,也稱操作符,以C語言為例,其中的運算符包括+、-、*、/、&等。
當然,還可能存在其他的類型,這里僅僅列舉了幾個大家比較熟悉的。通常在IDE中為代碼進行語法著色的過程其實就是一個詞法分析的過程。
2.語法分析程序
語法分析程序以詞法分析程序所輸出的以內(nèi)部編碼形式表示的單詞序列作為輸入。在相應(yīng)程序設(shè)計語言的語法規(guī)則指導(dǎo)下,分析源程序是否是符合該語言語法規(guī)則的一段合法程序。通常的做法是嘗試使用輸入的單詞序列來構(gòu)造一棵完整的語法樹(注意:這里的語法樹只是一種邏輯上的概念,并非數(shù)據(jù)結(jié)構(gòu)中的樹型結(jié)構(gòu)。通常所使用的嘗試方法包括自頂向下和自下向上兩種),如果語法樹能夠被正確地建立即表示該輸入符合特定語言語法,否則語法就是錯誤的。
3.語義分析程序
語法分析旨在定義語言各語法成分的形式或結(jié)構(gòu),而語義分析則用來規(guī)定各語法成分的功能和含義。在計算機語言中,這種語法成分的功能和含義就是指程序運行時該執(zhí)行怎樣的操作或運算,以及數(shù)據(jù)元素的屬性等。當然,這個過程中仍然需要進行語義檢查以確保語義上的正確性。
4.中間代碼生成程序
通常出于處理方便的考慮,更重要的是為了便于代碼的優(yōu)化,在語義分析之后編譯器并不直接產(chǎn)生機器代碼或者匯編代碼,而是生成一種介于源代碼與目標代碼之間的中間代碼。當然并不是所有的編譯器都必須包含中間代碼生成程序,它僅僅是一個可選項。但是某些特殊的語言則要求其編譯器必須包含中間代碼生成程序,例如Java語言。由于Java程序都需要在Java虛擬機上運行,因此經(jīng)過javac程序處理生成的*.class文件就是一種中間代碼文件。
5.代碼優(yōu)化程序
在生成目標代碼之前,還需要對已經(jīng)得到的“半成品”進行優(yōu)化處理。優(yōu)化處理的目的是為了提高目標代碼的質(zhì)量,這里的質(zhì)量主要包括兩方面的內(nèi)容。首先,要盡量壓縮目標程序所占用的空間,空間資源消耗的大小是程序質(zhì)量高低的重要影響因素。其次,要盡可能加快目標程序的運行速度,也就是從時間角度進行優(yōu)化。但要說明的是,在更多情況下,計算機系統(tǒng)中的時間和空間存在矛盾,要想求得時間與空間同時最優(yōu)幾乎不可能,因此優(yōu)化的過程中需要綜合考慮,注意權(quán)衡,具體方案都依據(jù)實際情況而定。
6.目標代碼生成程序
編譯過程的最終結(jié)果就是以目標代碼寫成的目標文件。在經(jīng)過上述一系列加工之后,最終將由目標代碼生成程序來輸出目標文件。目標代碼生成程序從前幾個階段得到的信息包括中間代碼或優(yōu)化后的中間代碼,以及帶有存儲信息的符號表。這一階段的主要任務(wù)是把源程序的中間代碼變換成依賴于具體機器的等價的目標代碼。對一個代碼生成器最重要的評價標準是它能產(chǎn)生正確的代碼。為了產(chǎn)生較優(yōu)的代碼,需要合理地使用寄存器,因為指令對于寄存器的操作常常要比對存儲單元的操作快且指令短。因此,目標代碼生成程序中最重要的部分就是寄存器的分配和目標代碼的生成算法。
7.錯誤檢查和處理程序
程序員在編寫程序過程中出現(xiàn)錯誤在所難免。因此,當一個編譯器接收到一個含有錯誤的源文件時,它應(yīng)該能夠主動地發(fā)現(xiàn)錯誤,定位錯誤,并給程序員提供一些建議以幫助程序員快速發(fā)現(xiàn)并修正錯誤。需要說明的是,錯誤檢查和處理程序同上述前6個模塊不同,它并不是一個單獨存在的模塊,它是貫穿于整個編譯過程各個階段的,也可以說在不同的處理階段,各模塊都包含有各自的錯誤檢查處理程序,因此獨立完整的錯誤檢查處理程序其實并不存在。
8.信息表管理程序
信息表管理程序與錯誤檢查和處理程序一樣是貫穿于整個編譯過程的,它負責建立、填寫和查找等一系列表格工作。表格的作用是記錄源程序的各類信息和編譯各階段的進展情況,編譯的每個階段所需信息多數(shù)都從表格中讀取,產(chǎn)生的中間結(jié)果都記錄在相應(yīng)的表格中。例如,在詞法分析階段,詞法分析程序讀到一個符號“+”,此時它就會去查相應(yīng)的語言符號表,以確定該符號是否是語言體系中的合法符號,并給出該符號的一些具體屬性和信息。
可以說整個編譯過程就是造表、查表的工作過程。因此,信息表管理程序也并非一個獨立的“表格管理程序”,它只是表明編譯程序具有的表格管理功能。
編譯原理是計算機學科中一門非常重要也非常底層的學科,編譯程序本身就是一個復(fù)雜的翻譯系統(tǒng),它的過程復(fù)雜、實現(xiàn)更加復(fù)雜,因此編譯原理被認為是計算機科學眾多課程中最晦澀、最難懂的一門。編譯工作在各個階段中都要涉及大量的數(shù)據(jù)結(jié)構(gòu)和算法,而且每種算法的執(zhí)行步驟都有可能達到數(shù)頁之多,令人望而生畏。但其實如果耐心去思考、去琢磨,或許它并沒有想象中的那么難懂,畢竟編譯器也都是人寫的。如果給初學編譯原理的人提個建議的話,那就是要注重實踐,如果能夠在學完編譯器6大模塊中的每一個模塊之后,都嘗試著自己來實現(xiàn)一下的話,枯燥難懂的知識可能就變得明晰簡單多了。當然,如果只是要做一個程序員,也不一定非要對編譯原理的每個細節(jié)都了如指掌(如果你不是開發(fā)編譯器的程序員的話),就本書所述的內(nèi)容而言,讀者能夠?qū)幾g過程的各階段所完成的任務(wù)有個形象的認識和理解就足夠了。
由于計算機語言豐富多樣,因此相應(yīng)的編譯器也種類繁多,其中早期比較著名的編譯器包括Borland公司推出的Turbo Pascal和Turbo C等。但隨著計算機技術(shù)的飛速發(fā)展,軟件應(yīng)用領(lǐng)域不斷擴大,具體開發(fā)項目的規(guī)模也在不斷激增。為了順應(yīng)時代的發(fā)展,一方面,科學家們從語言本身做了很大的改進,從面向機器的語言到面向人的語言、從非結(jié)構(gòu)化的語言到結(jié)構(gòu)化的語言、從面向過程的語言到面向?qū)ο蟮恼Z言,這些語言的更新和發(fā)展都為整個軟件產(chǎn)業(yè)的發(fā)展和時代的進步注入了源源不斷的動力和能量。另一方面,編譯器也在發(fā)生變化。為了最大程度地提高程序員的開發(fā)效率,人們在編譯器的基礎(chǔ)上進行了很多人性化的改進,并增加了諸如代碼編輯、語法著色等具體的功能,于是經(jīng)過一番包裝之后,樸素的編譯器就變成了花枝招展的集成化開發(fā)環(huán)境(IDE)了。前面所講的Turbo Pascal就是世界上首批發(fā)布的DOS開發(fā)環(huán)境下的開發(fā)工具之一,它的出現(xiàn)使個人計算機應(yīng)用程序的商用開發(fā)成為可能。
目前,可視化集成開發(fā)環(huán)境極大程度地提高了程序員的開發(fā)效率,為項目的順利進行提供了有力保障,其中比較常用的可視化集成開發(fā)環(huán)境包括微軟公司著名的Visual Studio系列。截至本書完稿之時,微軟公司的Visual Studio 2008已經(jīng)正式發(fā)布。如圖1-9所示即為Visual Studio系列中Visual C++ 2005軟件的界面。
另外一套著名的可視化集成開發(fā)環(huán)境就是由Borland公司開發(fā)的RAD Studio系列,其代表產(chǎn)品主要包括Delphi、C++ Builder、C# Builder和JBuilder等。
Borland軟件公司(Borland Software Corporation)最初由Philippe Kahn于1983年創(chuàng)立,其總部位于美國的加利福尼亞州。自成立以來,Borland 軟件公司一直是平臺獨立的軟件開發(fā)與分發(fā)解決方案領(lǐng)域的領(lǐng)導(dǎo)者。Borland 公司的第一個產(chǎn)品就是大名鼎鼎的Turbo Pascal。Borland發(fā)布Turbo Pascal之前,Microsoft公司一直是編程語言領(lǐng)域的市場領(lǐng)先者;但在Turbo Pascal發(fā)布之后,由于其集成開發(fā)環(huán)境(IDE)比Microsoft公司的基于命令行界面的編譯器及解釋器更加方便好用,迫使微軟不得不在該方面進行革新,正如我們所知道的,微軟的確也推出了許多令人嘆為觀止的作品,之后兩者在該領(lǐng)域的競爭就一直持續(xù)到今天。

圖1-9 Visual C++ 2005軟件的界面
在20世紀80年代,Borland公司曾經(jīng)有過一段非常輝煌的業(yè)績。但是好景不長,到了20世紀90年代,Borland公司進入了一個起伏跌宕的階段。
20世紀90年代中期,Borland不僅在數(shù)據(jù)庫軟件方面遜色于微軟,就連一開始一直處于優(yōu)勢地位的C++開發(fā)工具也在與微軟競爭中敗下陣來,尤其是Borland C++和Visual C++的競爭幾乎是一敗涂地。當然除了產(chǎn)品本身的一些問題外,一些分析人士還認為Philippe Kahn在資源分配方面欠缺考慮,由于他將公司的資源投入到了太多的項目上,以至于同Microsoft在多個層面展開競爭。此外,20世紀90年代中期,個人計算機軟硬件產(chǎn)品的熱銷使得很多決策者感到困惑。正在Borland躊躇迷茫時,其競爭對手如微軟等卻果斷地抓住了時機,為日后的發(fā)展奠定了堅實的基礎(chǔ)。Kahn在1994年離開了Borland公司,此后Borland公司的發(fā)展更是搖曳不定。
但值得一提的是,在Anders Hejlsberg(Turbo Pascal的作者)的領(lǐng)導(dǎo)下,Borland公司于1995年發(fā)布了Delphi 1快速應(yīng)用開發(fā)(RAD)環(huán)境,這個產(chǎn)品到現(xiàn)在依然是Borland公司最成功、最引以為傲的經(jīng)典之作。
但之后的幾年,Borland公司仍然是在經(jīng)營的谷底掙扎度日。長久以來,Borland公司都缺乏一個明確的產(chǎn)品戰(zhàn)略。在Kahn 離開Borland 公司之后,緊跟在他后面的是一連串的幾個管理團隊,而且每個都有自己的戰(zhàn)略。1998年4月29日,Borland 從桌面軟件應(yīng)用產(chǎn)品提供商轉(zhuǎn)變?yōu)樘峁┌惭b和管理企業(yè)軟件系統(tǒng)產(chǎn)品及服務(wù)的提供商,將業(yè)務(wù)重心集中于企業(yè)應(yīng)用軟件開發(fā),并且將名字變更為Inprise 公司,旨在告訴人們它的轉(zhuǎn)型方向和策略。不幸的是,所有這些戰(zhàn)略最終都沒能使Borland公司擺脫慘淡經(jīng)營的窘境。
1999年,Dale L Fuller 取代Del Yokam 成為Borland公司的新CEO。Dale L Fuller挽救了當時處于破產(chǎn)邊緣的Borland 公司,在他的努力下,2000年,Borland扭虧為盈,并在隨后兩年里,保持了持續(xù)盈利。2001年1月,Borland重新從Inprise改名為Borland,這在當時是一件非常令人興奮的事情,尤其是Borland公司中的一些元老們都非常懷念這個令人振奮的名字。但好景不長,Borland 公司再度陷入增長困境,2005年,由于財務(wù)與商務(wù)錯誤,Dale L Fuller辭去了CEO職務(wù)。
2005年11月9日,Borland 公司宣布Tod Nielsen 接任公司CEO的職務(wù)。2005年10月, Borland 收購了Legadero,將它的IT Management and Governance (ITM&G)包Tempo加入到Borland的產(chǎn)品線。2006年2月8日,Borland 宣布剝離其IDE部門,包括Borland Delphi、JBuilder與InterBase。同時宣布即將收購Segue Softwar這家軟件測試與質(zhì)量工具制造商,把精力集中于應(yīng)用產(chǎn)品管理(ALM)。并打算將剝離出去的部分重組成CodeGear公司,這一目標于2006年11月14日實現(xiàn),當日Borland 宣布將開發(fā)工具組剝離出去,組成一個全資子公司集中于提升開發(fā)人員的生產(chǎn)效率。新建立的公司CodeGear將負責先前與Borland 集成開發(fā)環(huán)境業(yè)務(wù)相關(guān)的4種主要產(chǎn)品線的發(fā)展。CodeGear是Borland新成立的開發(fā)者工具業(yè)務(wù)公司,是一家出售其開發(fā)者工具的附屬公司。目前,CodeGear旗下的產(chǎn)品包括:Jbuilder、Developer Studio系列產(chǎn)品(Delphi、C++ Builder、C# Builder等)及InterBase等。至少在目前來看,Borland公司將IDE部門剝離的決策的確帶來了很大的積極作用。
CodeGear 公司的成立給原本處于低靡的IDE產(chǎn)品開發(fā)注入了強大的動力。許久都未升級的C++ Builder 6也迎來了其革命性的新版本C++ Builder 2005,并在此之后接連推出了多個新版本,如C++ Builder 2006、C++ Builder 2007。到目前為止,CodeGear已經(jīng)推出了其全線產(chǎn)品的新版本C++ Builder 2009、Delphi 2009和JBuilder 2008等。
- Cocos2D-X權(quán)威指南(第2版)
- Learning PostgreSQL
- 深入實踐Spring Boot
- Cassandra Design Patterns(Second Edition)
- UML+OOPC嵌入式C語言開發(fā)精講
- Java Web開發(fā)技術(shù)教程
- Mastering Android Game Development
- C/C++程序員面試指南
- 從Power BI到Analysis Services:企業(yè)級數(shù)據(jù)分析實戰(zhàn)
- Learning Android Application Testing
- 循序漸進Vue.js 3前端開發(fā)實戰(zhàn)
- Python Natural Language Processing
- Alfresco for Administrators
- 計算機應(yīng)用基礎(chǔ)
- Mastering Rust