高級程序設計語言_第1頁
高級程序設計語言_第2頁
高級程序設計語言_第3頁
高級程序設計語言_第4頁
高級程序設計語言_第5頁
已閱讀5頁,還剩102頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2章高級程序設計語言2.1高級程序設計語言概述2.2高級程序設計語言實現(xiàn)計算的方式2.3高級程序設計語言的基本特征2.4面向對象程序語言的基本特征2.5網(wǎng)絡計算時代的編程語言返回2.1高級程序設計語言概述計算機一問世,人們就設計了操縱計算機的語言—計算機語言。最初的語言是機器語言。機器語言在內存中開辟兩個區(qū):數(shù)據(jù)區(qū)存放數(shù)據(jù);指令區(qū)存放指令。CPU從指令區(qū)第一個地址開始逐條取出指令并釋義執(zhí)行,直到所有的指令都被執(zhí)行完。一般的指令格式如下:表2-1中列出了3種類型的指令。機器能“讀懂”上面的指令,就是把累加器中當前數(shù)再加46。匯編語言面向機器,使用匯編語言編程需要直接安排存儲,規(guī)定寄存器、運算器的動作次序,還必須知道計算機對數(shù)據(jù)約定的表示(定點、浮點、雙精度)等。下一頁返回2.1高級程序設計語言概述這對大多數(shù)人來說,都不是一件簡單的事情。此外,雖然匯編語言對操作碼、寄存器作了一些抽象,但是匯編語言與計算機緊密相關,不同計算機的指令長度、尋址方式、寄存器數(shù)目、指令表示等都是不一樣的,這使得匯編程序不僅不可移植而且讀起來很費勁。匯編語言的這些不足導致了高級語言的出現(xiàn)。上一頁返回2.2高級程序設計語言實現(xiàn)計算的方式把一種語言翻譯成另一種語言的程序叫做翻譯器(如C++翻成C)。把高級語言程序翻譯成機器語言程序有兩種方法:編譯和解釋,相應的翻譯工具也分別叫做編譯器和解釋器。下面分別介紹。2.2.1編譯器工作原理一個高級語言程序是編譯(程序)器的輸入。編譯器逐行掃描源程序,首先是識別符號串:關鍵字、字面量、標識符(變量名、數(shù)據(jù)名)、運算符、注釋行、特殊符號(續(xù)行、語句結束、數(shù)組等)這6類符號,分別歸類等待處理。這個過程就是詞法分析(LexicalAnalysis)。第二步是語法分析(SyntaxAnalysis)。下一頁返回2.2高級程序設計語言實現(xiàn)計算的方式這時一個語句就作為一串記號(token)流由語法分析器處理。按照語言的文法檢查每個語法分析樹,判定是否為合乎語法的句子。如果是合法句子就以內部格式把這個語法樹保存起來,否則報錯。這樣直至檢查完整個程序。如圖2-1所示。第三步是語義分析(SemanticAnalysis)。語義分析器對各句子的語法樹做檢查:運算符兩邊類型是否相兼容;該作哪些類型轉換(例如實數(shù)向整數(shù)賦值要取整);是否控制轉移到不該去的地方;是否有重名或者使語義含糊的記號等。如果有錯轉到出錯處理,否則生成中間代碼。第四步是中間代碼生成。上一頁下一頁返回2.2高級程序設計語言實現(xiàn)計算的方式中間代碼是向目標碼即機器語言的代碼過渡的一種編碼,其形式盡可能得和機器的匯編語言相似,以便下一步的代碼生成。但中間碼不涉及具體機器的操作碼和地址碼。采用中間碼的好處是可以在中間碼上作優(yōu)化。第五步是優(yōu)化。對中間碼程序做局部優(yōu)化和全局(整個程序)優(yōu)化,目的是使運行更快,占用空間最小。局部優(yōu)化是合并冗余操作、簡化計算,例如x:=0;可用一條“清零”指令替換。全局優(yōu)化包括改進循環(huán)、減少調用次數(shù)和采用快速地址算法等。第六步是代碼生成。上一頁下一頁返回2.2高級程序設計語言實現(xiàn)計算的方式由代碼生成器生成目標機器的目標碼(或匯編)程序,要作數(shù)據(jù)分段、選定寄存器等工作,然后生成機器可執(zhí)行的代碼。編譯過程的示意圖如圖2-2所示。高級語言源程序經編譯后得到目標碼程序,但它還不能立即裝入機器執(zhí)行,因為一般情況下它是不夠完整的。例如,如果程序中用到abs(),sin()這些函數(shù),可以直接調用,不需實現(xiàn)求絕對值、求正弦的程序,它們一般是標準化了的,事先已作為目標碼存放在機器中。所以,編譯后得到的目標模塊還需進行連接。連接程序(Linker)找出需要連接的外部模塊并到模塊庫中找出被調用的模塊,調入內存并連接到目標模塊上,形成可執(zhí)行程序。上一頁下一頁返回2.2高級程序設計語言實現(xiàn)計算的方式執(zhí)行時,把可執(zhí)行程序加載(Loading)到內存中合適的位置(此時得到的是內存中的絕對地址),就可執(zhí)行了。其示意圖如圖2-3所示。2.2.2高級語言程序的解釋執(zhí)行編譯型語言由于可進行優(yōu)化(有的編譯器可作多次優(yōu)化),目標碼效率很高,是目前軟件實現(xiàn)的主要方式。常見的程序設計語言,如C/C++、Pascal、Ada、FORTRAN等都是編譯型語言。用這些語言編寫的源程序,都需要進行編譯、連接,才能生成可執(zhí)行程序。這對于大型程序、系統(tǒng)程序、頻繁使用的支持程序來說是十分有利的。雖然編譯時花費了不少時間但程序的執(zhí)行效率很高。上一頁下一頁返回2.2高級程序設計語言實現(xiàn)計算的方式不過,在有些場合,如調試程序或者教學過程中,在編譯上花費大量的時間似乎并不必要。因此可以對高級語言源程序采取解釋執(zhí)行的方式。解釋執(zhí)行需要有一個解釋器(Interpreter),它將源代碼逐句讀入。和圖2-2示意的一樣,先作詞法分析,建立內部符號表;再作語法和語義分析,即以中間碼建立語法樹,并作類型檢查(解釋執(zhí)行語言的語義檢查一般比較簡單,因為它們往往采用無類型或動態(tài)類型系統(tǒng))。完成檢查后把每一語句壓入執(zhí)行堆棧,壓入后立即解釋執(zhí)行。圖2-4所示的堆棧首先彈出棧頂元素“*”,從符號表中得知它是“乘法”操作,翻譯為機器的乘法指令,要求有兩個操作數(shù)。上一頁下一頁返回2.2高級程序設計語言實現(xiàn)計算的方式接著彈出“id3”,查表知道這是變量,可作為賦值號左端操作數(shù)。再往下彈出“inttoreal()”,它不是數(shù)值而是函數(shù)調用(其功能是把整數(shù)轉換為實數(shù),其執(zhí)行代碼此前已壓入執(zhí)行堆棧),于是尋找inttoreal函數(shù),并彈出參數(shù)“60”,執(zhí)行完的結果作為原表達式的第二個操作數(shù)。接著再彈出“+”,表明這是加法運算,第一個操作數(shù)已在加法器中,再彈出“id2”,知道是一個變量,可做第二個操作數(shù)。執(zhí)行加法操作后彈出“:=”,再彈出“id1”作為賦值對象,完成賦值。所有的idi按符號表對應地址碼,所有運算符對應操作碼,換成機器碼后立即執(zhí)行,接著下一句又開始壓入棧。解釋執(zhí)行時只看到一個語句,無法對整個程序進行優(yōu)化。上一頁下一頁返回2.2高級程序設計語言實現(xiàn)計算的方式操作系統(tǒng)的命令、BASIC、VB、Prolog、LISP、Java、JavaScript、PostScript都是解釋執(zhí)行的,各種應用軟件提供的界面語言(一般都很?。┒喟胧墙忉寛?zhí)行的。解釋器不大,工作空間也不大,能根據(jù)程序執(zhí)行情況決定下一步做什么(人工智能經常是這樣的)是它的優(yōu)點。不過,解釋執(zhí)行難于優(yōu)化、效率較低,這是該類語言的致命缺點。上一頁返回2.3高級程序設計語言的基本特征2.3.1變量、表達式、賦值用高級語言編程也是為了對數(shù)據(jù)實施計算,即將輸入的數(shù)據(jù)經過表達式的計算得到輸出數(shù)據(jù)。然而參與計算的數(shù)據(jù)特別是計算結果在編程時是不存在的。人們只能用變量表示它。表達式是常量、變量、函數(shù)調用和運算符組成的序列。顯然,表達式中的變量被賦予數(shù)值才可以計算。賦值號左端的變量在寫程序時可以沒值數(shù)值,即使有數(shù)值,計算執(zhí)行之后也會被賦予新值。賦值和函數(shù)調用是程序語言改變變量的值的基本手段。不同的語言所使用的賦值號并不完全相同,比如Pascal語言的賦值號是“:=”,而在C、Java、VB等語言中,賦值號是“=”。下一頁返回2.3高級程序設計語言的基本特征程序中的一條語句對應著計算機的一條命令(用一條或多條指令來實現(xiàn))。一個賦值語句就是一條賦值命令。在有的語言中,表達式不能單獨成為語句,如Pascal;有些語言沒有語句的概念,只有表達式,如LISP;有些語言既可有表達式又可有語句,比如C語言。在C語言中,i++既是表達式也可以看做是語句,稱為表達式語句。2.3.2程序的控制結構程序約定自上向下自左向右地執(zhí)行,也就是順序地執(zhí)行語句(或表達式)。如果只能這樣,計算機無異于計算器。計算機之所以能自動計算,就是因為它能通過判斷將程序轉到應該執(zhí)行的地方。人們就是通過巧妙地安排控制轉移,使計算機實施算法。上一頁下一頁返回2.3高級程序設計語言的基本特征

