您好,欢迎访问三七文档
著作權所有©旗標出版股份有限公司本著作含書附光碟之內容(不含GPL軟體),僅授權合法持有本書之讀者(包含個人及法人)非商業用途之使用,切勿置放在網路上播放或供人下載,除此之外,未經授權不得將全部或局部內容以任何形式重製、轉載、散佈或以其他任何形式、基於任何目的加以利用。第15章程式語言2本堂課重點15-1何謂程式語言15-2程式語言的發展15-3程式語言的類型15-4著名的程式語言簡介15-5程式的設計與開發過程315-1何謂程式語言身為電腦使用者,我們常會說:『用xx程式來做yy事情。』這麼多能做不同事情、發揮不同功效的應用程式是如何產生的呢?簡單的說,是程式設計人員(Programmer)用程式語言(ProgrammingLanguage)所寫出來的。4何謂程式語言電腦是用來幫助人們解決問題的,而電腦硬體要能幫我們解決問題,就必須有程式(軟體)告訴電腦要做什麼事。所以程式語言可說是人控制電腦如何做事的一種語言,而為了符合不同的需求、解決不同類型的問題,也使資訊界出現各種不同的程式語言,例如一般人可能都曾聽過的組合語言、BASIC、C、C++、Java、...等等。以下我們進一步來瞭解為什麼會有這麼多種不同的程式語言,以及其間的差異。515-2程式語言的發展如果不考慮一百多年前的分析機(AnalyticalEngine,參見第1章),第一個程式語言的出現至今才不過半個世紀多,但在短短的50年,就已發展出數量多到令人眼花撩亂的程式語言種類。程式語言最簡略的分類方式,就是將它們依『抽象化』的程度分成高階語言(High-LevelLanguage)、低階語言(Low-LevelLanguage)兩類:6程式語言的發展以下我們就簡單介紹這幾類不同的語言及其發展過程。7程式語言的發展15-2-1第一代:機器語言關於程式『碼』15-2-2第二代:組合語言15-2-3第三代:高階語言15-2-4第四代及第五代語言8第一位程式設計師:AdaLovelace第一章曾提過早在19世紀時,CharlesBabbage曾設計及製作號稱是第一部計算機的差分機,當時雖未完成,但CharlesBabbage又著手設計另一更複雜的分析機。當時有一位義大利機械學者LuigiFedericoMenebrea以法文發表了一篇描述分析機功能及理論的論文,而CharlesBabbage則請與他合作的AdaLovelace女士(AugustaAdaKing,Lovelace女伯爵,一般簡稱AdaLovelace,著名英國詩人拜倫的女兒)將此文章翻譯成英文。9第一位程式設計師:AdaLovelaceAda除了翻譯外,還加上篇幅勝過原文的註記(Note),在這些註記中,Ada提出了許多有關程式設計的基本理念,甚至還寫下了如何用分析機計算『白努力數』(BernoulliNumbers)的流程。她的成就使得後人稱她為第一位電腦程式設計師,而美國國防部也在1980年,將他們開發設計的程式語言正式命名為Ada語言以茲紀念。10第一位程式設計師:AdaLovelace1115-2-1第一代:機器語言對於電腦來說,它真正所懂得的語言只有一種,就是機器語言。所謂的機器語言,其實是以特定的數字來表示電腦所能進行的各個動作,我們稱這些數字為機器碼(MachineCode)或機器語言。舉例來說,如果把電腦比喻為一個只認得數字命令的機器人,而0代表向前走一步、1代表向後退一步、2代表往左轉90度、而3代表往右轉90度。12第一代:機器語言那麼當我們要命令這個機器人往前走三步、再往右走三步時,就必須下達『0003000』的指令,當電腦看到這一串數字後,就會依照每個數字所代表的意義做出指定的動作:13第一代:機器語言相信大家都會發現,用數字來控制機器人會相當辛苦,因為我們得先熟記每個數字所代表的動作,然後還要能將一連串數字組合起來,以表達我們要機器人做的工作。不過上述的機器人例子,其實已經簡化機器語言的複雜性。CPU只能接受一組預先定義好的指令,而且這些指令其實都只是做一些非常基本的計算或控制動作,所以要讓電腦做一項簡單的動作,可能需要數個指令才能完成。14第一代:機器語言以目前通用於個人電腦的x86系列CPU為例,要讓它計算3-1這個減法計算,必須先將數字3存到暫存器(參見2-2-1節)後再進行運算。15第一代:機器語言任何一個人都可以看得出來,這種以數字表達的語言並不適合人閱讀。因此大家很快就發現要用這種方式撰寫程式,實在太難、太辛苦了。所以人們就開始思考如何能以更友善的方式來撰寫程式。16關於程式『碼』在程式設計的領域,常可聽到程式碼或原始碼(SourceCode)這樣的名詞。『碼』就是由英文字Code翻譯而來,其原意是指機器語言的數字碼。雖然我們使用各種高階語言(後詳)所撰寫的程式早已脫離用數字寫程式的形式,不過Code這個字仍沿用至今,因此對任何程式語言所寫成的原始程式,都可稱之為程式碼或原始碼。1715-2-2第二代:組合語言由於使用以0、1組合成的機器語言來撰寫程式實在太不方便,因此人們就想到將這些機器碼都代換成較方便學習、記憶的助憶碼(Mnemonic),也就是組合語言(AssemblyLanguage)。以前面的機器語言程式為例,將資料從某處移到某處的動作就用英文單字Move的前三字MOV來代表;而將數值減1,就用Decrease的前3字DEC來代表,所以前述的程式用組合語言來寫就變成如表15-2所示。18第二代:組合語言19第二代:組合語言組合語言程式必須轉換成微處理器真的看得懂的機器語言碼,才能讓電腦執行。將組合語言程式轉換成機器語言程式的動作稱為組譯,用來將組合語言碼轉換(翻譯)成機器碼的工具稱為組譯器(Assembler)。20第二代:組合語言雖然用助憶碼來代替原本的數字程式碼已改善原本用機器碼寫程式的諸多不便及容易出錯等缺失,但用組合語言寫程式仍有一大缺點:程式設計者必須對微處理器架構、電腦硬體架構要有充份的認識。例如表15-2中的程式就用到了AX暫存器(AL代表16位元AX暫存器中的低位元組),換言之,要用組合語言寫程式,至少必須認識微處理器中有哪些暫存器可使用、各暫存器的功用為何;如果程式需存取到週邊裝置,則需認識如何透過BIOS或特定的輸出輸入埠(I/OPort),將資料送到輸出裝置或由輸入裝置取得資料。21第二代:組合語言22第二代:組合語言然而要充份認識微處理器架構、電腦硬體架構後才能開始寫程式,就好像要求我們要先瞭解引擎結構、傳動系統之後才能學開車;要先認識無線電原理及語音轉換成無線電的編碼方式才能用手機打電話:這將對汽車、行動電話的推廣有莫大的阻礙。同理,組合語言提高了撰寫程式的門檻,也因此限制了電腦的普及。此外,以組合語言撰寫程式還有下列缺點:23第二代:組合語言因為使用的助憶碼仍是代表微處理器的指令,也就是要以微處理器的角度來思考問題,開發程式仍相當不便。不同硬體架構的微處理器其機器碼都各不同,例如一般個人電腦所用的IntelPentiumCPU,和昇陽(Sun)公司的SPARCCPU其機器語言就不相同,組合語言也有差異,要讓程式可在不同的電腦上執行,必須重新改寫程式。2415-2-3第三代:高階語言不論是機器語言還是組合語言,對於程式的描述都是以電腦所能進行的最基本動作為步驟,因此這兩種語言被稱為低階語言。為了讓人們能以更接近人的思考方式來寫程式,就有了所謂的高階語言。第一個被廣泛使用的高階語言為1950年代所開發出來的Fortran(FormulaTranslator)語言,此後更多的語言如COBOL、BASIC、Pascal、C...等等就如雨後春筍般地出現。25第三代:高階語言高階語言中有些是專為某些用途而設計的,但也有些是特別設計成通用性(GeneralPurpose)的語言,但由於各語言都有不同優缺點,也因此各有其適用的場合,再加上每個人對語言有不同的喜好程度,所以至今仍有相當多的語言存在,我們也因此有許多程式語言可選擇。26第三代:高階語言高階語言與低階語言之間最明顯的差異,在於高階語言多是以近似英語的語法來撰寫,因此學習的難度降低,寫來也較不容易出錯。例如以下的BASIC語言程式片段,就算沒學過BASIC語言的人,也能大概猜出其意思。27第三代:高階語言28第三代:高階語言圖15-6中的BASIC程式做的事很簡單:請使用者輸入姓名和年齡,再將使用者是幾歲用英文輸出到螢幕上。程式中的INPUT、PRINT就是所謂的關鍵字(Keyword)或保留字(ReservedWord),INPUT就是『取得輸入』的意思、PRINT就是『印出』一段訊息。每種程式語言因功能各有不同,所以都有不同的關鍵字或保留字,而且通常都會取與該英文單字同樣的意思,例如很多語言都有IF這個關鍵字,表示『如果...』,透過它就能設計出『如果買的商品超過5件都打8折...』這類的程式。29第三代:高階語言在上述程式片段中所出現的age%、Name$稱為變數(Variable),在高階程式語言中,藉由變數這種比較抽象的資料表示方式,讓程式設計者不必像在寫低階語言程式時還要自行操作暫存器或記憶體位址,所以就算對硬體架構不熟悉,也能寫出實用的程式。30第三代:高階語言雖然寫程式的門檻降低,但也連帶使程式的執行效能下降:一般而言,同樣的程式,用高階語言撰寫者,其執行效能會比以組合語言撰寫者差。不過透過編譯器(後詳)的改良、硬體速度的飛快成長,使其間差異愈來愈小,甚至可忽略,因此目前通常只在特別要求執行效能的程式,才會使用組合語言。高階語言寫成的程式,和組合語言一樣需要經過轉譯的動作,才能變成電腦認得的機器語言並執行之。高階語言轉譯的動作分成兩種:編譯(Compile)及直譯(Interpret)。31第三代:高階語言編譯函式庫直譯程式語言種類與執行方式的關係32編譯所謂編譯的方式,是先將整個程式從頭到尾讀完,然後將其內容轉換成電腦所認識的機器碼。這就好像是翻譯一篇文章,是先將整篇文章從頭讀到到尾後,將它全部翻譯好,然後才拿給讀者閱讀。將文章一次翻譯好,往後不論何時或何人需要閱讀,都不需要再重新翻譯,就可以直接閱讀翻譯好的版本。不過相對來說,在第一次想要閱讀之前,就必須先花時間等待譯者翻譯完畢才行。編譯程式也是如此,編譯時會花一點時間,一旦編譯完成,往後隨時都可執行程式。33編譯編譯時所用的工具稱為編譯器(Compiler),編譯器會將用高階語言寫的程式轉成機器碼。34編譯高階語言程式經過編譯後即產生機器碼,通常並非可立即執行的可執行檔(Excutable),編譯後的產物稱為目的碼(ObjectCode)或目的檔(ObjectFile)。這是因為高階語言程式中通常會用到別人或自己事先寫好的其它程式(例如函式庫),所以編譯好程式後,必須再用連結器(Linker)將我們程式的目的碼與其它程式的目的碼連結後,才會產生實際可執行的程式。35編譯36編譯由於每種電腦的機器語言並不相同,比如說一般所用的x86個人電腦(PC)和昇陽工作站(SunWorkstation)的機器語言就不相同。因此,同一個程式如果要在不同的機器上執行,就必須使用專為該種電腦所設計的編譯器,轉譯出符合該電腦的機器碼才行。37函式庫雖然每個人寫程式的目的不同、用途也五花八門,但不可免的是所有程式都會有彼此重疊的功能。例如瀏覽器、電子郵件軟體、線上聊天程式,雖然其功能各有不同,很顯然這些程式都要有一段透過TCP/IP通訊協定將資料送到網路、或接收資料的功能。如果每個開發瀏覽器、電子郵件軟體、線上聊天程式的程式設計人員,都要自己撰寫這段功能相同的程式,則軟體產業就太沒有效率,我們今天也不會有這麼多五花八門的應用程式可以使用。38函式庫因此為了避免『重複發明輪子』(ReinventtheWheel)的窘境,許多程式語言都將一些常用的程式功能事先設計好,讓寫程式的人可直接『呼叫(Call)』它們,如此就不必每個人都
本文标题:第15章程式语言
链接地址:https://www.777doc.com/doc-599285 .html