程式语言课件_第1页
程式语言课件_第2页
程式语言课件_第3页
程式语言课件_第4页
程式语言课件_第5页
已阅读5页,还剩237页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第15章程式語言第15章程式語言本堂課重點15-1何謂程式語言15-2程式語言的發展15-3程式語言的類型15-4著名的程式語言簡介15-5程式的設計與開發過程2本堂課重點15-1何謂程式語言215-1何謂程式語言身為電腦使用者,我們常會說:『用xx程式來做yy事情。』這麼多能做不同事情、發揮不同功效的應用程式是如何產生的呢?簡單的說,是程式設計人員(Programmer)用程式語言(ProgrammingLanguage)所寫出來的。315-1何謂程式語言身為電腦使用者,我們常會說:『用xx何謂程式語言電腦是用來幫助人們解決問題的,而電腦硬體要能幫我們解決問題,就必須有程式(軟體)告訴電腦要做什麼事。所以程式語言可說是人控制電腦如何做事的一種語言,而為了符合不同的需求、解決不同類型的問題,也使資訊界出現各種不同的程式語言,例如一般人可能都曾聽過的組合語言、BASIC、C、C++、Java、...等等。以下我們進一步來瞭解為什麼會有這麼多種不同的程式語言,以及其間的差異。4何謂程式語言電腦是用來幫助人們解決問題的,而電腦硬體要能幫15-2程式語言的發展如果不考慮一百多年前的分析機(AnalyticalEngine,參見第1章),第一個程式語言的出現至今才不過半個世紀多,但在短短的50年,就已發展出數量多到令人眼花撩亂的程式語言種類。程式語言最簡略的分類方式,就是將它們依『抽象化』的程度分成高階語言(High-LevelLanguage)、低階語言(Low-LevelLanguage)兩類:515-2程式語言的發展如果不考慮一百多年前的分析機(An程式語言的發展以下我們就簡單介紹這幾類不同的語言及其發展過程。6程式語言的發展以下我們就簡單介紹這幾類不同的語言及其發展過程程式語言的發展15-2-1第一代:機器語言關於程式『碼』15-2-2第二代:組合語言15-2-3第三代:高階語言15-2-4第四代及第五代語言7程式語言的發展15-2-1第一代:機器語言7第一位程式設計師:AdaLovelace第一章曾提過早在19世紀時,CharlesBabbage曾設計及製作號稱是第一部計算機的差分機,當時雖未完成,但CharlesBabbage又著手設計另一更複雜的分析機。當時有一位義大利機械學者LuigiFedericoMenebrea以法文發表了一篇描述分析機功能及理論的論文,而CharlesBabbage則請與他合作的AdaLovelace女士(AugustaAdaKing,Lovelace女伯爵,一般簡稱AdaLovelace,著名英國詩人拜倫的女兒)將此文章翻譯成英文。8第一位程式設計師:AdaLovelace第一章曾提過早在第一位程式設計師:AdaLovelaceAda除了翻譯外,還加上篇幅勝過原文的註記(Note),在這些註記中,Ada提出了許多有關程式設計的基本理念,甚至還寫下了如何用分析機計算『白努力數』(BernoulliNumbers)的流程。她的成就使得後人稱她為第一位電腦程式設計師,而美國國防部也在1980年,將他們開發設計的程式語言正式命名為Ada語言以茲紀念。9第一位程式設計師:AdaLovelaceAda除了翻譯外第一位程式設計師:AdaLovelace10第一位程式設計師:AdaLovelace1015-2-1第一代:機器語言對於電腦來說,它真正所懂得的語言只有一種,就是機器語言。所謂的機器語言,其實是以特定的數字來表示電腦所能進行的各個動作,我們稱這些數字為機器碼(MachineCode)或機器語言。舉例來說,如果把電腦比喻為一個只認得數字命令的機器人,而0代表向前走一步、1代表向後退一步、2代表往左轉90度、而3代表往右轉90度。1115-2-1第一代:機器語言對於電腦來說,它真正所懂得的語第一代:機器語言那麼當我們要命令這個機器人往前走三步、再往右走三步時,就必須下達『0003000』的指令,當電腦看到這一串數字後,就會依照每個數字所代表的意義做出指定的動作:12第一代:機器語言那麼當我們要命令這個機器人往前走三步、再往右第一代:機器語言相信大家都會發現,用數字來控制機器人會相當辛苦,因為我們得先熟記每個數字所代表的動作,然後還要能將一連串數字組合起來,以表達我們要機器人做的工作。不過上述的機器人例子,其實已經簡化機器語言的複雜性。CPU只能接受一組預先定義好的指令,而且這些指令其實都只是做一些非常基本的計算或控制動作,所以要讓電腦做一項簡單的動作,可能需要數個指令才能完成。13第一代:機器語言相信大家都會發現,用數字來控制機器人會相當第一代:機器語言以目前通用於個人電腦的x86系列CPU為例,要讓它計算"3-1"這個減法計算,必須先將數字3存到暫存器(參見2-2-1節)後再進行運算。14第一代:機器語言以目前通用於個人電腦的x86系列CPU第一代:機器語言任何一個人都可以看得出來,這種以數字表達的語言並不適合人閱讀。因此大家很快就發現要用這種方式撰寫程式,實在太難、太辛苦了。所以人們就開始思考如何能以更友善的方式來撰寫程式。15第一代:機器語言任何一個人都可以看得出來,這種以數字表達的關於程式『碼』在程式設計的領域,常可聽到程式碼或原始碼(SourceCode)這樣的名詞。『碼』就是由英文字Code翻譯而來,其原意是指機器語言的數字碼。雖然我們使用各種高階語言(後詳)所撰寫的程式早已脫離用數字寫程式的形式,不過Code這個字仍沿用至今,因此對任何程式語言所寫成的原始程式,都可稱之為程式碼或原始碼。16關於程式『碼』在程式設計的領域,常可聽到程式碼或原始碼(15-2-2第二代:組合語言由於使用以0、1組合成的機器語言來撰寫程式實在太不方便,因此人們就想到將這些機器碼都代換成較方便學習、記憶的助憶碼(Mnemonic),也就是組合語言(AssemblyLanguage)。以前面的機器語言程式為例,將資料從某處移到某處的動作就用英文單字Move的前三字MOV來代表;而將數值減1,就用Decrease的前3字DEC來代表,所以前述的程式用組合語言來寫就變成如表15-2所示。1715-2-2第二代:組合語言由於使用以0、1組合成的機第二代:組合語言18第二代:組合語言18第二代:組合語言組合語言程式必須轉換成微處理器真的看得懂的機器語言碼,才能讓電腦執行。將組合語言程式轉換成機器語言程式的動作稱為組譯,用來將組合語言碼轉換(翻譯)成機器碼的工具稱為組譯器(Assembler)。19第二代:組合語言組合語言程式必須轉換成微處理器真的看得懂的機第二代:組合語言雖然用助憶碼來代替原本的數字程式碼已改善原本用機器碼寫程式的諸多不便及容易出錯等缺失,但用組合語言寫程式仍有一大缺點:程式設計者必須對微處理器架構、電腦硬體架構要有充份的認識。例如表15-2中的程式就用到了AX暫存器(AL代表16位元AX暫存器中的低位元組),換言之,要用組合語言寫程式,至少必須認識微處理器中有哪些暫存器可使用、各暫存器的功用為何;如果程式需存取到週邊裝置,則需認識如何透過BIOS或特定的輸出輸入埠(I/OPort),將資料送到輸出裝置或由輸入裝置取得資料。20第二代:組合語言雖然用助憶碼來代替原本的數字程式碼已改善原本第二代:組合語言21第二代:組合語言21第二代:組合語言然而要充份認識微處理器架構、電腦硬體架構後才能開始寫程式,就好像要求我們要先瞭解引擎結構、傳動系統之後才能學開車;要先認識無線電原理及語音轉換成無線電的編碼方式才能用手機打電話:這將對汽車、行動電話的推廣有莫大的阻礙。同理,組合語言提高了撰寫程式的門檻,也因此限制了電腦的普及。此外,以組合語言撰寫程式還有下列缺點:22第二代:組合語言然而要充份認識微處理器架構、電腦硬體架構後才第二代:組合語言因為使用的助憶碼仍是代表微處理器的指令,也就是要以微處理器的角度來思考問題,開發程式仍相當不便。不同硬體架構的微處理器其機器碼都各不同,例如一般個人電腦所用的IntelPentiumCPU,和昇陽(Sun)公司的SPARCCPU其機器語言就不相同,組合語言也有差異,要讓程式可在不同的電腦上執行,必須重新改寫程式。23第二代:組合語言因為使用的助憶碼仍是代表微處理器的指令,也15-2-3第三代:高階語言不論是機器語言還是組合語言,對於程式的描述都是以電腦所能進行的最基本動作為步驟,因此這兩種語言被稱為低階語言。為了讓人們能以更接近人的思考方式來寫程式,就有了所謂的高階語言。第一個被廣泛使用的高階語言為1950年代所開發出來的Fortran(FormulaTranslator)語言,此後更多的語言如COBOL、BASIC、Pascal、C...等等就如雨後春筍般地出現。2415-2-3第三代:高階語言不論是機器語言還是組合語言,第三代:高階語言高階語言中有些是專為某些用途而設計的,但也有些是特別設計成通用性(GeneralPurpose)的語言,但由於各語言都有不同優缺點,也因此各有其適用的場合,再加上每個人對語言有不同的喜好程度,所以至今仍有相當多的語言存在,我們也因此有許多程式語言可選擇。25第三代:高階語言高階語言中有些是專為某些用途而設計的,但也第三代:高階語言高階語言與低階語言之間最明顯的差異,在於高階語言多是以近似英語的語法來撰寫,因此學習的難度降低,寫來也較不容易出錯。例如以下的BASIC語言程式片段,就算沒學過BASIC語言的人,也能大概猜出其意思。26第三代:高階語言高階語言與低階語言之間最明顯的差異,在於高第三代:高階語言27第三代:高階語言27第三代:高階語言圖15-6中的BASIC程式做的事很簡單:請使用者輸入姓名和年齡,再將使用者是幾歲用英文輸出到螢幕上。程式中的INPUT、PRINT就是所謂的關鍵字(Keyword)或保留字(ReservedWord),INPUT就是『取得輸入』的意思、PRINT就是『印出』一段訊息。每種程式語言因功能各有不同,所以都有不同的關鍵字或保留字,而且通常都會取與該英文單字同樣的意思,例如很多語言都有IF這個關鍵字,表示『如果...』,透過它就能設計出『如果買的商品超過5件都打8折...』這類的程式。28第三代:高階語言圖15-6中的BASIC程式做的事很第三代:高階語言在上述程式片段中所出現的age%、Name$稱為變數(Variable),在高階程式語言中,藉由變數這種比較抽象的資料表示方式,讓程式設計者不必像在寫低階語言程式時還要自行操作暫存器或記憶體位址,所以就算對硬體架構不熟悉,也能寫出實用的程式。29第三代:高階語言在上述程式片段中所出現的age%、Nam第三代:高階語言雖然寫程式的門檻降低,但也連帶使程式的執行效能下降:一般而言,同樣的程式,用高階語言撰寫者,其執行效能會比以組合語言撰寫者差。不過透過編譯器(後詳)的改良、硬體速度的飛快成長,使其間差異愈來愈小,甚至可忽略,因此目前通常只在特別要求執行效能的程式,才會使用組合語言。高階語言寫成的程式,和組合語言一樣需要經過轉譯的動作,才能變成電腦認得的機器語言並執行之。高階語言轉譯的動作分成兩種:編譯(Compile)及直譯(Interpret)。30第三代:高階語言雖然寫程式的門檻降低,但也連帶使程式的執行第三代:高階語言編譯函式庫直譯程式語言種類與執行方式的關係31第三代:高階語言編譯31編譯所謂編譯的方式,是先將整個程式從頭到尾讀完,然後將其內容轉換成電腦所認識的機器碼。這就好像是翻譯一篇文章,是先將整篇文章從頭讀到到尾後,將它全部翻譯好,然後才拿給讀者閱讀。將文章一次翻譯好,往後不論何時或何人需要閱讀,都不需要再重新翻譯,就可以直接閱讀翻譯好的版本。不過相對來說,在第一次想要閱讀之前,就必須先花時間等待譯者翻譯完畢才行。編譯程式也是如此,編譯時會花一點時間,一旦編譯完成,往後隨時都可執行程式。32編譯所謂編譯的方式,是先將整個程式從頭到尾讀完,然後將其編譯編譯時所用的工具稱為編譯器(Compiler),編譯器會將用高階語言寫的程式轉成機器碼。33編譯編譯時所用的工具稱為編譯器(Compiler),編譯器編譯高階語言程式經過編譯後即產生機器碼,通常並非可立即執行的可執行檔(Excutable),編譯後的產物稱為目的碼(ObjectCode)或目的檔(ObjectFile)。這是因為高階語言程式中通常會用到別人或自己事先寫好的其它程式(例如函式庫),所以編譯好程式後,必須再用連結器(Linker)將我們程式的目的碼與其它程式的目的碼連結後,才會產生實際可執行的程式。34編譯高階語言程式經過編譯後即產生機器碼,通常並非可立即執行編譯35編譯35編譯由於每種電腦的機器語言並不相同,比如說一般所用的x86個人電腦(PC)和昇陽工作站(SunWorkstation)的機器語言就不相同。因此,同一個程式如果要在不同的機器上執行,就必須使用專為該種電腦所設計的編譯器,轉譯出符合該電腦的機器碼才行。36編譯由於每種電腦的機器語言並不相同,比如說一般所用的x8函式庫雖然每個人寫程式的目的不同、用途也五花八門,但不可免的是所有程式都會有彼此重疊的功能。例如瀏覽器、電子郵件軟體、線上聊天程式,雖然其功能各有不同,很顯然這些程式都要有一段透過TCP/IP通訊協定將資料送到網路、或接收資料的功能。如果每個開發瀏覽器、電子郵件軟體、線上聊天程式的程式設計人員,都要自己撰寫這段功能相同的程式,則軟體產業就太沒有效率,我們今天也不會有這麼多五花八門的應用程式可以使用。37函式庫雖然每個人寫程式的目的不同、用途也五花八門,但不可免函式庫因此為了避免『重複發明輪子』(ReinventtheWheel)的窘境,許多程式語言都將一些常用的程式功能事先設計好,讓寫程式的人可直接『呼叫(Call)』它們,如此就不必每個人都要自己寫一段功能相同的程式了。這些事先寫好的程式,依程式語言的不同,有些稱其為子程序(Subroutine)、或函式(Function)、或程序(Procedure)等等。38函式庫因此為了避免『重複發明輪子』(Reinventth函式庫這些寫好的程式都會事先編譯好,其目的碼則集合存於函式庫(FunctionLibrary)中,像C語言就有提供處理輸出/入、數學、時間等多類功能的函式庫。當我們的程式需要計算某數的平方根時,不必自己設計算平方根的程式,只需以該數字為參數,呼叫函式庫中的sqrt()函式,該函式就會自動將計算結果傳回給我們的程式。39函式庫這些寫好的程式都會事先編譯好,其目的碼則集合存於函式函式庫(a)程式呼叫函式庫內函式的情形40函式庫(a)程式呼叫函式庫內函式的情形40函式庫(b)程式的目的碼需與函式庫連結才能產生可執行檔41函式庫(b)程式的目的碼需與函式庫連結才能產生可執行檔41函式庫除了程式語言本身的函式庫,軟體廠商也會提供函式庫給大家使用,例如微軟公司會提供設計Windows應用程式所需的函式庫,讓大家能方便撰寫Windows應用程式(要不然每個寫Windows程式的人都要自己寫一段顯示『視窗』的程式)。對於這類具有特定功能的函式庫,其提供的功能一般又稱為應用程式開發介面(API,ApplicationProgrammingInterface),例如設計Windows應用程式所用的函式庫稱為WinAPI、Win32API(32是32位元的意思)。42函式庫除了程式語言本身的函式庫,軟體廠商也會提供函式庫給大函式庫提供API的可以是作業系統或其它的應用程式,我們的程式只要呼叫它們所提供的API,即可讓它們執行某項功能。43函式庫提供API的可以是作業系統或其它的應用程式,我們直譯直譯式的作法和編譯式有很大的差異,直譯式是用直譯器(Interpreter,亦稱為解譯器)每讀取程式中的一個敘述(Statement)時,即翻譯成機器碼執行之,並持續這樣邊讀程式、邊執行程式。這就好像是參加國際會議時的現場口譯一樣,主講者邊講,口譯者便即時翻譯給大家聽。44直譯直譯式的作法和編譯式有很大的差異,直譯式是用直譯器(直譯同步口譯的好處是,只要主講者講完第一句話,口譯者便開始翻譯,而不需要等待主講者整篇發言完畢。但相對的,由於口譯者即時翻譯完就結束了,因此如果需要重新聽一遍,就只好從頭再請口譯者翻譯了。直譯式的原理也是如此,每次執行時都要啟動解譯器,然後載入原始程式逐步解讀、執行。且由於沒有儲存轉譯的結果,往後要再執行相同的程式時,又要重新解譯一次。45直譯同步口譯的好處是,只要主講者講完第一句話,口譯者便開程式語言種類與執行方式的關係大部分的程式語言,都有其固有的執行方式。比如說,C/C++一般都是編譯式;而Basic一般則是直譯式。因此過去也常將高階語言分類成直譯式語言和編譯式語言。不過這種分類方式已漸不適用,因為目前許多語言都有直譯器和編譯器可用,例如有人為C++語言設計出直譯式的直譯器;相同的,也有軟體公司為Basic語言做出編譯器。不論是編譯式或是直譯式,兩種方法各有巧妙,而以目前較為流行的程式語言來說,兩種方式都各有擅長。46程式語言種類與執行方式的關係大部分的程式語言,都有其固有的程式語言種類與執行方式的關係47程式語言種類與執行方式的關係4715-2-4第四代及第五代語言高階程式語言雖然讓人們能更輕鬆編寫程式,但實際上,要『寫好』程式,仍需經過相當多的學習與訓練。因此為了減輕程式設計者的負擔,讓寫程式變得更容易,就有人發展出所謂的第四代語言。4815-2-4第四代及第五代語言高階程式語言雖然讓人們能更輕第四代及第五代語言不過對第四代語言目前並無明確的定義,大體而言,一般所稱的第四代語言都是指能自動產生程式的工具,例如報表產生器(ReportGenerator)及CASE(ComputerAidSoftwareEngineer,電腦輔助軟體工程)工具;或是可花較短時間即可學會的特定用途語言,例如專門用於查詢資料庫資料的SQL語言,其語法比第三代語言更加口語化,學習的門檻也降低。49第四代及第五代語言不過對第四代語言目前並無明確的定義,大體第四代及第五代語言50第四代及第五代語言50第四代及第五代語言至於第五代語言(5GL,FifthGenerationLanguages)則被稱為自然語言(NatureLanguage),其目的是希望人們能以更接近日常生活的方式來命令電腦(設計程式就是要控制電腦),此一理念是與第五代電腦的計劃一起提出的。然而由於第五代電腦的發展計劃也無實際的成果,第五代語言的概念早在上個世紀即被提出,但發展多年仍未有比較實用的成果。51第四代及第五代語言至於第五代語言(5GL,FifthG15-3程式語言的類型除了用程式語言的發展歷程來分類外,也可用程式語言的設計架構(Paradigm)來做分類,亦即以設計程式時所用的設計方法來分類。主要的4種分類為:命令式(Imperative)語言、函數式(Functional)語言、邏輯式(Logic)語言、及物件導向式(Object-Oriented)語言。5215-3程式語言的類型除了用程式語言的發展歷程來分類外,程式語言的類型15-3-1命令式語言15-3-2函數式語言15-3-3邏輯式語言15-3-4物件導向式語言15-3-5其它程式設計類型53程式語言的類型15-3-1命令式語言5315-3-1命令式語言命令式(Imperative)語言是『用一組有次序性的命令』來組成一個程式,只要逐步執行程式中的每一個命令,即可得到所要的結果。因此也有人稱之為程序式(Procedural)語言,因為程式的內容就像一連串的程序;或稱敘述導向式(StatementOriented)語言,因為程式就是由一道道的敘述所組成。5415-3-1命令式語言命令式(Imperative)語命令式語言命令式語言的特性包括可定義用來儲存資料的變數、可對變數進行指定(assign)動作將它設為某個數值、具有重複性,也就是可讓程式重複執行某些敘述以達到某項功能。舉例來說,大家都曾學過用『輾轉相除法』來計算兩個數的最大公因數,輾轉相除就是一個要重複做的計算動作,這個計算過程,用C語言寫成的內容如圖15-13所示。55命令式語言命令式語言的特性包括可定義用來儲存資料的變數、可對命令式語言56命令式語言56命令式語言數年前使用較普遍的程式語言,大部分仍都是命令式語言,包括歷史悠久的Fortran、COBOL、C、Pascal等等,但近年來的趨勢則是Java、C++等物件導向式語言漸成主流。57命令式語言數年前使用較普遍的程式語言,大部分仍都是命令式語15-3-2函數式語言函數式語言源自於數學的函數觀念,語言本身就提供一些基本的函數(例如加減乘除都是函數),設計程式時則是定義自訂的函數模組(稱為λ,lambda)來解決問題。例如前述的求最大公因數問題,可將求最大公因數的計算方式定義成一個自訂函數,然後用它來計算任兩數的最大公因數,如圖15-15所示。5815-3-2函數式語言函數式語言源自於數學的函數觀念,語函數式語言最早的函數式程式語言為JohnMcCarthy於1958年所發展出的LISP(ListProcessing)語言,其後衍生出許多語言,目前較知名的有CommonLISP、Logo及Scheme等語言。59函數式語言最早的函數式程式語言為JohnMcCarthy15-3-3邏輯式語言顧名思義,邏輯式語言是用邏輯性的敘述來說明事物彼此的邏輯及推演關係,在邏輯式語言中稱之為事實(Fact)和規則(Rule),定好事實和規則後,即可利用它們的邏輯關係推演出使用者需要的答案。同樣以求最大公因數為例,使用邏輯式語言時,就需先定義計算最大公因數的事實與規則,圖15-17即是用邏輯式語言Prolog所寫成的程式。6015-3-3邏輯式語言顧名思義,邏輯式語言是用邏輯性的敘邏輯式語言61邏輯式語言61邏輯式語言早期的邏輯式程式語言以1972年AlainColmerauer和RobertKowalski所創的Prolog(programmationenlogique,法文的"programminginlogic")為濫觴,其後雖然在學術界出現不少邏輯式程式語言,但仍以Prolog及其商業化的旁枝(例如TurboProlog、VisualProlog)為主流。此外日本在發展其第五代電腦時,該計劃也是以Prolog為主要的開發語言。62邏輯式語言早期的邏輯式程式語言以1972年Alain15-3-4物件導向式語言物件導向程式設計是因應模擬人們實際接觸到的事物而生的,在我們平常接觸到的事物,不管是汽車、電視、小狗,都可視為一種物件(Object)。物件能用一組屬性來描述其特性,例如汽車物件有顏色、輪子;而同類物件也會有類似的行為,例如汽車可前進、後退、轉彎。此時我們就可用類別(Class)定義來描述同一類型的物件,例如卡車、跑車、轎車都可算是汽車類別。6315-3-4物件導向式語言物件導向程式設計是因應模擬人們實物件導向式語言64物件導向式語言64物件導向式語言定義好類別後即可用類別來定義不同的物件,例如我們可用汽車類別定義一輛手排的紅色跑車物件,或一輛自排的銀色轎車物件。各物件可依需要做不同的行為,例如紅色跑車換檔加速,銀車轎車剎車減速。65物件導向式語言定義好類別後即可用類別來定義不同的物件,例如物件導向式語言66物件導向式語言66物件導向式語言最早的物件導向程式語言為1960年代由Ole-JohanDahl和KristenNygaard所發展出來的Simula語言(取『模擬』Simulation之意),其後也衍生出許多語言,例如近年來最熱門的C++和Java,其它較知名的還有Smalltalk、Ada等。67物件導向式語言最早的物件導向程式語言為1960年代由O15-3-5其它程式設計類型除了以上幾種程式設計類型外,還有許多方式可將程式設計的方法或程式語言加以歸類,例如並行程式設計(ConcurrentProgramming)、泛型程式設計(GenericProgramming)等等。許多程式設言其實是支援一種以上的程式設計方法,例如C++語言,雖然一般視之為物件導向程式語言,但它其實也同時支援命令式及泛型程式設計方法,所以我們也可設計一個看起來仍是命令式、程序式的C++程式。6815-3-5其它程式設計類型除了以上幾種程式設計類型外,15-4著名的程式語言簡介15-4-1Assembly15-4-2Fortran15-4-3COBOL15-4-4BASIC15-4-5Pascal15-4-6C/C++15-4-7Java6915-4著名的程式語言簡介15-4-1Assembly615-4-1Assembly第一個組合語言應該是於1945年時發展出來的ENIAC電腦(參見第1章)的組合語言,起初連組譯器都沒有,因此人們所寫出的組合語言程式,仍是以人工將之譯為機器碼。如前所述,組合語言是以助憶碼來取代機器語言,不管是您桌上個人電腦或口袋中的行動電腦,其內的微處理器的機器語言都不相同,因此也各有自己的組合語言。雖然很多微處理器的組合語言外表看來都很類似,也有相同的指令,但因硬體架構的不同,使同樣功能的程式寫出來也有很大的差異。7015-4-1Assembly第一個組合語言應該是於194Assembly現今雖然大部份的程式都是用高階語言所寫,但在開發某些系統時,為了追求較佳的執行效率,有時仍會用組合語言來開發部份的程式模組。另一方面,現今組譯器的功能也有所加強,例如透過特殊的組譯器指令(Directive)來提供類似高階語言的語法,以簡化程式的撰寫。71Assembly現今雖然大部份的程式都是用高階語言所寫,但15-4-2Fortran在1954-1957年時,IBM公司中由JohnBackus領導的團隊開發出Fortran(FormulaTranslation)語言,如其名稱『方程式轉換』的意涵,這是個主要用於數值計算的程式語言。此後Fortran成為第一個被廣泛使用的高階程式語言,而且隨後許多新的程式語言,在開發之初都有參考、使用Fortran語言的內容,因此Fortran也是許多程式語言的祖先。7215-4-2Fortran在1954-1957年時,Fortran雖然Fortran已有相當久的歷史,但仍持續在發展演進,至今在科學、工程的應用領域中仍廣被使用。在1966年時美國國家標準協會(ANSI,AmericanNationalStandardsInstitute)即制訂了Fortran語言第1個標準,稱為Fortran66,其後又有Fortran77、Fortran90、Fortran95、Fortran2003(由國際標準組織-ISO-制訂)等標準。在Fortran90時,即納入了部份物件導向程式設計的特性;至Fortran2003時,對物件導向程式設計的支援更完整,也可算是個物件導向程式語言。73Fortran雖然Fortran已有相當久的歷史,但仍Fortran74Fortran7415-4-3COBOLCOBOL(COmmonBusinessOrientedLanguage)語言是在1959年由美國國防部所主導的一個委員會所訂出的語言規格,並於次年實作出來。如其名稱所示,這是個以商業應用為主的程式語言,且COBOL語言有一項特性,就是程式語法很像英文。7515-4-3COBOLCOBOL(COmmonBusiCOBOL由於除了政府及學術機構外,電腦最主要的用戶就是商業性的組織,所以COBOL語言的使用可說是相當廣泛,數年前的Y2K危機(早期電腦程式只用兩個數字記錄西元紀元,導致到2000年時,會有00是表示1900年或2000年的問題),政府、金融機構即花費大量人力物件在修正其COBOL程式。據稱目前大型主機上所執行的程式,仍有半數以上是以COBOL所撰寫的。76COBOL由於除了政府及學術機構外,電腦最主要的用戶就是商COBOLANSI在1968年制訂了COBOL-68的標準,其後又有COBOL-74、COBOL-85、COBOL2002,而且和Fortran類似,在COBOL2002時納入了支援物件導向程式設計的語法。77COBOLANSI在1968年制訂了COBOL-6815-4-4BASICBASIC(Beginner'sAll-purposeSymbolicInstructionCode)是於1963年由JohnGeorgeKemeny及ThomasEugeneKurtz所發展出來的,其目的是要讓非電腦專業人士也能學習撰寫程式、善用電腦。此後隨著個人電腦的普及,加上當時DOS及早期Windows作業系統中都附有基本的BASIC直譯器(早期甚至有電腦是將BASIC直譯器燒錄在ROM中),使得BASIC一度也成為相當風行的程式語言。7815-4-4BASICBASIC(Beginner'sBASICANSI及ISO雖也有制訂BASIC語言的標準,但並不像其它語言的標準般受重視,反而是廠商的各種BASIC版本較為人知,例如微軟公司從過去的GW-BASIC、QuickBASIC、QBASIC(算是前者的陽春版)一直到現今的VisualBasic,都是廣為人知的產品。早期的BASIC程式每一列開頭都必須加上編號,但現今的各種BASIC語言都不必如此。79BASICANSI及ISO雖也有制訂BASIC語言15-4-5Pascal以紀念法國數學家BlaisePascal而命名的Pascal語言,是於1970年由NiklausWirth發展出來的,其目的和BASIC類似是要做為教學性的語言,但Pascal的對象是大學學生,因此一度大部份電腦相關科系都是以教授Pascal語言為主。在個人電腦萌芽的時代,當AppleII、IBMPC等電腦推出時,也都很快就有Pascal語言的編輯器,使得Pascal成為BASIC外另一個相當普及的程式語言。8015-4-5Pascal以紀念法國數學家BlaisePPascal原本即因推出TurboPascal而廣受歡迎的Borland公司,後來自行加入了物件導向的語法,推出後續的Delphi。不過受近年C++/Java熱潮的影響,Pascal/Delphi受歡迎程度已不如以往,學校教授Pascal的盛況也減少許多,不過仍是有一群固定的愛好者支持。81Pascal原本即因推出TurboPascal而廣受歡15-4-6C/C++C語言C++語言8215-4-6C/C++C語言82C語言C語言是1972年在AT&T貝爾實驗室(BellLaboratory)中發展出來的,原創者DennisRitchie當時是為了要發展UNIX作業系統,所以需要一種具有類似組合語言般的高效率,以及能很方便移植到各機型(高可攜性)之程式語言,於是創造了C語言。後來,由於C語言所具備的效率、彈性、可攜性等各項優點,逐漸成為一種廣受歡迎的程式語言。C語言的優點包括:83C語言C語言是1972年在AT&T貝爾實驗室(C語言程式碼精簡,產生的程式執行效率佳。具有很高的可攜性。完全支援模組化的程式設計。彈性大而擴充性強。84C語言程式碼精簡,產生的程式執行效率佳。84C語言DennisRitchie及BrianKernighan在1978年時合著了TheCProgrammingLanguage,其中所描述的C語言語法規則在當時被視為C的標準,稱為"K&RC"。而ANSI則是在1983年時開始著手制定C語言的標準,並在1989年時推出俗稱為C89的第一版標準;1999年時則有了更新的C99,其中引入了一些原本屬於C++的語法,例如:變數可在任何位置宣告(過去都必須在每個程式區塊的開頭)、支援"//"的註解方式等。85C語言DennisRitchie及BrianKerC++語言C++和C語言一樣,也是在貝爾實驗室中發展出來的。原創者BjarneStroustrup從1979年開始,以C語言為基本架構,再加上物件導向程式設計相關功能,發展出一個名為"CwithClasses"的新語言,其後又經過一些改良,並在1983年時正式被命名為C++,且仍與C相容並保有C原來的各項優點。86C++語言C++和C語言一樣,也是在貝爾實驗室中C++語言C++的標準化是由ANSI和ISO共同進行的,兩個組織在1998年正式發布了編號為ISO/IEC14882:1998的C++標準,簡稱為ISOC++98或C++98。在此之後,各主要C++編譯器廠商大多也都遵循ISO的標準來設計他們的產品。87C++語言C++的標準化是由ANSI和ISO共15-4-7JavaJava程式語言的發展源自1990年昇陽公司(SunMicrosystems)為開發資訊家電(InformationAppliance)所組成的『Green』小組的成果,該小組設計了一個稱為Oak的程式語言。但因為Oak已經被其他公司註冊為商標,因此小組成員才將這個程式語言以他們最愛喝的爪哇(Java)咖啡命名,Java於焉誕生。8815-4-7JavaJava程式語言的發展源自1990Java89Java89Java90Java9015-5程式的設計與開發過程在認識了許多程式語言後,我們回頭來認識一下程式的開發過程:到底程式是如何寫成的?在一般應用程式的開發過程中,『寫程式』究竟佔了多少時間?我們可將程式的開發過程分為以下6個步驟:定義與分析問題設計解決方案撰寫程式測試與除錯製作文件後續維護9115-5程式的設計與開發過程在認識了許多程式語言後,我們程式的設計與開發過程1.定義與分析問題2.設計解決方法3.撰寫程式4.測試與除錯5.製作文件6.後續維護92程式的設計與開發過程1.定義與分析問題921.定義與分析問題寫程式就是為了讓電腦來幫助我們解決問題,因此程式設計的第1步,就是要先釐清問題,以及希望得到的結果(需求)。如果我們要寫的程式是學校程式設計課程中的一個簡單作業,那這個程式的問題就不會太複雜,因為問題和需求通常老師都已訂好了,學生只要有辨法寫出程式即可。931.定義與分析問題寫程式就是為了讓電腦來幫助我們解決問題,定義與分析問題但在商業應用程式的領域,使用者要解決的問題及需求會比學校作業複雜許多,因此這時候程式設計者、或是專責系統分析的人員,就要與使用者(客戶)做相當多的溝通,例如公司的訂單格式為何、上面有什麼資料、有哪些資料要輸入到程式、訂單資料應如何分類、使用者希望以哪些方式查詢、程式要提供哪些訂單統計資訊...,這些問題都必須在事先釐清,寫出來的程式才有可能符合使用者的需求,不致於發生程式寫好但不符需求,而必須重寫的問題。94定義與分析問題但在商業應用程式的領域,使用者要解決的問題及2.設計解決方法釐清問題與需求後,就要開始著手設計解決問題的方法,或稱演算法(Algorithm),此步驟也可稱為設計程式(ProgramDesign,非指Programming),也就是要決定如何撰寫程式,使程式能解決問題。在這個階段通常會用『由上而下』(Top-Down)法將一個大問題分解成數個較小的問題,然後每個小問題再進一步分解成多個更小的部份。952.設計解決方法釐清問題與需求後,就要開始著手設計解決問設計解決方法例如要設計一個訂單處理程式,可將之分成訂單輸入及訂單處理兩部份,訂單輸入可分成資料輸入及資料儲存兩階段...,如此一直細分下去,將程式功能分成多個小的模組,在撰寫程式時就能順利分段或分工完成。96設計解決方法例如要設計一個訂單處理程式,可將之分成訂單輸入設計解決方法在這個階段,也常會用到流程圖(FlowChart)或虛擬碼(PseudoCode)來描述將要撰寫的程式功能。流程圖是以簡單的圖形符號來表示解決問題的步驟(流程);而虛擬碼則以是以類似於程式語言語法的文字敘述來表示程式的處理步驟。將程式的主要內容都先用流程圖及虛擬碼描述好,這樣在下個階段才能依需要順利寫出程式,不致在寫程式時還要邊寫邊想,降低效率。97設計解決方法在這個階段,也常會用到流程圖(FlowCh設計解決方法98設計解決方法983.撰寫程式高階語言程式都是以文字檔的形式儲存,而編寫好的程式,視語言的種類還需用到直譯器或編譯器加連結器,因此整個開發工作需用到不少工具。為了方便程式的撰寫及開發,目前許多程式開發都會使用較方便的整合開發環境(IDE,IntegratedDevelopmentEnvironment,參見7-23頁)。簡單的說,IDE提供了一個編寫程式專用的程式編輯器及圖形介面設計工具,而且可在此環境下啟動編譯器、連結器來進行編譯與連結的動作,此外大多的IDE也結合了實用的除錯、專案管理等多種輔助功能與工具,讓程式/專案開發的過程更輕鬆、方便。993.撰寫程式高階語言程式都是以文字檔的形式儲存,而編寫好撰寫程式100撰寫程式100撰寫程式撰寫程式的方法中,有一種主要應用於命令式語言的結構化程式設計(StructuredProgramming)方法。其原則就是不論是多複雜的程式,在程式中應該只使用三種結構:連續(Concatenation):表示程式中的敘述按順序依次執行。選擇(Selection):表示依程式的狀態,決定要執行哪一個敘述,例如前面表15-5中的例子,就有『當分數大於等於90分』、及『當分數小於90分』等選擇情況,不同的情況程式就會做不同的動作。101撰寫程式撰寫程式的方法中,有一種主要應用於命令式語言的結構撰寫程式重複(Repetition):程式會一直重複執行某一段敘述,直到達到某個狀態為止。再以表15-5中的判定學生等第為例,我們可將這段判斷的流程置於一重複結構中,此重複結構則會重複處理資料庫中所有學生,如此一來我們就能用一小段程式來重複判定所有學生的等第了。102撰寫程式重複(Repetition):程式會一直重複執行某撰寫程式103撰寫程式103撰寫程式高階語言都提供實作出選擇、重複結構的語法,雖然多數語言也提供非結構化的語法指令,但由於結構化程式設計確實有讓程式的邏輯較為清楚、易懂的優點,也因此廣為學界及業界採用。104撰寫程式高階語言都提供實作出選擇、重複結構的語法,雖然多數4.測試與除錯在撰寫程式每告一段落,例如已先設計好陽春的訂單輸入功能時,即可先編譯該部份的程式並做測試。以檢查程式是否除了語法錯誤(SyntaxError)外,還有邏輯錯誤(LogicError)。1054.測試與除錯在撰寫程式每告一段落,例如已先設計好陽春的測試與除錯語法錯誤只需用編譯器/直譯器即可檢查出來,而邏輯錯誤通常必須透過實際執行程式,測試各種不同情況的執行結果,才能檢查出來。因此在測試階段,有時也要請使用者來實際體驗。106測試與除錯語法錯誤只需用編譯器/直譯器即可檢查出來,而邏輯除錯與抓蟲在英文中,替程式除錯稱為"Debug"(抓蟲),而程式中的錯誤則稱為Bug(蟲)。這是因為早在1945年時,美國海軍所用的大型主機HarvardMarkII電腦發生問題,程式執行結果始終不正確,後來發現原來是有一隻飛蛾誤入機器之中,造成電路短路所致。由於是真的『蟲』所造成的程式問題,因此後來都將排除程式問題的動作與過程為"Debug"。107除錯與抓蟲在英文中,替程式除錯稱為"Debug"(抓蟲除錯與抓蟲108除錯與抓蟲1085.製作文件在前面設計、開發的過程中,都會產生許多文件資料,當程式開發完成後,就需將這些資料整理起來,以供日後追蹤、參考。因為日後負責修改、開發新版程式的人可能是別人,若要別人沒有任何參考資訊的情況下來修改程式,可說是相當令人頭痛的,後繼者將要浪費許多時間做前人做過的事情。更重要的是,這時也需要為軟體的使用者撰寫使用手冊、參考手冊等文件,幫助使用者能瞭解程式的功能與用途。1095.製作文件在前面設計、開發的過程中,都會產生許多文件資6.後續維護人的需求會改變,組織的運作方式也會隨著時間變化,因此寫好的程式可能不定時就需修改,簡單如改正先前未發現的某項錯誤;複雜如改變作業流程、增加新功能等等。如前述,在改寫程式時,可能都不是原先撰寫程式的人員負責,所以若要讓維護工作能有效進行,前一段的文件製作就需做得完整詳實。1106.後續維護人的需求會改變,組織的運作方式也會隨著時間變虛擬機器與程式開發的應用虛擬機器(VirtualMachine)一般是指一套用來模擬某個作業系統的軟體,舉例來說,若電腦已安裝了Windows作業系統,卻又想在電腦上執行某個Unix系統進行測試,但不希望破壞原先安裝好的Windows,就可使用虛擬機器軟體,將Unix系統安裝在其中來使用,此時使用者在操作這個Unix系統時,就像在操作一台『純』的Unix電腦一樣。111虛擬機器與程式開發的應用虛擬機器(VirtualMach虛擬機器與程式開發的應用不過此處要探討的虛擬機器則是指另一種應用,有人將之稱為『應用程式虛擬機器』(ApplicationVirtualMachine,相對的,前一種應用則可稱為作業系統虛擬機器)。應用程式虛擬機器的目的是提供一個供應用程式執行的平台,對應用程式來說,不管目前的軟硬體環境是Windows還是Unix、是PC還是PDA,只要有它所仰賴的虛擬機境存在,這個程式就能被執行。透過這種方式,我們寫好的程式就可拿到任何平台上使用,如此即能達到跨平台(CrossPlatform)的目的。112虛擬機器與程式開發的應用不過此處要探討的虛擬機器則是指另一種虛擬機器與程式開發的應用113虛擬機器與程式開發的應用113虛擬機器與程式開發的應用應用程式虛擬機器相當於一個將應用程式和作業系統及硬體分隔開的一層軟體執行環境,為了讓應用程式在不同的軟硬體環境下都能得到相同的結果,虛擬機器本身必須模擬、提供相當多的功能。而要在這個環境下執行的程式,必須先編譯成特別的中介程式碼,稱為ByteCode,將編譯成ByteCode的程式拿到任一台有對應虛擬機器的電腦上時,才由虛擬機器以直譯或即時(JIT,JustInTime)編譯的方式,將ByteCode轉換成機器碼來執行。114虛擬機器與程式開發的應用應用程式虛擬機器相當於一個將應用程式虛擬機器與程式開發的應用115虛擬機器與程式開發的應用115虛擬機器與程式開發的應用目前最普遍採用此種架構的程式語言即為Java,當我們用瀏覽器瀏覽含Java程式的網頁時,只要我們的電腦有安裝Java語言的執行環境(JavaRuntime),也就是Java虛擬機器(JVM,JavaVirtualMachine),即能順利在網頁中看到Java程式的執行結果,而且不管我們用的是PC、Mac、還是Sun工作站,都能看到相同的執行結果。116虛擬機器與程式開發的應用目前最普遍採用此種架構的程式語言即為虛擬機器與程式開發的應用因此早期Java有個宣傳口號:『WriteOnce,RunEverywhere』,也就是說Java程式一旦寫好編譯成ByteCode後,即可放到任何有安裝JavaRuntime(JVM)的環境下執行,不必像以往寫好一個C程式,在Windows上編譯好可以執行;拿到Linux上不但要重新編譯,可能還需修改程式,才能得到類似的執行結果。117虛擬機器與程式開發的應用因此早期Java有個宣傳口號:『虛擬機器與程式開發的應用目前另一個較為人知的應用程式虛擬機器架構是微軟公司所推出的.NETFramework,其虛擬機器稱為共用語言執行環境(CLR,CommonLanguageRuntime),表示這是個可供多種程式語言共用的虛擬機器,目前支援的語言包括C#(算是C++結合Java特性的程式語言)、VisualBasic、C++(需符合特定的語法,稱為ManagedCode)、J#(可視為微軟版的Java語言)等。118虛擬機器與程式開發的應用目前另一個較為人知的應用程式虛擬機器虛擬機器與程式開發的應用119虛擬機器與程式開發的應用119虛擬機器與程式開發的應用除了兩大軟體公司在推動應用程式虛擬機器外,在OpenSource的社群中也有相關的應用,例如目前較受注目的是由Perl社群所推動、開發的Parrot虛擬機器,其目標是發展成能供Perl、Python、Tcl、Ruby、Scheme等眾多語言使用的虛擬機器,不過Parrot目前仍在發展中,目前只能供Parrot的組合語言使用。120虛擬機器與程式開發的應用除了兩大軟體公司在推動應用程式虛擬機演讲完毕,谢谢观看!演讲完毕,谢谢观看!第15章程式語言第15章程式語言本堂課重點15-1何謂程式語言15-2程式語言的發展15-3程式語言的類型15-4著名的程式語言簡介15-5程式的設計與開發過程123本堂課重點15-1何謂程式語言215-1何謂程式語言身為電腦使用者,我們常會說:『用xx程式來做yy事情。』這麼多能做不同事情、發揮不同功效的應用程式是如何產生的呢?簡單的說,是程式設計人員(Programmer)用程式語言(ProgrammingLanguage)所寫出來的。12415-1何謂程式語言身為電腦使用者,我們常會說:『用xx何謂程式語言電腦是用來幫助人們解決問題的,而電腦硬體要能幫我們解決問題,就必須有程式(軟體)告訴電腦要做什麼事。所以程式語言可說是人控制電腦如何做事的一種語言,而為了符合不同的需求、解決不同類型的問題,也使資訊界出現各種不同的程式語言,例如一般人可能都曾聽過的組合語言、BASIC、C、C++、Java、...等等。以下我們進一步來瞭解為什麼會有這麼多種不同的程式語言,以及其間的差異。125何謂程式語言電腦是用來幫助人們解決問題的,而電腦硬體要能幫15-2程式語言的發展如果不考慮一百多年前的分析機(AnalyticalEngine,參見第1章),第一個程式語言的出現至今才不過半個世紀多,但在短短的50年,就已發展出數量多到令人眼花撩亂的程式語言種類。程式語言最簡略的分類方式,就是將它們依『抽象化』的程度分成高階語言(High-LevelLanguage)、低階語言(Low-LevelLanguage)兩類:12615-2程式語言的發展如果不考慮一百多年前的分析機(An程式語言的發展以下我們就簡單介紹這幾類不同的語言及其發展過程。127程式語言的發展以下我們就簡單介紹這幾類不同的語言及其發展過程程式語言的發展15-2-1第一代:機器語言關於程式『碼』15-2-2第二代:組合語言15-2-3第三代:高階語言15-2-4第四代及第五代語言128程式語言的發展15-2-1第一代:機器語言7第一位程式設計師:AdaLovelace第一章曾提過早在19世紀時,CharlesBabbage曾設計及製作號稱是第一部計算機的差分機,當時雖未完成,但CharlesBabbage又著手設計另一更複雜的分析機。當時有一位義大利機械學者LuigiFedericoMenebrea以法文發表了一篇描述分析機功能及理論的論文,而CharlesBabbage則請與他合作的AdaLovelace女士(AugustaAdaKing,Lovelace女伯爵,一般簡稱AdaLovelace,著名英國詩人拜倫的女兒)將此文章翻譯成英文。129第一位程式設計師:AdaLovelace第一章曾提過早在第一位程式設計師:AdaLovelaceAda除了翻譯外,還加上篇幅勝過原文的註記(Note),在這些註記中,Ada提出了許多有關程式設計的基本理念,甚至還寫下了如何用分析機計算『白努力數』(BernoulliNumbers)的流程。她的成就使得後人稱她為第一位電腦程式設計師,而美國國防部也在1980年,將他們開發設計的程式語言正式命名為Ada語言以茲紀念。130第一位程式設計師:AdaLovelaceAda除了翻譯外第一位程式設計師:AdaLovelace131第一位程式設計師:AdaLovelace1015-2-1第一代:機器語言對於電腦來說,它真正所懂得的語言只有一種,就是機器語言。所謂的機器語言,其實是以特定的數字來表示電腦所能進行的各個動作,我們稱這些數字為機器碼(MachineCode)或機器語言。舉例來說,如果把電腦比喻為一個只認得數字命令的機器人,而0代表向前走一步、1代表向後退一步、2代表往左轉90度、而3代表往右轉90度。13215-2-1第一代:機器語言對於電腦來說,它真正所懂得的語第一代:機器語言那麼當我們要命令這個機器人往前走三步、再往右走三步時,就必須下達『0003000』的指令,當電腦看到這一串數字後,就會依照每個數字所代表的意義做出指定的動作:133第一代:機器語言那麼當我們要命令這個機器人往前走三步、再往右第一代:機器語言相信大家都會發現,用數字來控制機器人會相當辛苦,因為我們得先熟記每個數字所代表的動作,然後還要能將一連串數字組合起來,以表達我們要機器人做的工作。不過上述的機器人例子,其實已經簡化機器語言的複雜性。CPU只能接受一組預先定義好的指令,而且這些指令其實都只是做一些非常基本的計算或控制動作,所以要讓電腦做一項簡單的動作,可能需要數個指令才能完成。134第一代:機器語言相信大家都會發現,用數字來控制機器人會相當第一代:機器語言以目前通用於個人電腦的x86系列CPU為例,要讓它計算"3-1"這個減法計算,必須先將數字3存到暫存器(參見2-2-1節)後再進行運算。135第一代:機器語言以目前通用於個人電腦的x86系列CPU第一代:機器語言任何一個人都可以看得出來,這種以數字表達的語言並不適合人閱讀。因此大家很快就發現要用這種方式撰寫程式,實在太難、太辛苦了。所以人們就開始思考如何能以更友善的方式來撰寫程式。136第一代:機器語言任何一個人都可以看得出來,這種以數字表達的關於程式『碼』在程式設計的領域,常可聽到程式碼或原始碼(SourceCode)這樣的名詞。『碼』就是由英文字Code翻譯而來,其原意是指機器語言的數字碼。雖然我們使用各種高階語言(後詳)所撰寫的程式早已脫離用數字寫程式的形式,不過Code這個字仍沿用至今,因此對任何程式語言所寫成的原始程式,都可稱之為程式碼或原始碼。137關於程式『碼』在程式設計的領域,常可聽到程式碼或原始碼(15-2-2第二代:組合語言由於使用以0、1組合成的機器語言來撰寫程式實在太不方便,因此人們就想到將這些機器碼都代換成較方便學習、記憶的助憶碼(Mnemonic),也就是組合語言(AssemblyLanguage)。以前面的機器語言程式為例,將資料從某處移到某處的動作就用英文單字Move的前三字MOV來代表;而將數值減1,就用Decrease的前3字DEC來代表,所以前述的程式用組合語言來寫就變成如表15-2所示。13815-2-2第二代:組合語言由於使用以0、1組合成的機第二代:組合語言139第二代:組合語言18第二代:組合語言組合語言程式必須轉換成微處理器真的看得懂的機器語言碼,才能讓電腦執行。將組合語言程式轉換成機器語言程式的動作稱為組譯,用來將組合語言碼轉換(翻譯)成機器碼的工具稱為組譯器(Assembler)。140第二代:組合語言組合語言程式必須轉換成微處理器真的看得懂的機第二代:組合語言雖然用助憶碼來代替原本的數字程式碼已改善原本用機器碼寫程式的諸多不便及容易出錯等缺失,但用組合語言寫程式仍有一大缺點:程式設計者必須對微處理器架構、電腦硬體架構要有充份的認識。例如表15-2中的程式就用到了AX暫存器(AL代表16位元AX暫存器中的低位元組),換言之,要用組合語言寫程式,至少必須認識微處理器中有哪些暫存器可使用、各暫存器的功用為何;如果程式需存取到週邊裝置,則需認識如何透過BIOS或特定的輸出輸入埠(I/OPort),將資料送到輸出裝置或由輸入裝置取得資料。141第二代:組合語言雖然用助憶碼來代替原本的數字程式碼已改善原本第二代:組合語言142第二代:組合語言21第二代:組合語言然而要充份認識微處理器架構、電腦硬體架構後才能開始寫程式,就好像要求我們要先瞭解引擎結構、傳動系統之後才能學開車;要先認識無線電原理及語音轉換成無線電的編碼方式才能用手機打電話:這將對汽車、行動電話的推廣有莫大的阻礙。同理,組合語言提高了撰寫程式的門檻,也因此限制了電腦的普及。此外,以組合語言撰寫程式還有下列缺點:143第二代:組合語言然而要充份認識微處理器架構、電腦硬體架構後才第二代:組合語言因為使用的助憶碼仍是代表微處理器的指令,也就是要以微處理器的角度來思考問題,開發程式仍相當不便。不同硬體架構的微處理器其機器碼都各不同,例如一般個人電腦所用的IntelPentiumCPU,和昇陽(Sun)公司的SPARCCPU其機器語言就不相同,組合語言也有差異,要讓程式可在不同的電腦上執行,必須重新改寫程式。144第二代:組合語言因為使用的助憶碼仍是代表微處理器的指令,也15-2-3第三代:高階語言不論是機器語言還是組合語言,對於程式的描述都是以電腦所能進行的最基本動作為步驟,因此這兩種語言被稱為低階語言。為了讓人們能以更接近人的思考方式來寫程式,就有了所謂的高階語言。第一個被廣泛使用的高階語言為1950年代所開發出來的Fortran(FormulaTranslator)語言,此後更多的語言如COBOL、BASIC、Pascal、C...等等就如雨後春筍般地出現。14515-2-3第三代:高階語言不論是機器語言還是組合語言,第三代:高階語言高階語言中有些是專為某些用途而設計的,但也有些是特別設計成通用性(GeneralPurpose)的語言,但由於各語言都有不同優缺點,也因此各有其適用的場合,再加上每個人對語言有不同的喜好程度,所以至今仍有相當多的語言存在,我們也因此有許多程式語言可選擇。146第三代:高階語言高階語言中有些是專為某些用途而設計的,但也第三代:高階語言高階語言與低階語言之間最明顯的差異,在於高階語言多是以近似英語的語法來撰寫,因此學習的難度降低,寫來也較不容易出錯。例如以下的BASIC語言程式片段,就算沒學過BASIC語言的人,也能大概猜出其意思。147第三代:高階語言高階語言與低階語言之間最明顯的差異,在於高第三代:高階語言148第三代:高階語言27第三代:高階語言圖15-6中的BASIC程式做的事很簡單:請使用者輸入姓名和年齡,再將使用者是幾歲用英文輸出到螢幕上。程式中的INPUT、PRINT就是所謂的關鍵字(Keyword)或保留字(ReservedWord),INPUT就是『取得輸入』的意思、PRINT就是『印出』一段訊息。每種程式語言因功能各有不同,所以都有不同的關鍵字或保留字,而且通常都會取與該英文單字同樣的意思,例如很多語言都有IF這個關鍵字,表示『如果...』,透過它就能設計出『如果買的商品超過5件都打8折...』這類的程式。149第三代:高階語言圖15-6中的BASIC程式做的事很第三代:高階語言在上述程式片段中所出現的age%、Name$稱為變數(Variable),在高階程式語言中,藉由變數這種比較抽象的資料表示方式,讓程式設計者不必像在寫低階語言程式時還要自行操作暫存器或記憶體位址,所以就算對硬體架構不熟悉,也能寫出實用的程式。150第三代:高階語言在上述程式片段中所出現的age%、Nam第三代:高階語言雖然寫程式的門檻降低,但也連帶使程式的執行效能下降:一般而言,同樣的程式,用高階語言撰寫者,其執行效能會比以組合語言撰寫者差。不過透過編譯器(後詳)的改良、硬體速度的飛快成長,使其間差異愈來愈小,甚至可忽略,因此目前通常只在特別要求執行效能的程式,才會使用組合語言。高階語言寫成的程式,和組合語言一樣需要經過轉譯的動作,才能變成電腦認得的機器語言並執行之。高階語言轉譯的動作分成兩種:編譯(Compile)及直譯(Interpret)。151第三代:高階語言雖然寫程式的門檻降低,但也連帶使程式的執行第三代:高階語言編譯函式庫直譯程式語言種類與執行方式的關係152第三代:高階語言編譯31編譯所謂編譯的方式,是先將整個程式從頭到尾讀完,然後將其內容轉換成電腦所認識的機器碼。這就好像是翻譯一篇文章,是先將整篇文章從頭讀到到尾後,將它全部翻譯好,然後才拿給讀者閱讀。將文章一次翻譯好,往後不論何時或何人需要閱讀,都不需要再重新翻譯,就可以直接閱讀翻譯好的版本。不過相對來說,在第一次想要閱讀之前,就必須先花時間等待譯者翻譯完畢才行。編譯程式也是如此,編譯時會花一點時間,一旦編譯完成,往後隨時都可執行程式。153編譯所謂編譯的方式,是先將整個程式從頭到尾讀完,然後將其編譯編譯時所用的工具稱為編譯器(Compiler),編譯器會將用高階語言寫的程式轉成機器碼。154編譯編譯時所用的工具稱為編譯器(Compiler),編譯器編譯高階語言程式經過編譯後即產生機器碼,通常並非可立即執行的可執行檔(Excutable),編譯後的產物稱為目的碼(ObjectCode)或目的檔(ObjectFile)。這是因為高階語言程式中通常會用到別人或自己事先寫好的其它程式(例如函式庫),所以編譯好程式後,必須再用連結器(Linker)將我們程式的目的碼與其它程式的目的碼連結後,才會產生實際可執行的程式。155編譯高階語言程式經過編譯後即產生機器碼,通常並非可立即執行編譯156編譯35編譯由於每種電腦的機器語言並不相同,比如說一般所用的x86個人電腦(PC)和昇陽工作站(SunWorkstation)的機器語言就不相同。因此,同一個程式如果要在不同的機器上執行,就必須使用專為該種電腦所設計的編譯器,轉譯出符合該電腦的機器碼才行。157編譯由於每種電腦的機器語言並不相同,比如說一般所用的x8函式庫雖然每個人寫程式的目的不同、用途也五花八門,但不可免的是所有程式都會有彼此重疊的功能。例如瀏覽器、電子郵件軟體、線上聊天程式,雖然其功能各有不同,很顯然這些程式都要有一段透過TCP/IP通訊協定將資料送到網路、或接收資料的功能。如果每個開發瀏覽器、電子郵件軟體、線上聊天程式的程式設計人員,都要自己撰寫這段功能相同的程式,則軟體產業就太沒有效率,我們今天也不會有這麼多五花八門的應用程式可以使用。158函式庫雖然每個人寫程式的目的不同、用途也五花八門,但不可免函式庫因此為了避免『重複發明輪子』(ReinventtheWheel)的窘境,許多程式語言都將一些常用的程式功能事先設計好,讓寫程式的人可直接『呼叫(Call)』它們,如此就不必每個人都要自己寫一段功能相同的程式了。這些事先寫好的程式,依程式語言的不同,有些稱其為子程序(Subroutine)、或函式(Function)、或程序(Procedure)等等。159函式庫因此為了避免『重複發明輪子』(Reinventth函式庫這些寫好的程式都會事先編譯好

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论