最基本的程序控制語句在匯編語言時代就有了Jump指令使執(zhí)行跳轉,對應的高級語言語句是無條件轉移語句:goto1,其中1是跳轉到的語句的標號(數(shù)字或標識符),加上條件判斷子句if(E)就是條件轉移語句:if(E)goto1,其中E是條件(布爾)表達式,求值結果是“真”“假”值。如果為“真”轉移到標號為1的語句,為“假”則按順序執(zhí)行下一條語句。有了這兩個語句再加上簡單語句(賦值、調用、輸入/輸出),就可以實現(xiàn)程序的任何執(zhí)行控制。最基本的程序控制有以下3種:1.順序執(zhí)行簡單語句序列S=S1;S2;…;Sn;上一頁下一頁返回2.3高級程序設計語言的基本特征2.選擇執(zhí)行如下面的語句。右邊的復合語句是按當今結構化程序設計語言表示法表示的,機器內部實現(xiàn)更接近于左邊的描述。3.循環(huán)執(zhí)行上一頁下一頁返回2.3高級程序設計語言的基本特征這3種執(zhí)行控制的任意組合和重復、嵌套就可以描述任意復雜的程序。

結構化程序的控制結構早期的編程語言是語句級的,用簡單語句集合加goto構成復雜的程序控制。然而顯式地使用goto語句是極其危險的。這是因為:(1)goto語句相互交織使設計出的程序控制結構成為不可分解的一個整體。上一頁下一頁返回2.3高級程序設計語言的基本特征(2)顯式使用goto語句使得任何寫錯轉移語句標號的小錯誤都會導致滅頂之災。(3)即使程序控制邏輯是結構化的,顯式使用goto語句,程序依然難于閱讀。圖2-5(c)所示的流程圖看似復雜其實不復雜,細分不外乎圖2-6所示的3種控制結構。這3種控制結構中每個矩形框或整個結構都只有一個入口和一個出口的控制流線。每一方框很容易以另一基本結構置換。這樣,基本結構的重復嵌套可以構成極其復雜的程序。上一頁下一頁返回2.3高級程序設計語言的基本特征Boehm和Jacopini證明了它們的表達能力是完備的。它的好處是:(1)天然支持自頂向下逐步求精的開發(fā)。當程序不太明朗時用方框,細化時換成結構。(2)程序控制結構清晰不易出錯。(3)出了錯易于找出錯誤并修改。(4)易閱讀導致易擴充、修改,大程序易于分析。程序控制結構清晰,是它用關鍵字控制程序塊(語句組)。任何控制轉移不能進入這些控制塊,除非通過入口。塊中轉出也不能直接轉到程序其他處,只能轉到出口。在出/入口增加檢查語句就使得程序錯誤真正局部化。上一頁下一頁返回2.3高級程序設計語言的基本特征程序塊級(語句組)控制采用語句括號Keyword…Endkeyword非常清晰,使程序邏輯與表示法結構完全一致。圖2-5(b)中的程序是用結構化編程語言,也就是第三代語言(3GL)書寫的,它幾乎與其下面的流程圖一樣,表示和邏輯一致,可直接編程。因此,程序語言結構化以后,編程對流程圖的依賴就很少了。此后,Nassi—Schneldermann提出了結構化流程圖(主要取消流線及箭頭),但因沒有直接用類似結構化編程語言的偽代碼方便而沒有流行起來。

結構化編程語言的其他控制結構結構化程序只需3種基本結構重復和嵌套。上一頁下一頁返回2.3高級程序設計語言的基本特征1.條件分支1)無假塊條件分支和嵌套if語句有下列結構:if(E)thenSTendif如圖2-7(a)所示。if(E1)thenSlelseifE2thenS2…elseSmendif如圖2-7(b)所示。無假塊條件語句是正規(guī)條件語句的簡化,很常用。嵌套語句在否定部分用關鍵字elseif,有的語言用elsif。只有當所有條件均為“假”時才執(zhí)行else塊。顯然,逐個檢查m個條件效率很低,有時似無必要。上一頁下一頁返回2.3高級程序設計語言的基本特征2)case語句也叫分情形語句。根據(jù)條件變量Z的值單獨執(zhí)行S1,S2,…,Sn,執(zhí)行完Si自動跳到endcase(C語言例外,它要加上break才跳。否則執(zhí)行Si+1

到Sn)。形式如圖2-8所示。2.循環(huán)結構除了while(E)doSenddo結構之外,還有do-until和for結構。1)do-until語句形式是doSuntil(E)enddo,其流程圖如圖2-9(a)。它是先執(zhí)行再判斷,若E為“真”不再循環(huán)。正好和先判斷再執(zhí)行的do-while語句是相反的。將它改成dowhile結構十分容易。條件取反,先執(zhí)行一次S塊,如圖2-9(b)所示。上一頁下一頁返回2.3高級程序設計語言的基本特征2)for-do語句以控制變量增減值或枚舉集合值計數(shù)的循環(huán),其流程圖如圖2-10所示。For-do是do-while的另一種變體結構,其書寫格式又有多種變體。for(iinA)doSenddoA是一個集合,循環(huán)次數(shù)是A中元素的個數(shù),每枚舉1個元素循環(huán)1次。3)do-while-do語句其形式是doS1while(E)doS2enddo,流程圖如圖2-11所示。把與條件無關的部分或影響E值的計算的部分作無限循環(huán)。E為“真”才作S2,否則執(zhí)行enddo后面的語句。上一頁下一頁返回2.3高級程序設計語言的基本特征3.順序控制通常把一切影響正常順序執(zhí)行的,如調用/返回、前跳、延遲、異常、控制語句都歸結為順序控制。常見的有以下語句。goto多數(shù)語言作為歷史遺留保留,不提倡使用,Java中取消了該語句。breakC/C++中用于跳出塊到endcase(switch)。continue僅用于循環(huán),立即結束本次循環(huán),作下次循環(huán)。call-return調用過程,返回后執(zhí)行下一句。exit立即跳到末端出口。abort(STOP)強行停止本程序。上一頁下一頁返回2.3高級程序設計語言的基本特征delayXX延遲XX時間后繼續(xù)執(zhí)行。raise-exception引發(fā)異常,處理異常。執(zhí)行了raise后跳到exception指明的異常處理段執(zhí)行,處理后不再返回。在VB、C++中是try-catch-finally語句,把可能出現(xiàn)異常的代碼放入try塊(它包含catch、finally兩種塊),通過throw引發(fā),catch捕捉后處理,finally為可選的善后處理。2.3.3數(shù)據(jù)類型計算機中計算對象(不管是常量、變量)都是有類型的,不能把一個實數(shù)(如32.7)和邏輯“真”值(True)相加。上一頁下一頁返回2.3高級程序設計語言的基本特征指出數(shù)據(jù)類型的一個目的就是要避免這類錯誤的發(fā)生。各語言轉換函數(shù)(inttoreal或realtoint)不盡相同,有的是把待轉換的類型名作為轉換函數(shù)名,但要點是在本語言允許的兼容范圍內。不兼容的類型,如整數(shù)和布爾型一般不能轉換,但C語言例外。

常用的基本類型最常用最基本的數(shù)據(jù)類型就是純量類型,一般來說,幾乎所有類型的程序設計語言都提供了下面幾種基本數(shù)據(jù)類型:int/integer'整型對應為數(shù)學中整數(shù)real/float/double'實型(浮點類型)對應為數(shù)學中實數(shù)logical/boolean'布爾型(邏輯型)只有“真”假”值上一頁下一頁返回2.3高級程序設計語言的基本特征char/character'字符型ASCII碼的所有可見字符string'字符串類型enum'枚舉類型,用戶預定義的一串標識符強類型語言(所謂強類型,就是編譯時所有變量類型均確定,類型轉換必須顯式地給出)決不允許這種靈活性,而無類型語言則無需變量的類型聲明,給它什么值它就是什么類型。VB恰是這兩種語言的混合。

數(shù)組類型變量代表單個數(shù)據(jù)值叫純量變量。如果代表多個數(shù)據(jù)(數(shù)組)或多種數(shù)據(jù)(記錄)就叫它結構型數(shù)據(jù)的變量。上一頁下一頁返回2.3高級程序設計語言的基本特征數(shù)組的特征是所有元素均為同一類型。

記錄類型從以上敘述知道,數(shù)組中每個值的類型都是相同的。但是,現(xiàn)實中有些事物,它們的屬性的數(shù)據(jù)類型并不是完全相同的,比如說,人的身高、性別、年齡、出生年月等數(shù)據(jù),它們的數(shù)據(jù)類型并不一樣。身高是實數(shù)、性別只能是字符串,年齡的數(shù)據(jù)類型是整數(shù),而出生年月則是日期型數(shù)據(jù)。顯然不能直接用數(shù)組來記錄有關人的信息,于是,引入了記錄數(shù)據(jù)類型:相同或不同類型數(shù)據(jù)組成的結構被稱作記錄。記錄型數(shù)據(jù)記錄了對象的屬性信息,記錄的各個組成部分,稱為記錄域,各個域的數(shù)據(jù)類型可以不相同。上一頁下一頁返回2.3高級程序設計語言的基本特征類型定義中列出了屬性名和屬性的數(shù)據(jù)類型。記錄類型變量的一組值(或一行值)稱作元組(tuples),由屬性變量的值組成。每個屬性變量指明了一個(取值)域,也叫字段。如表2-2所示。有了這個類型就可以聲明記錄型變量。該變量在運算中只能按域取值,域的表示法是變量后接符號“.”再接域(屬性)名。嵌入的數(shù)組或記錄的元素又可以是記錄或者數(shù)組,這樣嵌套下去可以形成非常復雜的數(shù)據(jù)結構。所以一般語言有了數(shù)組和記錄的定義機制就足夠了。需要說明的是,在C語言中,記錄被稱作結構。上一頁下一頁返回2.3高級程序設計語言的基本特征結構或記錄都耗用較多的內存空間,早期語言均設有變體記錄。因為發(fā)現(xiàn)有一些域不是在程序所有運行期間都要用到,將它占用的空間在程序運行的后期換成另一些域(顯然類型不一樣),就叫做變體。C語言還專門發(fā)展了這種技巧,稱它為聯(lián)合(Union)。既然同一存儲域可以有兩種類型解釋,那么存入整數(shù)或字符按哈希碼解釋??焖俨檎铱墒∪ズ芏噙\算。但當今存儲空間沒有以前緊張,應用層次上用變體記錄就很少了。

指針類型指針類型是一種很重要的數(shù)據(jù)類型,但同時也是一種簡單卻不大好理解的數(shù)據(jù)類型。上一頁下一頁返回2.3高級程序設計語言的基本特征在講述指針之前,首先來看一個例子(采用C語言來描述):每個變量都有一個名字(標識符),對應為存儲單元的地址,存儲單元的內容為變量的值。引用變量的值時直接把變量名放到用值的地方(賦值語句的兩邊)。程序運行時按地址存取內容。如果某個變量的值是內存中的地址,這個變量被稱作指針變量。它是指向另一變量的變量。只是“另一變量”沒有名字,它的地址直接放到指針變量的存儲單元中去了。所以,指針變量可以間接地引用某個值。上一頁下一頁返回2.3高級程序設計語言的基本特征圖2-12中,指針變量p同樣可以運算和賦值,但必須是指針類型的運算和賦值。如果變量p的內容不變,它就是常量指針。C語言中指針類型如同數(shù)組類型,以類型指明符“*”表示。它所指向的對象是有類型的。指針和引用為操作程序對象提供了方便。當定義和引用簡單對象時,用變量就足夠了。名字是地址,值是內容。值可以改變,但值所在的存儲單元(值的結構)不能變。復雜對象就不方便了。上一頁下一頁返回2.3高級程序設計語言的基本特征指針為操縱復雜對象帶來了極大的方便。指針類似于在數(shù)據(jù)對象中用goto,簡潔、靈活、實用。C語言利用指針發(fā)展出的一套編程技巧是系統(tǒng)程序的精髓。但指針使用不當,如懸掛指針,是程序出錯的根源之一。特別在當今分布網(wǎng)絡背景下,要在不同站點上傳遞程序,指針就不能使用了。因為各站點地址碼是不一樣的。在A站點上指針的值到B站點上就無法解釋。Java堅決取消指針,對象所要求的遞引用則由引用類型保留。2001年出現(xiàn)的C#語言,更是把引用類型推向極至:凡對象類型均為引用類型,常規(guī)類型是值類型。它們可以通過裝匣(boxing)和脫匣(unboxing)任意轉換。上一頁下一頁返回2.3高級程序設計語言的基本特征2.3.4過程圖2-13是一個函數(shù)過程。函數(shù)過程是參數(shù)化(更抽象)的程序。

過程的定義從過程關鍵字開始到過程結束之間的一段封閉的程序就是過程定義,它由型構(signature)和過程體(Body)組成,以下是兩種過程定義的結構:上一頁下一頁返回2.3高級程序設計語言的基本特征

過程調用函數(shù)過程因返回值可以出現(xiàn)在主程序的表達式中,以函數(shù)名引用函數(shù)值。并列出與形式參數(shù)表變元的個數(shù)、類型、次序一樣的實在參數(shù)表。子程序過程的使用是過程調用,它相當于濃縮的一段程序(一個獨立的語句)。過程調用是把過程體的代碼調回到主程序的環(huán)境下執(zhí)行。形式參數(shù)和實在參數(shù)變元匹配之后過程運行,和主程序中其他代碼運行沒什么兩樣。這樣,主程序中聲明的變量在過程中自動可用。但反過來不行,請看圖2-14所示:上一頁下一頁返回2.3高級程序設計語言的基本特征以上就是所謂的全程變量和局部變量,局部變量在過程執(zhí)行完之后所有的數(shù)據(jù)和過程體都消失了,因此出了過程體再引用過程中的變量當然出錯。過程調用這種執(zhí)行機制,為程序運行、節(jié)省內存空間帶來了極大的好處。程序中的數(shù)據(jù)對象,自它聲明時起到本程序塊結束(見到End)為其有效的作用范圍(作用域)。顯然,內塊嵌入在外塊內,外塊的變量,內塊中是能見到的,這就可能導致這樣一個問題:外塊的變量與內塊同名怎么辦?程序設計語言中以“就近聲明優(yōu)先”準則來處理。如圖2-14,內塊程序中所有出現(xiàn)X的地方均按布爾類型解釋,Double型的X雖在其作用域內但被覆蓋(Overrided)了,因此不可見,只有通過點表示法才能出現(xiàn)在內塊中,如下所示:上一頁下一頁返回2.3高級程序設計語言的基本特征2.3.5過程的數(shù)據(jù)傳遞過程是一段封閉的程序,型構是它與外界通信的接口,它的變量是抽象的,只有通過形、實參數(shù)匹配才能具體執(zhí)行。執(zhí)行出口是本過程末端(除非中間有顯式的return語句)。數(shù)據(jù)出入有兩個途徑,一為全程量,一為參數(shù)表。上小節(jié)已說過全程量,此處討論參數(shù)表。

無參過程過程的型構中沒有形參表,調用時也不需要實參變元。過程中用到的數(shù)據(jù)是所在環(huán)境的全程量或自己內部聲明的局部變量:上一頁下一頁返回2.3高級程序設計語言的基本特征上一頁下一頁返回2.3高級程序設計語言的基本特征其中用到全局對象txtFeet、txtInches、MeterResult和全局函數(shù)CDbl、Format。這種風格在可視化語言中比比皆是。

傳遞變元從主程序向過程傳遞數(shù)據(jù)可以有兩種方式:傳值和引用。請看下例。上一頁下一頁返回2.3高級程序設計語言的基本特征先執(zhí)行不包括方括號內兩句的程序,結果為上一頁下一頁返回2.3高級程序設計語言的基本特征若執(zhí)行加上方括號中兩句的程序,結果為所以傳值是很安全的,局部程序不會改變全局變量的值。其缺點是占用雙倍存儲單元,這對大型數(shù)組來說是個值得注意的問題。傳值的另外一個缺點是帶不回值。變元參數(shù)傳遞是過程中非常重要、非?;镜母拍睿莾煞N不同的實現(xiàn)過程運算的機制。每種語言都加以區(qū)別。缺省是一種,顯式標注是另一種。上一頁下一頁返回2.3高級程序設計語言的基本特征2.3.6變量的生命期和Static變量程序中的變量生命期隨其聲明所在程序塊而異。程序一執(zhí)行完它的所有數(shù)據(jù)變量均失去意義,它所在的存儲區(qū)則可另行分配其他程序裝入執(zhí)行。因此,主程序中變量的生命期比過程中變量生命期要長,內嵌的子過程其變量生命期更短,最長的是文件變量,它放入磁盤,程序沒有了它依然存在,所以按“生命期”的長短有:持久變量除非人為銷毀全局變量出了程序便失去定義靜態(tài)局部變量見下文上一頁下一頁返回2.3高級程序設計語言的基本特征自動變量(局部變量)出了所在塊便失去定義循環(huán)控制變量出了循環(huán)便失去定義常常有一種需要,一個局部變量在它所在的局部程序塊消失后依然保留其值,又不希望它為全局變量而被該局部塊以外的程序引用。2.3.7輸入/輸出程序總得把計算的結果告訴使用者,輸出一個可識別的結果。非簡單計算情況下還得在運行時獲得用戶的輸入。程序的輸入/輸出分作兩大類:一類是程序之間以文件形式進行數(shù)據(jù)傳遞;另一類是人—機交互,把人們可識別的形式(字符串、數(shù))按一定格式輸入到程序變量中。上一頁下一頁返回2.3高級程序設計語言的基本特征輸出則相反,按用戶要求的格式顯示或打印。這一般由高級程序設計語言以過程調用(標準過程)的形式實現(xiàn)。過程在高級語言內部通過調用操作系統(tǒng)的系統(tǒng)調用完成。C語言也是把格式合并到輸入(scanf)和輸出(ptintf)函數(shù)中,這組函數(shù)在終端上功能很強,一般形式是輸入/輸出一個串,串中特殊符號“%”指示格式,出現(xiàn)幾次“%”串后跟幾個待輸入/輸出的變元。在VB中,可以利用MsgBox函數(shù)創(chuàng)建一個消息對話框,向用戶反饋程序,輸出信息。上一頁返回2.4面向對象程序語言的基本特征2.4.1對象概述依據(jù)前面第3節(jié)提供的主要機制,編制結構化的過程式程序就不會有什么問題。按照解題模型精心設計數(shù)據(jù)和算法過程,即可寫出程序。過程式程序的結構是層層調用如同一棵樹。下層程序除自己聲明的數(shù)據(jù)外共享上層和上上層程序聲明的數(shù)據(jù)。圖2-15中子程序aa、ee如果都用到主程序聲明的數(shù)據(jù),它們之間就有關系。一個子程序改動了(如重新賦值)共享數(shù)據(jù)則另一個必然受影響。這種現(xiàn)象叫數(shù)據(jù)耦合。過程模塊雖然把大程序切小了,但每個程序塊獨立性并不強。下一頁返回2.4面向對象程序語言的基本特征所謂獨立指一個模塊修改了(甚至刪除)對其他程序塊沒有影響,如果子程序分得更小,一個過程只實現(xiàn)一種功能,過程塊數(shù)量上去了,獨立性就會相對增強一些(有更多模塊不共享數(shù)據(jù))?,F(xiàn)在軟件的過程子程序小而多是其特色。盡管如此,有了共享數(shù)據(jù),當程序規(guī)模進一步增大時查錯、調試仍然極其困難。試設想有100個子程序模塊,每個模塊都單獨測試過,合在一起調試時總出錯,那只好沿其執(zhí)行路徑去找,如圖2-15(b)所示。但是由于程序中有條件判斷,可能跳過某些模塊,執(zhí)行路徑因輸入值不同而不同,模塊越多可能的路徑越多。測試的困難就越大。上一頁下一頁返回2.4面向對象程序語言的基本特征“分而治之”的思想使人們想到進一步封裝,即把相關的數(shù)據(jù)與過程裝在一起,盡可能讓它獨立。如圖2-16所示,設想一個程序有100個子程序,經過分析,這100個子程序并不是每個子程序都要用到所有的數(shù)據(jù),把相互關聯(lián)的數(shù)據(jù)和程序(有嵌套調用)分成組。這樣,一個大程序分成了5個大模塊,只留過程接口等待外面調用。當然,模塊間也可以彼此調用,例如圖2-17中,Sub22調用Sub89、Sub43調用Sub62等。盡管數(shù)據(jù)可沿著調用路線來回串,但最后加工結果都落實在各模塊聲明的數(shù)據(jù)存儲單元內,總結果若在第二、四模塊內,下一道打印命令(也是調用),它就把自己那組數(shù)打印出來。上一頁下一頁返回2.4面向對象程序語言的基本特征進一步分析發(fā)現(xiàn)這些大模塊的數(shù)據(jù)和操作往往是描述客觀世界中的一個對象,例如一個堆棧、一臺打印機、一個雇員、一個窗口……拿數(shù)據(jù)堆棧來說,堆棧體(由數(shù)組或隊列類型實現(xiàn))、入棧的數(shù)據(jù)和棧高指示(變量)就是堆棧的數(shù)據(jù),壓入(Push)、彈出(Pop)就是它的基本操作,詢問是否空(IsEmpty)是否滿(IsFull)是它的輔助操作。這樣封裝的程序塊就是一個復雜的計算對象:私有的數(shù)據(jù)描述了本對象的狀態(tài)(如數(shù)據(jù)堆棧的情況);操作表示了本對象的行為(能接受詢問IsEmpty、IsFull,會壓棧Push,會彈棧Pop);對象接受外界的消息而動作,其結果是改變了對象內部的狀態(tài)(數(shù)據(jù)在棧中出入)。請參看圖2-18。上一頁下一頁返回2.4面向對象程序語言的基本特征這樣封裝之后使用者就不必關心對象內部情況,只按接口規(guī)定的形式向它發(fā)送消息(如同調用)就可以了。如對象的設計者發(fā)現(xiàn)某個操作的算法(過程體)不好,重新改寫一個,使用者也不用知道,只要接口形式不變就行。過去只有數(shù)據(jù)類型及數(shù)據(jù)結構、過程(算法描述)和嵌套過程,把一個活生生的世界硬拆成過程式程序表達,使用者要知道許多內部細節(jié),設計者調試起來也極不方便。程序對象提供了直接描述客觀世界對象的有力手段。數(shù)據(jù)叫做對象的屬性(Attribute),操作則改稱方法(Method),即改變屬性的方法。上一頁下一頁返回2.4面向對象程序語言的基本特征對象間相互只有通信,調用方法叫發(fā)消息(Message)。消息—方法與過程調用—過程體的定義幾乎完全一樣,但意義不同。過程式語言在過程調用時主程序等待直至過程返回;消息則不一樣,因對象是自主的程序實體,發(fā)消息者可等可不等,接受消息的對象可以立即響應可以稍晚些響應,這降低了對象間的引用耦合,為并發(fā)程序、事件驅動程序提供了程序實現(xiàn)的技術基礎。2.4.2類與對象

消息和方法上一頁下一頁返回2.4面向對象程序語言的基本特征消息(Message)相當于過程語言的過程調用,可帶實在參數(shù);方法(Method)則相當于過程定義,帶參數(shù)也是形式參數(shù),一定要有方法體(執(zhí)行語句集)。面向對象中只有消息—方法,沒有過程調用—過程體的說法。類對象只接受生成、撤消實例對象的消息,這些方法稱為類方法。用到的變量相應地稱為類變量。類定義中的其他方法和數(shù)據(jù)變量叫作實例方法和實例變量。

類與類型類是由簡單類型組成的復雜類型,和用戶定義的學術上叫抽象數(shù)據(jù)類型(ADT)的復雜類型有相似之處:上一頁下一頁返回2.4面向對象程序語言的基本特征(1)類型名封裝數(shù)據(jù)和操作。(2)數(shù)據(jù)由若干基本類型或已實現(xiàn)的復雜類型定義的變量組成。(3)操作是加工這些數(shù)據(jù)的子例程和函數(shù)。(4)有外部可見性控制public(公有)、private(私有)。不同之處:(1)類定義實例變量參與程序運行,類型僅是對變量的計算形態(tài)的描述,不參與運行。類也是程序對象參與程序運行。(2)子類型是類型的真子集,不是操作減少就是數(shù)據(jù)取值范圍縮小,子類是類的例化,它增加數(shù)據(jù)和操作,使對象更明確。上一頁下一頁返回2.4面向對象程序語言的基本特征(3)過程式程序的執(zhí)行順序,盡管是并發(fā)程序,都是設計者事先考慮好了的執(zhí)行過程。面向對象程序由于對象相對獨立可以支持事件驅動程序。面向對象程序天然支持這類應用,如圖2-20所示,對象A、B、C都是獨立的,連線是表示運行時發(fā)消息的路徑,不運行時沒有??招募^表示觸發(fā)的消息(例如鼠標點擊),圖示給出兩個,誰先誰后都沒有關系,增加或減少一個對象或方法,只需對用到它的其他對象稍作修改,不需要更改總控程序。2.4.3類定義面向對象編程,要學會定義類。上一頁下一頁返回2.4面向對象程序語言的基本特征VB的所謂面向對象編程是不徹底的,它的控件都是對象,但其類定義由系統(tǒng)做,用戶只能在它提供的屬性和方法的前提下,生成并使用實例對象,用戶全無類定義概念。VB.Net回到面向對象語言的大家庭,才提供了類定義機制。本節(jié)用C++舉例。類定義以類名封裝類成員,類成員分數(shù)據(jù)成員和方法成員。只有指明它們是公有(Public)成員,其他類的對象才可以訪問,私有(Private)成員類內成員均可訪問。數(shù)據(jù)和操作全部公有,失去封裝和數(shù)據(jù)隱藏的意義,全部私有只是一個孤立的對象,也失去對象通信模擬客觀世界對象的意義。所以,一般是數(shù)據(jù)成員全部私有,方法成員多半公有,少量私有。上一頁下一頁返回2.4面向對象程序語言的基本特征私有方法只接受公有方法的消息,間接為類外對象服務。

構造子和析構子類是對象的制造廠,生成的實例對象在運行前必須初始化,這個工作如果在定義數(shù)據(jù)成員時都加上初始化屬性值,生成的對象雷同,就沒有必要定義類了。所以每個類都定義一個構造實例的方法叫構造子(Constructor,C++譯為構造函數(shù),因為它的操作只有函數(shù)),用戶設定不同的參數(shù),就可以構造出不同的實例,在2.4.2節(jié)例的main()中stkl是可裝100個字符的堆棧,stk2為可裝20個字符的堆棧。構造子一般與類同名,在聲明實例對象時也就等于在給類對象發(fā)消息。上一頁下一頁返回2.4面向對象程序語言的基本特征同名的構造子可以定義多個實例,這樣,構造實例的方法多樣編程就很方便。方法的名字相同,所帶參數(shù)不同,即方法體不同,這叫重載(Overloading),即一個名字代表了好幾個方法。在編譯或運行時根據(jù)參數(shù)的類型、個數(shù)、次序匹配。析構子(Destructor)和構造子相反,當程序不再需要該實例對象時,及時撤銷以釋放它所占據(jù)的空間。析構子的定義是在類名前加“~”號,不帶參數(shù),在main()中寫以下語句:上一頁下一頁返回2.4面向對象程序語言的基本特征則撤銷stk2對象。

接口類定義方法的型構也稱為與方法體的接口,它和方法體的顯式分離不僅使得編寫程序方便,而且還帶來其他好處。面向對象語言如Java、C#,均提供接口類。接口類的定義為:上一頁下一頁返回2.4面向對象程序語言的基本特征它是沒有屬性變量和方法體的類,顯然它不能運行。此刻向接口類的實例發(fā)消息全然無用,必須還得有一個類把它的方法型構一一實現(xiàn)才能運行。上一頁下一頁返回2.4面向對象程序語言的基本特征2.4.4類繼承類的封裝保證了程序的模塊獨立性,這樣,調試程序比較方便。但封裝也帶來問題,相同的數(shù)據(jù),相同的操作,每個類封裝一套(例如四則運算、兩數(shù)比較、Hash索引等)那就太繁雜了,繼承能解決這個問題。每個類都可以派生許多子類,子類繼承父類的屬性和方法。子類又可以派生它的子類……老祖宗的屬性和方法可以一代一代傳到最新派生的(子)類。上一頁下一頁返回2.4面向對象程序語言的基本特征把最“老”的稱為Object,把一般四則運算、兩數(shù)比較等大家都用得到的屬性和方法定義在其中,以后派生類就不用寫了,只定義派生類“自己的”屬性和方法,這就構成樹狀的繼承體系,如圖2-21所示。2.4.5多態(tài)性注意到上述類中有許多方法是同名的,但是,由于它們所屬類不同,編譯器不會弄混。例如Print_List方法:上一頁下一頁返回2.4面向對象程序語言的基本特征現(xiàn)在,在程序中進行聲明并使用定義的對象:上一頁下一頁返回2.4面向對象程序語言的基本特征此時p->Print_List()就是多態(tài)的,有時是父類Employee實例的數(shù)據(jù),有時是子類Manager實例數(shù)據(jù),因為面向對象允許子類實例就是父類實例。*p所代表的既可以是雇員也可以是經理,這種多態(tài)性的好處是不因雇員、經理數(shù)量多少而更改程序。請注意在給定的C++程序中若沒有虛函數(shù)Virtual關鍵字,這種自動動態(tài)切換是無法實現(xiàn)的。上一頁下一頁返回2.4面向對象程序語言的基本特征由于繼承,屬性和方法可能重名,這就產生了多態(tài)(同一名字執(zhí)行內容不同)。靜態(tài)(在編譯或連接)時就可以分辨的叫作重載(Overloading),例如多個構造函數(shù)是最常見的。運行中根據(jù)執(zhí)行情況才能決定束定(也叫作邦定)到哪個方法體。2.4.6類繼承帶來的新問題

概括繼承繼承不僅僅為了重用,少寫代碼的聚集,繼承父類的方法和屬性,加入本類自己的屬性和方法,越聚越大,派生類越來越有用。上一頁下一頁返回2.4面向對象程序語言的基本特征如圖2-23(b)所示,寫這種繼承的各個類定義不會有困難,但派生類的實例不可能定義父類實例,“平房”決不是“點”類實例對象,因其違背了模型客觀世界對象繼承的關系。面向對象假定的繼承是概括繼承。如圖2-23(a)所示,任何派生類的實例都是父類實例。

多繼承多繼承的體系結構是一個網(wǎng)狀模型。C++支持多繼承,在定義類時寫:上一頁下一頁返回2.4面向對象程序語言的基本特征Java和C#堅決不用多繼承,類庫是單繼承的樹狀模型,而實際問題要多繼承怎么辦?用接口類解決,作如下定義:class類名:[Public]父類名,[Public]接口類名1,[Public]接口類名2,…

可見性規(guī)則有了繼承關系,以前設定的可見性規(guī)則就復雜化了,既然是“血統(tǒng)”關系,以前不對外開放的(私有)成員,對子孫就要開放。所以,類定義中Protected指出該成員對家族外是私有,對內公有。真正私有的還只限于本類方法訪問。圖2-24給出派生類中成員的可見性。上一頁下一頁返回2.4面向對象程序語言的基本特征就派生類而言,父類私有的成員(不計繼承其他類的)一律隱含是派生類的私有成員。除非父類選擇protected,派生類也不能訪問這些私有成員。父類公有成員不聲明[public]也是私有。當然,詳細的規(guī)則還要看各語言的參考手冊。

嵌套類可見性當一個類的成員不是屬性和方法而是類class時,叫做嵌套類。這些子類和其父類不是派生—繼承關系而是直接包容關系。嵌套類成員的訪問性控制和普通成員的訪問性控制的關鍵字解釋是一樣的。沒有修飾符的嵌套類為包容類私有類,它的實例外部不可訪問,加public修飾后的內嵌套和一般普通類的使用沒什么差別。上一頁下一頁返回2.4面向對象程序語言的基本特征由于繼承和包容在面向對象語言增加了許多修飾性的關鍵字,要弄清楚繼承、包容、可見性控制并不難。當然,少數(shù)關鍵字是為其他機制增加的,以下是Java的類和類體聲明:上一頁下一頁返回2.4面向對象程序語言的基本特征其中與類和繼承有關的關鍵字public、abstruct、protected、private、static、extends本章均已解釋。若用final修飾類,該類不再派生;修飾變量,該變量等同于常量。

類體系的組織由于繼承和面向對象化,有了類庫編程越來越簡單。這些支持編程的類(VB叫做構件和控件),有的是應用程序的一部分,有的是調試工具和翻譯工具(Debugger、Compiler、Linker等),有的是工作平臺的支持(從最直接的應用到操作系統(tǒng))。如圖2-25(b)所示,系統(tǒng)類、系統(tǒng)工具類、應用基礎類、應用類不分彼此,大家都是類對象,直接或間接都是Obiect的子類。上一頁下一頁返回2.4面向對象程序語言的基本特征如圖2-25(a)所示,由于類過于龐雜,面向對象提出名字空間(NameSpace)的概念作類體系結構管理。每字空間可以嵌套,每個名字空間下有若干個類。名字空間實際是子類系統(tǒng)和子系統(tǒng)的別名。因為在分布式環(huán)境下如此龐大的類支持不一定在一個站點,也不知道某串子類支持在哪里。有了名字空間系統(tǒng)就可以按名自動索引使用,最新面向對象語言Java、C#均設NameSpace機制,Java中叫做Package(包)。上一頁返回2.5網(wǎng)絡計算時代的編程語言2.5.1HTML和XML網(wǎng)絡計算在網(wǎng)站之間傳遞的是主頁。主頁按http協(xié)議傳遞,頁面格式是HTML(超文本置標語言)。每個站點上都有瀏覽器可以識別以約定標簽標記過的正文,標簽成對形如:<tag>正文</tag>標簽層層嵌套,如一本書先章、節(jié)、段落后復合語句、簡單語句。經過標記之后一段正文信息就成為結構化數(shù)據(jù)。傳到另一站點后,瀏覽器讀出這段正文,就原封不動地轉移了,即使是圖文并茂的多媒體文檔也照傳無誤。上一頁下一頁返回2.5網(wǎng)絡計算時代的編程語言但HTML約定的60多個標簽表達能力有限。它只知道傳遞的內容是符號串和二進制塊。于是,人們發(fā)展了可以由用戶定義標簽的XML(可擴展的置標語言)語言,從而可描述頁面的數(shù)據(jù)內容。頁面格式由XSL或CSS子語言描述。XML可描述數(shù)據(jù)關系比較復雜的數(shù)據(jù)結構,如圖、表、樹、索引文件和數(shù)據(jù)庫中定義的數(shù)據(jù)關系。在數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論