版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
高級(jí)程序設(shè)計(jì)語言原理
第一章程序設(shè)計(jì)語言研究什么是語言:語言是信息交流工具。有如下幾種定義:1、Webster字典定義Anartificiallyconstructedprimarilyformalsystemofsignsandsymbols(assymboliclogic)includingrulesfortheformationofadmissibleexpressionsandfortheirtransformation基于一組記號(hào)與符號(hào)由人工構(gòu)造的(基本上是)形式化的系統(tǒng)(如符號(hào)邏輯),包括合法表達(dá)式的形成規(guī)則和轉(zhuǎn)換規(guī)則。2、Longman字典定義Anysystemofsigns,movements,etc.,usedtoexpressmeaningsorfeelings任何表情達(dá)意的記號(hào)系統(tǒng)。3、英漢雙解計(jì)算機(jī)辭典定義(清華大學(xué)出版社)Asetofcharacters,conventionsandrules,thatisusedforconveyinginformation.Thethreeaspectsoflanguagearepragmatics,semanticsandsyntax一種用于傳遞信息之字符、約定和規(guī)則的集合。語言的三個(gè)方面是語用、語義和語法。4、中國(guó)大百科全書,電子學(xué)與計(jì)算機(jī)卷語言的基礎(chǔ)是一組記號(hào)和一組規(guī)則,根據(jù)規(guī)則由記號(hào)構(gòu)成之記號(hào)串的總體就是語言。5、徐家福:軟件語言及其實(shí)現(xiàn)語言是基于一組記號(hào)與一組規(guī)則、根據(jù)規(guī)則由記號(hào)構(gòu)成之記號(hào)串的總體。任何語言均包括語法、語義和語用三個(gè)方面。語言的作用描述作用、交流作用和標(biāo)志作用(軟件語言可作為計(jì)算技術(shù)發(fā)展的里程碑標(biāo)志)語言是人類生活的必要工具,不同的語言被使用于不同的領(lǐng)域和方面在計(jì)算領(lǐng)域,也存在不同層次的語言,本書所論及的是實(shí)現(xiàn)層次的語言,即程序設(shè)計(jì)語言。程序設(shè)計(jì)語言=字符集+規(guī)則集(用于組合字符)任何用于描述算法和數(shù)據(jù)結(jié)構(gòu)的一套符號(hào)系統(tǒng)均可稱為程序設(shè)計(jì)語言本課程研究的對(duì)象:主要考慮那些在計(jì)算機(jī)上實(shí)現(xiàn)的程序設(shè)計(jì)語言術(shù)語所界定的范圍:術(shù)語“程序設(shè)計(jì)語言”并沒有一個(gè)公認(rèn)的范圍定義通常這個(gè)術(shù)語是指高級(jí)語言計(jì)算機(jī)上語言的層次:純二進(jìn)制機(jī)器碼或符號(hào)機(jī)器碼符號(hào)匯編語言宏匯編語言高級(jí)語言甚高級(jí)語言Byte或word,指令、數(shù)據(jù)不分用一些符號(hào)來代表指令,如sub代表減,Add代表加等,機(jī)器地址用十進(jìn)制。有時(shí)匯編語言等同于符號(hào)機(jī)器碼。變量名用符號(hào),地址也可用符號(hào)而非數(shù)字。編制的程序稱為匯編程序。用戶可以定義新指令及子程序源程序編譯為目標(biāo)程序,或解釋執(zhí)行高級(jí)程序語言的高層規(guī)約語言,提供比高級(jí)程序語言更高級(jí)的語言設(shè)施。又稱為“可執(zhí)行的規(guī)約語言”。有時(shí)也不區(qū)別于高級(jí)語言。程序設(shè)計(jì)語言的四個(gè)基本特征:1、用戶不需要具有機(jī)器代碼的知識(shí),只需學(xué)習(xí)特定的程序設(shè)計(jì)語言,并獨(dú)立于任何特定的機(jī)器代碼而使用。這并不意味著用戶可以完全忽略實(shí)際的計(jì)算機(jī),如:需知道浮點(diǎn)數(shù)的表示或使用某些機(jī)器資源。2、程序設(shè)計(jì)語言必須有較大程度的機(jī)器獨(dú)立性(完全的機(jī)器獨(dú)立性)。這意味著必須有較大潛力,使得源程序可運(yùn)行在具有不同機(jī)器代碼的兩臺(tái)計(jì)算機(jī)上,不需要完全重寫。
3、當(dāng)源程序翻譯成機(jī)器代碼時(shí),通常對(duì)每個(gè)執(zhí)行單元有多個(gè)機(jī)器指令,如:A=A+B需多個(gè)機(jī)器指令來實(shí)現(xiàn)4、程序設(shè)計(jì)語言的記號(hào)比機(jī)器語言更接近于被求解的問題。如:A=A+B比其機(jī)器翻譯更易于理解。1.1為什么研究程序設(shè)計(jì)語言兩個(gè)基本觀察:1、已有數(shù)百種語言被設(shè)計(jì)和實(shí)現(xiàn)。在1969年,Sammet就列出了當(dāng)時(shí)120種相當(dāng)廣泛使用的語言,在此以后,又有很多語言被開發(fā)。在早期,為一個(gè)項(xiàng)目的進(jìn)行而開發(fā)一種語言是常有的事。2、大多數(shù)程序員通常不會(huì)同時(shí)使用多種語言,一般限制到1~2種。事實(shí)上,都是直接使用計(jì)算機(jī)上已有的語言如C、Ada、Fortran等。既然如此,為什么要去研究各種不同的語言,有的語言甚至永遠(yuǎn)不可能再被使用?學(xué)習(xí)、研究程序設(shè)計(jì)語言的理由不僅僅是停留于膚淺的對(duì)語言特性的了解和考慮深入了解根本性的語言設(shè)計(jì)概念及它們對(duì)語言實(shí)現(xiàn)的影響1、提高開發(fā)有效算法的能力很多語言提供的特性如果被合適地使用,會(huì)給程序員帶來益處,但如被不合適地使用,將可能導(dǎo)致大量計(jì)算機(jī)時(shí)間浪費(fèi)或使程序員出現(xiàn)耗時(shí)的邏輯錯(cuò)誤。有可能一個(gè)長(zhǎng)期使用某一語言的程序員也并不理解該語言的所有特性。如遞歸特性:是一個(gè)非常便利的程序設(shè)計(jì)語言特性如正確、合適使用,可得到優(yōu)美和高效算法的直接實(shí)現(xiàn)。如不正確使用,將可能導(dǎo)致執(zhí)行時(shí)間的天文數(shù)字增長(zhǎng)。如果程序員不知道遞歸蘊(yùn)含的設(shè)計(jì)問題和實(shí)現(xiàn)困難,將難于使用這種結(jié)構(gòu);對(duì)遞歸原理和實(shí)現(xiàn)技術(shù)的了解可使程序員了解在特定語言中的遞歸的相對(duì)代價(jià)并通過其理解確定其使用是否合適。新的程序設(shè)計(jì)方法不斷在文獻(xiàn)中引入,如OO程序設(shè)計(jì),邏輯程序設(shè)計(jì)和并發(fā)程序設(shè)計(jì)的使用均需要對(duì)實(shí)現(xiàn)這些概念的語言的詳細(xì)了解和掌握。2、改善對(duì)現(xiàn)行程序設(shè)計(jì)語言的使用通過對(duì)語言特性的實(shí)現(xiàn)細(xì)節(jié)的了解,可大大增加書寫高效的程序的能力。如:對(duì)數(shù)據(jù)結(jié)構(gòu),諸如數(shù)組、串、表、記錄等,如何被創(chuàng)建和操作的了解對(duì)遞歸的實(shí)現(xiàn)細(xì)節(jié)的了解以及對(duì)對(duì)象類如何被創(chuàng)建的了解將對(duì)書寫高效程序有很大幫助3、增加可使用的有用的程序設(shè)計(jì)結(jié)構(gòu)的詞匯量語言對(duì)思維既有幫助,也有限制人們使用語言去表達(dá)思想,但語言也控制人如何思維,用字句中沒有直接表達(dá)的方式來思維是十分困難的。在解決一個(gè)問題時(shí),要尋找合適的數(shù)據(jù)和程序結(jié)構(gòu),通常人們首先考慮他熟悉的語言中可直接表達(dá)的結(jié)構(gòu)。研究各種語言提供的結(jié)構(gòu)和這些結(jié)構(gòu)被實(shí)現(xiàn)的方式,程序員可增加其編程詞匯。對(duì)實(shí)現(xiàn)技術(shù)的了解非常重要。如要使用一個(gè)結(jié)構(gòu),該結(jié)構(gòu)在語言中沒有直接提供,程序員必須提供自己的實(shí)現(xiàn)(使用語言提供的基本結(jié)構(gòu))。如子程序控制結(jié)構(gòu)、協(xié)同例程(coroutine)在很多程序中有用,但很少有語言直接提供協(xié)同例程特性。C或Fortran程序員可以設(shè)計(jì)程序來使用協(xié)同例程結(jié)構(gòu),然后將它們實(shí)現(xiàn)為C或Fortran程序(如果熟悉相關(guān)概念及實(shí)現(xiàn))從而可以提供大型程序的正確控制結(jié)構(gòu)。4、允許更好地選擇語言對(duì)程序設(shè)計(jì)語言知識(shí)的掌握可以允許程序員針對(duì)特定的項(xiàng)目,恰當(dāng)?shù)剡x取合適的語言,從而減少編碼工作量。如:C、Fortran、Ada可用于數(shù)值運(yùn)算,Lisp、ML、Prolog可用于人工智能應(yīng)用。對(duì)每種語言的特性的長(zhǎng)處和弱點(diǎn)的了解和掌握有利于程序員做出廣泛而正確的選擇。5、更易于學(xué)習(xí)新語言對(duì)自然語言語法結(jié)構(gòu)的學(xué)習(xí)和了解可使對(duì)新語言的學(xué)習(xí)更容易對(duì)程序設(shè)計(jì)語言各種結(jié)構(gòu)和實(shí)現(xiàn)技術(shù)的了解,也可使程序員能夠在需要時(shí)更容易地學(xué)習(xí)新語言6、更易于設(shè)計(jì)新語言很少有程序員把自己考慮為語言設(shè)計(jì)者,然而,任何程序都有一個(gè)用戶界面,這事實(shí)上也是某種形式的程序設(shè)計(jì)語言,用戶界面包括提供給用戶用于和程序通訊的命令和數(shù)據(jù)格式。大型程序,如文本編輯器、操作系統(tǒng)、圖形包的用戶界面的設(shè)計(jì)者,必須考慮很多存在于通用程序設(shè)計(jì)語言設(shè)計(jì)中的相同問題。如果程序員熟悉一般程序設(shè)計(jì)語言中的結(jié)構(gòu)和實(shí)現(xiàn)方法,則程序設(shè)計(jì)將可以大為簡(jiǎn)化。總之,程序設(shè)計(jì)語言的研究十分重要,包括語言特性和實(shí)現(xiàn)技術(shù)(特別是不同結(jié)構(gòu)的運(yùn)行時(shí)表示技術(shù))等主要研究?jī)?nèi)容。程序設(shè)計(jì)語言的優(yōu)點(diǎn)比機(jī)器或匯編語言更易于學(xué)習(xí)。這涉及很多方面的問題,如一個(gè)極端強(qiáng)大的程序設(shè)計(jì)語言可能比一個(gè)只有十幾條指令的機(jī)器的匯編語言更難學(xué)。但給定基本相同的復(fù)雜度,程序設(shè)計(jì)語言更易學(xué)(記號(hào)更接近問題域;更少關(guān)心物理硬件)程序設(shè)計(jì)語言書寫的程序更易于調(diào)試debug(程序更為短??;記號(hào)本身更自然,因此更多注意力可放在程序邏輯而非語法細(xì)節(jié)上)。程序更易于理解程序設(shè)計(jì)語言的記號(hào)自然起到了文檔的作用上述原因?qū)е陆鉀Q問題的時(shí)間和代價(jià)減少。程序設(shè)計(jì)語言的缺點(diǎn)編譯過程需要機(jī)器時(shí)間,它可能超過易于調(diào)試所節(jié)省的時(shí)間編譯器可能產(chǎn)生低效的代碼如果用戶不知道機(jī)器代碼或編譯器未提供合適的調(diào)試工具,則程序調(diào)試可能非常困難。程序設(shè)計(jì)語言的分類這是一個(gè)非常困難的問題,并沒有公認(rèn)的定義。這里給出一些術(shù)語,有些是相互交迭的,一個(gè)語言可能歸屬于兩個(gè)類別。面向過程的語言(procedure-oriented)用戶刻劃一個(gè)可執(zhí)行操作集合,它將以某種順序完成,從而刻劃了一個(gè)過程。關(guān)鍵因素是這些明確可執(zhí)行的操作,執(zhí)行順序由用戶確定。非過程型語言(nonprocedural)這只是一個(gè)相對(duì)的術(shù)語,沒有人定義過,也不可能定義。意指用戶指定的順序步驟的減少程度,越接近于用戶只陳述問題而不指定求解步驟,語言就越是非過程的。更進(jìn)一步,可以有一個(gè)有序的步驟序列,其中每一步是某種程度上非過程性的,或是一個(gè)可執(zhí)行操作的集合,其順序用戶并沒有指定。兩種情形均導(dǎo)致更多的非過程性。在Fortran出現(xiàn)前,語句Y=A+B*C-D/E被認(rèn)為是非過程性的。因?yàn)樗荒軐懗梢粋€(gè)可執(zhí)行單元和被任何系統(tǒng)翻譯。隨著編譯系統(tǒng)的發(fā)展,過去非過程的今天變成過程的,而今天非過程的,明天可能是過程的。當(dāng)今非過程系統(tǒng)的例子如:RPG(報(bào)告生成器)或排序生成器,只需給定輸入和希望的輸出即可,過程將被自動(dòng)完成。說明型語言(DeclarativeLanguage)——完全非過程的程序只定義做什么,不需指定如何做,如函數(shù)式(歸約)、邏輯式(歸結(jié)、合一)語言及其它甚高級(jí)語言。面向問題的語言(problem-oriented)該術(shù)語有不同解釋和用法,最常見用法是強(qiáng)調(diào)一個(gè)語言易于對(duì)特定問題求解(相對(duì)匯編語言),很多人將其用于針對(duì)非常特殊的應(yīng)用領(lǐng)域。面向應(yīng)用的語言(Application-oriented)這是極易誤解的、但廣為使用的術(shù)語。實(shí)際上,所有語言均是面向應(yīng)用的,只是領(lǐng)域大小不同罷了。如:Fortran適合數(shù)值科學(xué)計(jì)算,Cobol適合商業(yè)數(shù)據(jù)處理PL/1則二者均適合,領(lǐng)域更廣,又稱通用(generalpurpose)語言,實(shí)際上很少有真正通用的語言一般考慮:數(shù)值科學(xué)應(yīng)用,非數(shù)值應(yīng)用(如形式代數(shù)),商業(yè)數(shù)值處理,串、表處理等更特殊的領(lǐng)域:網(wǎng)形、仿真、數(shù)控、設(shè)備檢查等專用語言(specialpurpose)用于滿足單一的目標(biāo)(指定領(lǐng)域;對(duì)特殊應(yīng)用易用;提高效率等)問題定義或規(guī)約語言(problem-defining,specification)文字地定義問題,或特別定義輸入、輸出,但不定義變換方法問題求解語言(problem-solving)可以完整地刻劃一個(gè)問題的求解,這也是一個(gè)相對(duì)的術(shù)語標(biāo)注語言(reference)是一個(gè)確定的字符集,具有語言的格式。通常用唯一字符表示某概念或語言中的字符,不一定要適合計(jì)算機(jī)輸入。通常包含英文單詞(作為多單個(gè)字符),也可能提供固定符號(hào)集。不需要易讀。出版語言(publication)標(biāo)注語言的變種,如A↑2變成A2。硬件語言(hardware)又稱hardwarerepresentation,是標(biāo)注語言直接映射到合適的格式以利于計(jì)算機(jī)直接輸入。硬件語言本身和標(biāo)注語言必須有很好映射,如**作為↑的硬件表示,begin用‘BEGIN’表示等1.2程序設(shè)計(jì)語言簡(jiǎn)史程序設(shè)計(jì)的歷史很復(fù)雜,至今已很難于擬出一條全面清晰的發(fā)展軌跡。已有各種不同的總結(jié)方式。1978年,ACMSpecialInterestGrouponProgrammingLanguage(SIGPLAN)召開了一個(gè)會(huì)議,HOPL(HistoryofProgrammingLanguage),專門研討語言發(fā)展歷史。程序語言的早期發(fā)展語言發(fā)展可追溯到1945年,德國(guó)的KonradZuse設(shè)計(jì)了“Plankalkul”,未實(shí)現(xiàn)。1954年,Laning和Zierler開發(fā)了一個(gè)用于數(shù)學(xué)計(jì)算的高級(jí)語言,運(yùn)行于M.I.T的Whirlwind上,這大概是第一個(gè)運(yùn)行的編譯器。它可以書寫數(shù)學(xué)表達(dá)式(具有上、下標(biāo))、賦值、分叉、輸入/輸出、子程序,并處理微分方程。第一個(gè)廣泛使用的高級(jí)語言是Fortran。IBM的JohnBackus領(lǐng)頭在50年代中期完成,初衷是解決科學(xué)及工程計(jì)算,但后也用于更多領(lǐng)域,甚至寫編譯器。該語言證明了高級(jí)語言的可行性,奠定了后來語言研究的基礎(chǔ)。1958年,ACM和歐洲的GAMM聯(lián)合開發(fā)用于算法處理的語言IAL(InternationalAlgebraicLanguage),最終修改變成了Algol60(早點(diǎn)的版本是Algol58),Algol58和Algol60導(dǎo)致了很多相關(guān)的程序設(shè)計(jì)語言研究和編譯技術(shù)開發(fā)的發(fā)展。在實(shí)踐方面Fortran有很大影響,但Algol帶動(dòng)了語言的理論研究熱潮。50年代中期,RemingtonRandUnivac的GraceHopper及其同事設(shè)計(jì)了Flow-Matic,該語言面向商業(yè)數(shù)據(jù)處理,這是第一個(gè)面向英語的語言,并成為Cobol的主要源泉。1959年,在DoD贊助下,組織了一批計(jì)算機(jī)制造商和用戶開發(fā)了Cobol(CommonBusinessOrientedLanguage),該語言在商業(yè)數(shù)據(jù)處理領(lǐng)域的影響甚至大于Fortran在科學(xué)計(jì)算領(lǐng)域的影響。1958、1959可能是語言歷史上生產(chǎn)率最大的兩年。M.I.T的VictorYngve開發(fā)了Comit,這是串處理語言,用于翻譯自然語言。M.I.T的JohnMcCarthy和其學(xué)生開發(fā)了人工智能語言Lisp。Lisp至今仍在使用,Comit后來變成了Snobol(Bell電話實(shí)驗(yàn)室于60年代中期開發(fā))科學(xué)計(jì)算和數(shù)據(jù)處理是計(jì)算機(jī)早期的主要應(yīng)用,語言也是如此,向跨兩個(gè)領(lǐng)域的通用性發(fā)展。1959-1960,SystemDevelopmentCorporation和JulesSchwartz在Algol58基礎(chǔ)上開發(fā)了Jovial,這是第一次通用性嘗試。1963-1964,IBM和SHARE的一個(gè)聯(lián)系計(jì)劃開發(fā)了第一個(gè)通用語言(跨兩個(gè)領(lǐng)域)PL/I。Algol68是隨后的一個(gè)大的語言計(jì)劃,這是一個(gè)全新的開發(fā),而不僅僅是升版,其主要特性是正交性,它定義了少量的基本特征和組合它們的系統(tǒng)規(guī)則,允許程序員定義新的數(shù)據(jù)類型及操作。下一個(gè)大的語言計(jì)劃是,1975年開始的DOD項(xiàng)目,目標(biāo)是開發(fā)適合于嵌入式計(jì)算機(jī)系統(tǒng)的語言,此即Ada。1979年開始發(fā)布,1980年定稿,成為后期開發(fā)、實(shí)現(xiàn)和標(biāo)準(zhǔn)化的基礎(chǔ),Ada不僅僅是適合嵌入系統(tǒng),可有更廣用途。隨著交互計(jì)算系統(tǒng)的出版,適合交互環(huán)境的語言開始出現(xiàn)。1963年,RandCorporation的J.CliffShaw開發(fā)了Joss.。1964年,DartmouthCollege的JohnKemeny和ThomasKurtz開發(fā)了廣為流傳的Basic。針對(duì)非數(shù)值數(shù)學(xué)計(jì)算(如形式代數(shù)操作)的需要。IBM的JeanSammet于1962-1964開發(fā)了Formac。MIT的JoelMoses于1970年代早期開發(fā)了Macsyma。專用領(lǐng)域語言開發(fā)。1956年,MIT的DouglasRoss為機(jī)床控制開發(fā)了APT。其他有:civilengineeriy:Cogo computer-assistedinstruction:Coursewriter equipmentcheckout:Atlas。1967~1977,在美國(guó),在給定年度內(nèi)使用的語言數(shù)大概是170種,同時(shí),每年或每?jī)赡暧?5—30的增減。1978年HOPL會(huì)議,討論的語言滿足如下標(biāo)準(zhǔn):a.1967年時(shí)已出版并被使用。b.1977年仍在使用。c.在計(jì)算領(lǐng)域有很大影響。選出的語言有:Algol,Apl,APT,Basic,Cobol,Fortran,GPSS,Joss,Jovial,Lisp,PL/I,Simula,Snobol。80年代的兩個(gè)重要語言PASCAL(NiklausWirth,1968)和Ada未列入。PASCAL在70年代后期成為非常重要的語言,特別是在計(jì)算機(jī)教學(xué)方面。E.Sammet在“ProgrammingLanguage:HistoryandFuture”,CommunicationsoftheACM中列出了若干代表性語言:APT(AutomaticallyProgrammedTools)1956,第一個(gè)專用領(lǐng)域語言。Fortran(FORmulaTRANslation)1956,第一個(gè)廣泛使用的高級(jí)語言,為大量的科學(xué)和工程人員打開了使用計(jì)算機(jī)的大門。Flow-Matic1956,第一個(gè)商業(yè)數(shù)據(jù)處理語言,第一次強(qiáng)調(diào)“類英文”的語法。IPL-V(InformationProcessingLanguageV)1958,第一個(gè)表處理語言。Comit1957,第一個(gè)實(shí)用的串處理和模式匹配語言。Cobol(CommonBusiness-OrientedLanguage)1960,最廣泛使用的數(shù)據(jù)處理語言。具有類英文的語法和機(jī)器獨(dú)立性。Algol60(ALGOrithmicLanguage)1960,用于刻劃算法。形式化語法定義,帶動(dòng)了語言的理論和實(shí)現(xiàn)技術(shù)研究。Lisp(LIStProcessing)1960,引入了函數(shù)程序設(shè)計(jì)概念,基于表處理。Jovial(JulesOwnVersionofIAL)1960,第一次包含了科學(xué)計(jì)算,I/O信息的邏輯操作、數(shù)據(jù)存貯和處理等能力。大多數(shù)Jovial編譯器用Jovial書寫。GPSS(General-PurposeSystemSimulator)1961,第一個(gè)仿真語言。Joss(JOHNNIACOpen-ShopSystem)1964,第一個(gè)交互式語言。Formac(FORmulaManipulationCompiler)1964,第一個(gè)廣泛使用的形式代數(shù)操作語言。APL/360(AProgrammingLanguage)1967,引入了許多高級(jí)操作子,允許很短的算法,產(chǎn)生了看問題的新方式。Pascal1971,在一個(gè)小語言中引入了如賦類型的新概念,并以優(yōu)美方式組合了各種著名結(jié)構(gòu)。程序設(shè)計(jì)語言的角色早期,計(jì)算機(jī)非常昂貴,而程序員年薪不高,關(guān)鍵資源是計(jì)算機(jī)。因此,語言設(shè)計(jì)是為了更高效地執(zhí)行程序,高級(jí)語言需和匯編語言競(jìng)爭(zhēng)。Fortran的主要設(shè)計(jì)者Backus在Fortran面世十年后曾說:坦率地講,我們當(dāng)時(shí)未曾有過任何最模糊的關(guān)于FORTRAN及其編譯器將如何工作的想法。我們只是簡(jiǎn)單地努力優(yōu)化目標(biāo)程序,運(yùn)行時(shí)間,因?yàn)楫?dāng)時(shí)大多數(shù)人不相信你可以真正完成這樣的事。他們認(rèn)為機(jī)器編碼的程序?qū)⑹菢O端低效的,對(duì)很多應(yīng)用都是不實(shí)用的。我們未曾想到的一個(gè)結(jié)果是:有這樣一個(gè)系統(tǒng),它被設(shè)計(jì)為完全獨(dú)立于程序?qū)⒆罱K運(yùn)行于其上的機(jī)器。這后來證明是非常有價(jià)值的能力,但當(dāng)時(shí)我們肯定未曾想到。我們的活動(dòng)沒有任何組織。程序的每個(gè)部分由一到二人完成,除了極少數(shù)例外,他們完全負(fù)責(zé)他們所做的事情。事情無序地發(fā)展,當(dāng)FORTRAN發(fā)布時(shí),我們面臨這樣一個(gè)事實(shí):25000條指令將并不是全正確的,存在著大量將在大量使用后才會(huì)顯示出來的問題。60年代中期,程序設(shè)計(jì)發(fā)生了變化,機(jī)器價(jià)格下降,程序設(shè)計(jì)價(jià)格上升。程序移植的需求越來越多,軟件的維護(hù)占用了大量的計(jì)算資源。此時(shí)的目標(biāo)不再是編譯程序后使其高效地運(yùn)行,高級(jí)語言的任務(wù)變成使其易于開發(fā)正確的程序以解決某給定應(yīng)用領(lǐng)域中的問題。編譯技術(shù)成熟于60、70年代,語言技術(shù)以解決特定領(lǐng)域問題為中心,如:Fortran用于科學(xué)計(jì)算,COBOL用于商業(yè)應(yīng)用,JOVIAL用于軍事應(yīng)用,LISP用于人工智能應(yīng)用,以及Ada用于嵌入式軍事應(yīng)用等。程序設(shè)計(jì)語言也會(huì)進(jìn)化和消亡,如:Algol已不再使用,Cobol使用正在下降,Pascal的很多結(jié)構(gòu)仍在Ada中存在,但其黃金時(shí)代已過去。仍在使用的舊語言也經(jīng)歷了不斷的修訂以反應(yīng)來自其他計(jì)算領(lǐng)域的影響,F(xiàn)ortran和Cobol已有多個(gè)標(biāo)準(zhǔn)化標(biāo)本。Ada有1995年新標(biāo)準(zhǔn)。Lisp修訂后有Scheme和CommonLisp。C++和ML則反應(yīng)了人們?cè)谠O(shè)計(jì)和使用語言中獲得的經(jīng)驗(yàn)的混合。對(duì)語言的主要影響源自如下幾個(gè)方面:1、計(jì)算機(jī)能力計(jì)算機(jī)經(jīng)歷了數(shù)代的巨大變化,操作系統(tǒng)成為語言基于的平臺(tái)(不再僅依靠硬件)。這些因素影響了高級(jí)語言的結(jié)構(gòu)和使用語言特性的代價(jià)。2、應(yīng)用應(yīng)用領(lǐng)域有了很大變化,計(jì)算機(jī)應(yīng)用已滲透到幾乎所有領(lǐng)域,新應(yīng)用的需求影響了新語言的設(shè)計(jì)和舊語言的修訂。特別是近幾年,INTERNET的發(fā)展進(jìn)一步拓廣的應(yīng)用范圍。3、程序設(shè)計(jì)方法人們對(duì)書寫大型復(fù)雜系統(tǒng)的方法的深入研究和程序設(shè)計(jì)環(huán)境的變化也影響語言的發(fā)展。4、實(shí)現(xiàn)方法更好的實(shí)現(xiàn)方法影響到新語言中特性的選擇。5、理論研究使用形式化的數(shù)學(xué)方法,對(duì)語言設(shè)計(jì)和實(shí)現(xiàn)的概念基礎(chǔ)的研究加深了我們對(duì)語言特性的優(yōu)勢(shì)和弱點(diǎn)的理解,從而影響語言中特性的選取,如“繼承”,因語義復(fù)雜,而被有的語言放棄。6、標(biāo)準(zhǔn)化標(biāo)準(zhǔn)化語言需要易于在不同計(jì)算機(jī)上實(shí)現(xiàn),使程序易于移植,這對(duì)語言的設(shè)計(jì)影響是保守的,即輕易不引入新特性。一些重要的語言和技術(shù)影響:1951-55:硬件:電子管計(jì)算機(jī),水銀延遲線內(nèi)存方法:匯編語言,基礎(chǔ)概念:子程序,數(shù)據(jù)結(jié)構(gòu)語言:表達(dá)式編譯器的實(shí)驗(yàn)性使用1956-60:硬件:磁帶存儲(chǔ)器,磁芯內(nèi)存,晶體管電路方法:早期編譯技術(shù),BNF文法,代碼優(yōu)化,解釋器,動(dòng)態(tài)存儲(chǔ)方法和表處理語言:FORTRAN,ALGOL58,ALGOL60,COBOL,LISP1961-65硬件:可兼容的體系結(jié)構(gòu)家族,磁盤存儲(chǔ)器方法:多道程序設(shè)計(jì)操作系統(tǒng),語法制導(dǎo)的編譯器語言:COBOL61,ALGOL60(修訂),SNOBOL,JOVIAL,APL符號(hào)體系1966-1970硬件:增加尺寸和速度并降低成本,小型計(jì)算機(jī),微程序設(shè)計(jì),集成電路方法:分時(shí)和交互式系統(tǒng),優(yōu)化編譯器,翻譯器書寫系統(tǒng)語言:APL,F(xiàn)ORTRAN66,COBOL65,ALGOL68,SNOBOL4,BASIC,PL/1,SIMULA67,ALGOL-W1971-75硬件:微型計(jì)算機(jī),小型計(jì)算機(jī)時(shí)代,小型大規(guī)模存儲(chǔ)系統(tǒng),磁性內(nèi)存的衰落和半導(dǎo)體內(nèi)存的興起方法:程序驗(yàn)證,結(jié)構(gòu)化程序設(shè)計(jì),軟件工程作為一門學(xué)科的早期發(fā)展語言:PASCAL,COBOL74,PL/1(標(biāo)準(zhǔn)),C,Scheme,Prolog1976-80硬件:商用質(zhì)量的微機(jī),大型大規(guī)模存儲(chǔ)系統(tǒng),分布式計(jì)算方法:數(shù)據(jù)抽象,形式化語義,并發(fā)、嵌入式、和實(shí)時(shí)程序設(shè)計(jì)技術(shù)語言:Smalltalk,Ada,F(xiàn)ORTRAN77,ML1981-85硬件:個(gè)人計(jì)算機(jī),第一代工作站,視頻游戲,局域網(wǎng),Arpanet方法:面向?qū)ο蟪绦蛟O(shè)計(jì),交互式環(huán)境,語法制導(dǎo)編輯器語言:TurboPascal,Smalltalk80,Prolog的發(fā)展,Ada83,Postscript1986-90硬件:微機(jī)時(shí)代,工程工作站的上升,RISC體系結(jié)構(gòu),全域網(wǎng),Internet方法:客戶/服務(wù)器計(jì)算語言:FORTRAN90,C++,SML(標(biāo)準(zhǔn)ML)1991-95硬件:非常快的廉價(jià)工作站和微機(jī),大規(guī)模并行體系結(jié)構(gòu),語音,視頻,傳真,多媒體方法:開放系統(tǒng),環(huán)境框架,國(guó)家信息基礎(chǔ)設(shè)施(信息高速公路)語言:Ada95,過程語言(TCL,PERL)1996-2000硬件:二代Internet,機(jī)群,網(wǎng)絡(luò)計(jì)算機(jī)(NC)方法:軟件構(gòu)件技術(shù),Agent,中間件,瀏覽器/服務(wù)器計(jì)算,Internet計(jì)算語言:JAVA,XML,IDL(后兩種一個(gè)意義上不能算為程序設(shè)計(jì)語言)1.3程序設(shè)計(jì)語言的評(píng)價(jià)好語言的屬性1、清晰、簡(jiǎn)單、一致(協(xié)調(diào))程序設(shè)計(jì)語言既是思考算法的概念框架,又是表達(dá)算法的工具。語言對(duì)程序的幫助不僅在編碼階段,還會(huì)在此階段前較長(zhǎng)一段時(shí)間,均有幫助。語言應(yīng)該是提供清晰、簡(jiǎn)單、一致的概念,用作算法開發(fā)的基本原語。因此,希望有最少數(shù)量的不同概念及其盡可能簡(jiǎn)單和規(guī)則的組合規(guī)則,稱為概念完整性。語言的語法對(duì)程序的書寫、測(cè)試、理解和修改有較大影響,因此,可讀性是一個(gè)中心問題。特別精簡(jiǎn)或隱義的語言使程序易于書寫(對(duì)有經(jīng)驗(yàn)的程序員),但難于讀(當(dāng)要修改時(shí)),如APL,甚至程序員本人過一段間后也難讀懂。有的語言幾乎相同的語句實(shí)際上代表了完全不同的事。因此,一條基本原則是,語義不同應(yīng)在語法中完全反映出來。2、正交性意味著可以以所有可能的方式來組合語言特性以得到有意義的組合結(jié)果,如條件語句和任意表達(dá)式的組合。正交性使語言易學(xué),程序易寫,因?yàn)椴恍栌涀√嗟睦夂吞厥馇闆r,缺點(diǎn)是:邏輯上不協(xié)調(diào)或極端低效的組合可能會(huì)被編譯器忽略。正交性在語言設(shè)計(jì)中是一個(gè)有爭(zhēng)議的屬性。3、應(yīng)用自然性語言的語法應(yīng)使得正確的使用可以允許程序結(jié)構(gòu)反映出算法的邏輯結(jié)構(gòu)。理想地:直接將程序的設(shè)計(jì)翻譯為合適的反映算法結(jié)構(gòu)的程序語句。順序算法、并發(fā)算法、邏輯算法等各有不同的自然結(jié)構(gòu)。語言應(yīng)提供合適的數(shù)據(jù)結(jié)構(gòu)、操作、控制結(jié)構(gòu)和面向問題的自然語法。語言流行的主要原因之一便是對(duì)自然性的需要。特別適合某類應(yīng)用的語言將大大簡(jiǎn)化該領(lǐng)域程序的創(chuàng)建,如Prolog適合于推導(dǎo),C++適合于OO設(shè)計(jì)。4、對(duì)抽象的支持即使對(duì)最自然的語言,在刻劃問題求解的抽象數(shù)據(jù)結(jié)構(gòu)和操作與語言固有的特別的基本數(shù)據(jù)結(jié)構(gòu)和操作間總是存在著差距。如C可能是一個(gè)合適的用于構(gòu)造大學(xué)課程調(diào)度應(yīng)用的語言,但抽象的數(shù)據(jù)結(jié)構(gòu)如“學(xué)生”、“課程”、“授課老師”、“教室”等以及抽象操作“分配某學(xué)生到某課程”,“安排某課在某教室”等并不在C語言中提供,而它們對(duì)應(yīng)用本身是非常自然的。程序員的任務(wù)之一便是為問題求解設(shè)計(jì)合適的抽象,然后用實(shí)際語言提供的更基本的特性來實(shí)現(xiàn)這些抽象。理想地:語言應(yīng)允許數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型和操作作為自包含的抽象而定義,程序員可以將它們用在程序的其他部分(只需了解其抽象性質(zhì),而無需知道實(shí)現(xiàn)細(xì)節(jié))。5、程序易于驗(yàn)證程序的可靠性總是一個(gè)中心的問題,有很多技術(shù)驗(yàn)證一個(gè)程序是否正確地完成所需功能。程序可以用形式化方法證明是正確的,也可以用桌面檢查方式非形式地證明正確性(讀程序文本)也可以用測(cè)試的方法,用測(cè)試數(shù)據(jù)輸入,檢查輸出結(jié)果是否滿足規(guī)約,對(duì)大型程序,可能需要這些方法的組合語言應(yīng)該對(duì)程序驗(yàn)證提供支持,其支持力度是選擇語言的主要標(biāo)準(zhǔn)之一。語義和語法結(jié)構(gòu)的簡(jiǎn)單性是簡(jiǎn)化程序驗(yàn)證的主要因素。6、編程環(huán)境語言的技術(shù)結(jié)構(gòu)僅僅是影響其使用的一個(gè)方面,而合適的編程環(huán)境可以彌補(bǔ)語言技術(shù)上的弱點(diǎn)。編程環(huán)境包含很多因素:可靠的、有效的、有良好文檔的語言實(shí)現(xiàn)自然是首要因素。特殊的編輯器和測(cè)試包可以加速程序的創(chuàng)建和測(cè)試。維護(hù)和修改程序的多個(gè)版本的機(jī)制有利于大型程序的開發(fā)。7、程序的易移植性程序的易移植性是很多項(xiàng)目的重要目標(biāo)。廣泛使用的和獨(dú)立于機(jī)器特性而定義的語言是易移植性的有用的基礎(chǔ),如:Ada、Fortran、C、Pascal等有標(biāo)準(zhǔn)化定義的語言書寫的程序易移植性較好。8、使用代價(jià)代價(jià)是評(píng)價(jià)語言的主要元素,但具有不同的代價(jià)度量。a.程序執(zhí)行代價(jià)在早期,代價(jià)主要是程序執(zhí)行代價(jià)。因此,優(yōu)化編譯器的實(shí)現(xiàn)、高效的寄存器的分配和高效的運(yùn)行時(shí)支持機(jī)制的設(shè)計(jì)是非常重要的。程序執(zhí)行代價(jià)對(duì)語言設(shè)計(jì)是重要的,但主要對(duì)將重復(fù)執(zhí)行的大程序更為重要。目前,對(duì)很多應(yīng)用、執(zhí)行速度不再是主要考慮。對(duì)程序開發(fā)的更好診斷和更容易的用戶控制以及程序的維護(hù)也需要考慮,在此情況下,執(zhí)行時(shí)間增加10%—20%,也是可容忍的。b.程序翻譯代價(jià)當(dāng)Fortran或C等用于教學(xué)時(shí),高效的翻譯(編譯)比高效執(zhí)行更為重要。通常學(xué)生程序會(huì)多次編譯,而執(zhí)行次數(shù)不多,需要快速、高效的編譯器。c.程序生成、測(cè)試和使用的代價(jià)對(duì)某類問題,求解應(yīng)該在程序員最少投入的情形下被設(shè)計(jì)、編碼、測(cè)試、修改和使用。如:Smalltalk是價(jià)格有效的,求解一個(gè)問題的時(shí)間和努力均較少。對(duì)使用語言的總代價(jià)的考慮在很多情況下變得和傳統(tǒng)的代價(jià)同等重要。d.程序維護(hù)的代價(jià)研究表明,對(duì)較長(zhǎng)時(shí)間運(yùn)行的程序的代價(jià)不是初始設(shè)計(jì)、編碼、測(cè)試的代價(jià)而是整過生命周期代價(jià)(涉及開發(fā)和維護(hù))。維護(hù)包括發(fā)現(xiàn)錯(cuò)誤的修改、平臺(tái)的變化所需的修改、程序的擴(kuò)展和加強(qiáng)。語言對(duì)維護(hù)的支持是非常重要的(長(zhǎng)期運(yùn)行的程序由多個(gè)人員維護(hù),語言應(yīng)有支持)語言的應(yīng)用領(lǐng)域語言的使用依賴于所求解問題的應(yīng)用領(lǐng)域,過去30年各種應(yīng)用領(lǐng)域的語言已有很大變化。1、60年代的應(yīng)用60年代的程序設(shè)計(jì)可分為四個(gè)基本類:商業(yè)處理、科學(xué)計(jì)算、系統(tǒng)程序設(shè)計(jì)、人工智能應(yīng)用。商業(yè)處理這類應(yīng)用大多是大的數(shù)據(jù)處理系統(tǒng),運(yùn)行在大型機(jī)上,其基本特征是:讀大量在多個(gè)磁帶設(shè)備上的歷史數(shù)據(jù),讀少量的當(dāng)前事務(wù)集,寫出一個(gè)新的歷史數(shù)據(jù)集。COBOL是這類應(yīng)用的代表語言。商業(yè)應(yīng)用還包括商業(yè)計(jì)劃、風(fēng)險(xiǎn)分析和“Whatif”方案(60年代,這樣一個(gè)應(yīng)用通常需幾個(gè)月)??茖W(xué)計(jì)算主要用于各種數(shù)學(xué)方程的求解,包括數(shù)值分析、微積分求解、統(tǒng)計(jì),這是計(jì)算機(jī)的第一個(gè)應(yīng)用領(lǐng)域,F(xiàn)ortran是最流行語言,其語法接近數(shù)學(xué)。系統(tǒng)操作系統(tǒng)和編譯器這類應(yīng)用要求能夠訪問硬件的全部功能和資源,當(dāng)時(shí)沒有有效的語言存在。匯編語言是主要的選擇。Jovial(Algol的變體)曾用于美國(guó)DoD的一些項(xiàng)目,60年代末,PL/I可用于此目的。一個(gè)相關(guān)的應(yīng)用領(lǐng)域是過程控制,由于當(dāng)時(shí)計(jì)算機(jī)的龐大和昂貴,大多數(shù)過程控制應(yīng)用是非常大的,如電站控制和自動(dòng)裝配線控制。Forth語言專為此而設(shè)計(jì),匯編語言也常被使用。人工智能其特征是對(duì)大的數(shù)據(jù)空間的搜索算法。LISP是主要語言。2、90年代的應(yīng)用當(dāng)前的情況遠(yuǎn)較過去復(fù)雜,有更多的應(yīng)用領(lǐng)域,可選語言也更多。商業(yè)處理COBOL仍然是主要語言,C和PL/1也時(shí)常被使用然而“Whatif”方案已完全改變,spreadsheet已完全改革該領(lǐng)域過去對(duì)典型的商業(yè)計(jì)劃程序需化一個(gè)程序員幾個(gè)月,現(xiàn)在可在幾小時(shí)內(nèi)泡制出很多。第四代語言也開始進(jìn)入此市場(chǎng)。4GL提供了基于窗口的程序員界面,易于訪問數(shù)據(jù)庫(kù)記錄,易于產(chǎn)生填空式的輸入表和優(yōu)美的輸出報(bào)告,有時(shí)4GL編譯器產(chǎn)生COBOL程序作為輸出??茖W(xué)計(jì)算Fortran仍有較大市場(chǎng),C開始進(jìn)入該領(lǐng)域。Fortran90加入了許多Ada和其他語言的特征。系統(tǒng)軟件60年代末的C和后來的C++占據(jù)了這個(gè)領(lǐng)域。C提供了非常高效的執(zhí)行,允許程序員對(duì)操作系統(tǒng)和硬件的完全訪問,其他語言如:Modula、Pascal、現(xiàn)代BASIC也可用于此。Ada以支持系統(tǒng)軟件開發(fā)為目標(biāo),但從未達(dá)到其成為此領(lǐng)域主要語言的目標(biāo)。匯編語言的使用已成為過去。實(shí)時(shí)語言的需求也在增加,C、Ada、Pascal常用于此。AILISP仍在使用,只是改為Scheme和CommonLisp。Prolog是此領(lǐng)域的新軍。出版字處理系統(tǒng)有自己的輸入命令和輸出文件語法。TEX是常用的語言,它產(chǎn)生Postscript頁面描述語言(直接使用已不多見)。Process(處理)60年代,程序員通過命令操作計(jì)算機(jī),現(xiàn)在常用程序來控制其他程序,如:每天半夜備份文件,自動(dòng)回答電子郵件等。這樣的活動(dòng)稱為處理,這需要專用的處理語言,例如有:UNIX中的Shell,DOS中的BAT等。新范型新的應(yīng)用模型仍在研究中,ML用于類型理論研究,其用戶正在增長(zhǎng)。Smalltalk是另一重要語言,它是OO語言的起源。JAVA的應(yīng)用域也在逐步擴(kuò)大。語言的標(biāo)準(zhǔn)化一個(gè)例子:inti;i=(1&&2)+3;這是一條C語言語句,該語句是否有效?i的值是什么?要回答這個(gè)問題,三個(gè)方法是常用的。1.通過閱讀語言參考手冊(cè)以決定語句的含義2.在自己的計(jì)算機(jī)上寫一段程序查看其結(jié)果3.閱讀語言標(biāo)準(zhǔn)中的定義選擇2是常用的方法——簡(jiǎn)單易行,因?yàn)檎Z言概念和其特殊實(shí)現(xiàn)相關(guān)。直接查用戶參考手冊(cè)也是常用的。但選擇3較少用,因?yàn)楹苌儆腥丝凑Z言標(biāo)準(zhǔn)。選擇1、2意味著一個(gè)語言的概念是和其特殊實(shí)現(xiàn)相關(guān)的。但實(shí)現(xiàn)是否正確?如:移植一個(gè)程序到另一計(jì)算機(jī)上,仍能正確編譯嗎?通常語言設(shè)計(jì)涉及一些復(fù)雜的細(xì)節(jié),各個(gè)廠商有不同的解釋,從而產(chǎn)生細(xì)微的執(zhí)行行為上的差異。廠商也可能決定加入新的特性到語言中以增強(qiáng)其有用性,但新加入是否“合法”是一個(gè)問題,它有可能導(dǎo)致移植的困難。為解決這些問題,大多數(shù)語言有標(biāo)準(zhǔn)定義,所有實(shí)現(xiàn)應(yīng)該符合標(biāo)準(zhǔn),通常有兩種標(biāo)準(zhǔn):1.業(yè)主標(biāo)準(zhǔn)(Proprietary)。開發(fā)并擁有語言的公司所給定的定義。這類標(biāo)準(zhǔn)通常不適合已廣泛使用的語言。實(shí)現(xiàn)上的變體會(huì)隨著很多增強(qiáng)和不兼容而出現(xiàn)。2.合議標(biāo)準(zhǔn)(Consensus)?;谙嚓P(guān)參與者的同意而由一個(gè)組織產(chǎn)生的標(biāo)準(zhǔn)。合議標(biāo)準(zhǔn)是保證語言實(shí)現(xiàn)一致性的主要方法。每個(gè)國(guó)家都有自己的標(biāo)準(zhǔn)化組織美國(guó):AmericanNationalStandardInstitute,ANSI負(fù)責(zé)程序設(shè)計(jì)語言標(biāo)準(zhǔn)的是:ComputerBusinessEquipmentManufactureAssociation(CBEMA)的X3委員會(huì)。IEEE(InstituteofElectricalandElectronicEngineers)也開發(fā)相應(yīng)標(biāo)準(zhǔn)。英國(guó):BSI(BritishStandardsInstitute)國(guó)際:ISO(InternationalStandardsOrganization),在瑞士、日內(nèi)瓦。標(biāo)準(zhǔn)開發(fā)遵循類似的過程在某一時(shí)間,一組人認(rèn)為一個(gè)語言需要一個(gè)標(biāo)準(zhǔn)定義了,標(biāo)準(zhǔn)化組織將組織一批志愿者來開發(fā)標(biāo)準(zhǔn),當(dāng)工作組提出標(biāo)準(zhǔn)后,讓更大范圍的人進(jìn)行投票,不能達(dá)成共識(shí)的部分去掉,然后產(chǎn)生語言標(biāo)準(zhǔn)。從理論上說,這是一個(gè)好過程,然而,實(shí)際上標(biāo)準(zhǔn)制訂技術(shù)和政治因素參半,如:編譯器的制造商在標(biāo)準(zhǔn)化過程中均有財(cái)力投入,都希望標(biāo)準(zhǔn)按自己的思路走,從而避免改變自己的實(shí)現(xiàn)以及失去用戶群。標(biāo)準(zhǔn)的制定是一個(gè)合議的過程,不是每一個(gè)人按自己的方式辦,而是希望最終的語言能為所有人所接受。在意見不同時(shí),有時(shí)不得不將有的特性排除在標(biāo)準(zhǔn)外。為了更好地使用標(biāo)準(zhǔn),有三個(gè)值得強(qiáng)調(diào)的問題:1.時(shí)限:什么時(shí)候開始標(biāo)準(zhǔn)化一個(gè)語言?Fortran于1966年開始標(biāo)準(zhǔn)化,當(dāng)時(shí)已有很多不兼容版本,從而導(dǎo)致了很多問題。另一個(gè)極端,Ada于1983年在有任何實(shí)現(xiàn)前即開始標(biāo)準(zhǔn)化,因此,并不清楚標(biāo)準(zhǔn)產(chǎn)生時(shí)是否有語言可以使用。第一批的Ada編譯器在87或88年才出現(xiàn)。人們應(yīng)該盡早開始一個(gè)語言的標(biāo)準(zhǔn)化,只要有足夠的語言使用經(jīng)驗(yàn)即可,太晚則會(huì)導(dǎo)致很多不兼容的實(shí)現(xiàn)。2.相符性——什么意味著程序和編譯器符合標(biāo)準(zhǔn)程序符合標(biāo)準(zhǔn)——如果該程序只使用標(biāo)準(zhǔn)定義的特性編譯器符合標(biāo)準(zhǔn)——對(duì)一個(gè)給定的符合標(biāo)準(zhǔn)的程序,可以生成能夠產(chǎn)生正確輸出的可執(zhí)行碼。這里并未涉及對(duì)標(biāo)準(zhǔn)的擴(kuò)充,如編譯器加了附加特性,則使用這些特性的程序?qū)⒉缓蠘?biāo)準(zhǔn)。標(biāo)準(zhǔn)通常強(qiáng)調(diào)符合標(biāo)準(zhǔn)的程度,大多數(shù)編譯器都加入了自己的特性。3.廢棄新的計(jì)算機(jī)結(jié)構(gòu)需要新的語言特性。一旦我們標(biāo)準(zhǔn)化一個(gè)語言,幾年以后它可能會(huì)變得古怪。如:Fortran66標(biāo)準(zhǔn)就已過時(shí),它沒有類型、嵌套控制結(jié)構(gòu)、封裝、塊結(jié)構(gòu)和其他現(xiàn)代特征。一般每五年應(yīng)復(fù)審標(biāo)準(zhǔn),或者重新修訂或者丟棄。所有標(biāo)準(zhǔn)的一個(gè)問題是:遵循舊標(biāo)準(zhǔn)書寫的程序怎么辦?重寫程序代價(jià)非常大,因此大多數(shù)標(biāo)準(zhǔn)需要向后兼容。這樣也存在一些問題:具有廢棄結(jié)構(gòu)的語言可能變得難以控制,更危險(xiǎn)的是這些結(jié)構(gòu)可能會(huì)對(duì)好的程序設(shè)計(jì)有害。目前,存在兩個(gè)相關(guān)概念:廢棄和反對(duì)(deprecate)廢棄——一個(gè)特性被廢棄是指:它是一個(gè)可能在下一個(gè)標(biāo)準(zhǔn)版本中丟棄的特性,這意味著,該特性仍然可用,但在5—10年內(nèi)會(huì)被丟棄,這樣提前可為重寫作好準(zhǔn)備。反對(duì)——反對(duì)特性將在下一個(gè)標(biāo)準(zhǔn)版本中變成廢棄的,新編寫的程序不應(yīng)再使用此類特性。符合標(biāo)準(zhǔn)的編譯器允許有擴(kuò)展,只要能正確地編譯符合標(biāo)準(zhǔn)的程序即可。大多數(shù)編譯器均有擴(kuò)展,廠商加入特性以力爭(zhēng)擴(kuò)大市場(chǎng)份額。這是導(dǎo)致語言發(fā)展的重要因素之一。學(xué)術(shù)界,人們并不關(guān)心這樣的標(biāo)準(zhǔn),總是根據(jù)自己的研究擴(kuò)展和修改語言。這也是語言發(fā)展的重要源泉。1.4環(huán)境對(duì)語言的影響語言的發(fā)展不能在真空中進(jìn)行,支持語言的硬件對(duì)語言有很大影響。支持程序執(zhí)行的外部環(huán)境稱為操作或目標(biāo)環(huán)境。程序被設(shè)計(jì)、編碼、測(cè)試和調(diào)試的環(huán)境稱為宿主環(huán)境。通??煞譃樗念惸繕?biāo)環(huán)境:批處理環(huán)境交互式環(huán)境嵌入式系統(tǒng)環(huán)境程序設(shè)計(jì)環(huán)境--交互式環(huán)境的特例批處理環(huán)境最早和最簡(jiǎn)單的操作環(huán)境只含有外部數(shù)據(jù)文件數(shù)據(jù)文件→程序處理→數(shù)據(jù)文件稱為批處理:因?yàn)檩斎霐?shù)據(jù)聚集成批并成批處理。Fortran、C、和Pascal均是為批處理而設(shè)計(jì)的,當(dāng)然也可用于交互式嵌入式環(huán)境。對(duì)語言設(shè)計(jì)的影響環(huán)境的影響可分為四個(gè)方面:I/O特性、錯(cuò)誤和例外處理、時(shí)間設(shè)施和程序結(jié)構(gòu)。批處理語言中,文件是大多數(shù)I/O特性的基礎(chǔ)。雖然文件可用作到終端的交互式I/O,但對(duì)交互I/O的特殊需要并不涉及。文件通常存貯定長(zhǎng)記錄,而終端需要鍵盤上每輸入一個(gè)字符就讀入一次。嵌入系統(tǒng)需訪問特殊的I/O設(shè)備,批處理器則不作此考慮。批處理中,終止程序執(zhí)行的錯(cuò)誤是可接受的,但代價(jià)昂貴,因?yàn)殄e(cuò)誤糾正后,必須重復(fù)全部運(yùn)行。同時(shí),來自用戶的立即處理和糾正錯(cuò)誤的幫助是不可能的。這樣語言的錯(cuò)誤或例外處理機(jī)制強(qiáng)調(diào)在程序中進(jìn)行錯(cuò)誤/例外處理,使得程序可從大多數(shù)錯(cuò)誤恢復(fù),無終止地繼續(xù)執(zhí)行碼。批處理的第三特征是程序時(shí)間限制的缺乏。語言通常不提供監(jiān)控或直接影響執(zhí)行速度的設(shè)施。語言特性的實(shí)現(xiàn)也通常反映出時(shí)間限制的缺乏。程序結(jié)構(gòu)通常包含一個(gè)主程序和一個(gè)子程序集合,如:C、Fortran、Pascal等。子程序完全由編譯器處理,編譯器在工作時(shí)間內(nèi)很少和程序員交流。交互式環(huán)境當(dāng)前的PC機(jī)和工作站大多如此使用,程序在執(zhí)行過程中直接和用戶交互,從鍵盤或mouse接收數(shù)據(jù)并送到顯示器顯示。如字處理、游戲、數(shù)據(jù)管理、CAI等。影響:交互式I/O完全不同于一般的文件操作.錯(cuò)誤處理方式不同,一旦錯(cuò)誤輸入,程序可能顯示錯(cuò)誤消息并請(qǐng)求糾正,在程序中處理錯(cuò)誤的設(shè)施并不重要,錯(cuò)誤時(shí)終止程序通常是不可接受的。必須經(jīng)常使用某種時(shí)間限制,至少必須有可以忍受的時(shí)間反應(yīng)。有時(shí),長(zhǎng)時(shí)間不輸入會(huì)導(dǎo)致其他操作的調(diào)用。主程序的概念通常不存在。程序由一系列子程序構(gòu)成,用戶在終端輸入“主程序”作為命令序列。和用戶的交互形式為:請(qǐng)求命令,按命令執(zhí)行,請(qǐng)求另一命令。嵌入式系統(tǒng)環(huán)境一個(gè)用于控制一個(gè)大系統(tǒng)的部分的計(jì)算機(jī)系統(tǒng)稱為嵌入式系統(tǒng)(成為大系統(tǒng)的有機(jī)集成部分,其失誤將導(dǎo)致整個(gè)大系統(tǒng)的失?。???煽啃院驼_性是這類系統(tǒng)程序的主要屬性。影響:嵌入式系統(tǒng)的程序通常沒有操作系統(tǒng)的支持,也沒有通常的文件和I/O設(shè)備環(huán)境,程序必須和非標(biāo)準(zhǔn)的I/O設(shè)備直接交互,通常使用特殊的過程。因此,語言通常不考慮文件和面向文件的I/O操作。特殊設(shè)備的訪問能力是必須提供的:通過訪問特殊的硬件寄存器、存儲(chǔ)位置中斷處理器或以匯編或其他低級(jí)語言書寫的子程序。錯(cuò)誤處理是十分重要的。每個(gè)程序應(yīng)準(zhǔn)備好處理所有錯(cuò)誤,采取適當(dāng)?shù)膭?dòng)作去恢復(fù)和繼續(xù)。程序終止是不可接受的,除非災(zāi)難性的系統(tǒng)失誤。通常也無用戶提供交互幫助。錯(cuò)誤處理還必須處理系統(tǒng)部件的失?。ǔ艘话愕腻e(cuò)誤外)。嵌入系統(tǒng)總是涉及實(shí)時(shí)操作,即能對(duì)輸入作出及時(shí)反應(yīng)并同時(shí)產(chǎn)生輸出,語言必須具有時(shí)間設(shè)施。嵌入式計(jì)算機(jī)系統(tǒng)通常是分布系統(tǒng),涉及多個(gè)計(jì)算機(jī)。這樣,運(yùn)行的程序通常是一個(gè)并發(fā)執(zhí)行的任務(wù)集,每個(gè)任務(wù)控制或監(jiān)控一個(gè)局部。如果有主程序,也僅僅是為了初始化任務(wù)的執(zhí)行,一旦初始化后,任務(wù)通常并發(fā)運(yùn)行,且無限地運(yùn)行,除非整個(gè)系統(tǒng)失敗或關(guān)閉。程序設(shè)計(jì)環(huán)境這是程序創(chuàng)建和測(cè)試的環(huán)境,和操作環(huán)境相比,它對(duì)程序設(shè)計(jì)影響稍小,然而,普遍的認(rèn)識(shí)是:好的程序設(shè)計(jì)環(huán)境對(duì)程序生產(chǎn)有較大影響,程序設(shè)計(jì)環(huán)境通常包含一個(gè)支持工具的集合和調(diào)用它們的命令集(編輯器、調(diào)試器、驗(yàn)證器、測(cè)試數(shù)據(jù)生成器、美化打印器等)。對(duì)語言的影響主要體現(xiàn)在兩個(gè)方面:分開編譯和部件裝配,程序測(cè)試和調(diào)試分開編譯——這對(duì)大型程序的實(shí)現(xiàn)非常重要分開編譯的困難在于:編譯一個(gè)子程序時(shí),編譯器可能需要其他子程序或共享數(shù)據(jù)對(duì)象的信息。所需指導(dǎo)的信息包括:1、被調(diào)用子程序的參數(shù)的數(shù)量、類型、順序等的規(guī)約,允許編譯器檢查外部子程序的調(diào)用是否有效。其他子程序的書寫語言也是需要知道的,編譯器可以據(jù)此設(shè)置適當(dāng)調(diào)用順序,以傳送數(shù)據(jù)和控制信息。2、被引用變量的類型聲明是需要的,允許編譯器確定外部變量的存儲(chǔ)表示,使得引用可以用適合的訪問格式來編譯。3、外部定義而在內(nèi)部聲明使用的數(shù)據(jù)類型的定義是需要的,允許編譯器分配存儲(chǔ)和計(jì)算局部數(shù)據(jù)格式。為了提供關(guān)于分開編譯的子程序、共享數(shù)據(jù)對(duì)象和類型定義的信息,通常有三個(gè)方法:1、語言可能需要信息在子程序中重新申明(如Fortran)。2、指定特殊的編譯順序,先編譯所需的外部信息(如Ada、Pascal)3、需要在編譯過程中包含相關(guān)規(guī)約的庫(kù)的存在,使得編譯器可隨時(shí)查詢(Ada、C++)方法一又可稱為獨(dú)立編譯每個(gè)子程序可不需外部信息而獨(dú)立編譯,子程序是完全自包含的。缺點(diǎn)是:沒有辦法檢查內(nèi)外信息的一致性。這種不一致錯(cuò)誤只能在裝配階段才可能知道。方法二、三需要工具將子程序、類型定義和公共環(huán)境的規(guī)約放到庫(kù)中。通常子程序的體(body,含局部變量和語句)可以略去,只需規(guī)約。體部分可在以后分開編譯。如Ada中,每個(gè)子程序、任務(wù)或包分成兩個(gè)部分(可以分開編譯):規(guī)約和體。一個(gè)對(duì)尚未編譯的子程序的調(diào)用稱為Stub,包含Stub的子程序可以執(zhí)行。但當(dāng)?shù)竭_(dá)Stub點(diǎn)時(shí),該調(diào)用產(chǎn)生一個(gè)系統(tǒng)診斷信息而不進(jìn)行實(shí)際調(diào)用,從而可達(dá)到單獨(dú)測(cè)試目的。分開編譯影響語言設(shè)計(jì)的另一面是共享名(不同開發(fā)者可能對(duì)子程序類型定義、公共變量使用相同的名)的使用。通常解決共享名的方法有三:1、每個(gè)共享名必須是唯一的(由程序員來保證),如C中extern中的變量名。命名約定用于每個(gè)小組使用不同的子程序名(如固定的名字前綴),如C中的_綴。2、語言常使用作用域(Scope)(在嵌套情況下,只有最外層子程序中的名對(duì)外可知)規(guī)則來隱藏名字。3、通過顯式地加入來自外部的定義而使名字可用,OOPL的繼承即為這種機(jī)制,通過包含外部定義的類在一個(gè)子程序中,該類定義的其他對(duì)象也就自然可知。Ada中,名字可以重載,n個(gè)對(duì)象可有相同名字,需編譯器來指定實(shí)際的引用。測(cè)試和調(diào)試大多數(shù)語言會(huì)有輔助程序測(cè)試和調(diào)試的特性。1、執(zhí)行追蹤。Prolog、LISP和很多其它交互語言提供了允許特殊語句和變量被標(biāo)志為執(zhí)行時(shí)“追蹤”。當(dāng)標(biāo)記的語句被執(zhí)行或標(biāo)記的變量被賦新值時(shí),程序的執(zhí)行中斷,指定的追蹤子程序被調(diào)用。2、斷點(diǎn)(Breakpoint)。在交互式編程環(huán)境中,語言常提供斷點(diǎn)設(shè)施,當(dāng)達(dá)到斷點(diǎn),執(zhí)行中止,控制權(quán)交給程序員,他可檢查或修改變量值并且開始程序執(zhí)行。3、斷言(Assertion)。斷言是一個(gè)條件表達(dá)式,插入在程序中。例:assert(x>0andA=1)or(x=0andA>B+10)斷言陳述了在指定點(diǎn)變量值間應(yīng)有的關(guān)系。當(dāng)斷言被“使能”,編譯器插入相應(yīng)的代碼來測(cè)試被陳述的條件,條件不成立,則執(zhí)行終止,調(diào)用例外處理。程序正確后,可將斷言設(shè)置掉重編譯,此時(shí),它只作為注釋用。早期的語言設(shè)計(jì)需使程序能高效地運(yùn)行于昂貴的硬件上,因此,早期語言總以翻譯成高效的機(jī)器碼為目標(biāo),既使程序難以書寫?,F(xiàn)在,硬件價(jià)格下降、軟件價(jià)格上升,更強(qiáng)調(diào)程序容易書寫,即使慢點(diǎn)也可。例如,ML的類型特性、C++的類、Ada的Package均在執(zhí)行速度上有代價(jià),但對(duì)保證程序正確性有幫助。開發(fā)語言時(shí),有三個(gè)影響語言設(shè)計(jì)的主要因素:計(jì)算機(jī)本身在計(jì)算機(jī)上支持語言的執(zhí)行模型,即虛擬計(jì)算機(jī)語言所實(shí)現(xiàn)的計(jì)算模型2.1計(jì)算機(jī)的結(jié)構(gòu)和操作一個(gè)計(jì)算機(jī)是能夠存儲(chǔ)和執(zhí)行程序的數(shù)據(jù)結(jié)構(gòu)和算法的集成集合。計(jì)算機(jī)可構(gòu)造為實(shí)際的物理設(shè)備,用導(dǎo)線、集成電路、電路板等。此即實(shí)際計(jì)算機(jī)或稱硬件計(jì)算機(jī)。計(jì)算機(jī)構(gòu)造為軟件,用運(yùn)行于其他計(jì)算機(jī)上的程序。此即軟件仿真計(jì)算機(jī)。程序設(shè)計(jì)語言的實(shí)現(xiàn)是通過一個(gè)翻譯器,將以語言書寫的程序翻譯為機(jī)器語言程序(可為某計(jì)算機(jī)直接執(zhí)行,可以是硬件計(jì)算機(jī),也可以為軟硬參雜的虛擬機(jī))。一個(gè)計(jì)算機(jī)包含6個(gè)主要部件,它們緊密地對(duì)應(yīng)于程序設(shè)計(jì)語言的主要方面。1、數(shù)據(jù):計(jì)算機(jī)必須提供各種基本數(shù)據(jù)項(xiàng)和操作的數(shù)據(jù)結(jié)構(gòu)。2、基本操作:必須提供對(duì)操作數(shù)據(jù)有用的基本操作集。3、順序控制:必須提供控制基本操作執(zhí)行順序的機(jī)制。4、數(shù)據(jù)訪問:必須提供控制向操作的執(zhí)行供給數(shù)據(jù)的機(jī)制。5、存儲(chǔ)管理:必須提供控制程序和數(shù)據(jù)存儲(chǔ)分配的機(jī)制。6、操作環(huán)境:必須提供與包圍程序和被處理數(shù)據(jù)的外部環(huán)境通訊的機(jī)制。計(jì)算機(jī)硬件一個(gè)典型的傳統(tǒng)計(jì)算機(jī)組織如下:包括程序和被處理的數(shù)據(jù)操作主存和高速緩存中的數(shù)據(jù)在主存和外部環(huán)境間傳遞程序或數(shù)據(jù)完成處理工作取機(jī)器指令解碼調(diào)用指定的基本操作,以指定的操作數(shù)作為輸入數(shù)據(jù)有三個(gè)主要的存貯部件:主存,高速寄存和外部文件。主存:組織為線性位串,可分為定長(zhǎng)的字(32或64)或8位字節(jié)。寄存器:字長(zhǎng)度的位串,可能有特殊的子域可直接訪問,可存數(shù)據(jù)或主存地址。外部文件:存在盤、帶或CD-ROM上,按記錄劃分,記錄是位或字節(jié)的序列。一個(gè)計(jì)算機(jī)有被硬件基本操作直接操作的固有數(shù)據(jù)類型。一般有:整數(shù)、單精度實(shí)數(shù)(浮點(diǎn)數(shù))、定長(zhǎng)字符串、定長(zhǎng)位串等。除了明顯的硬件數(shù)據(jù)元素外,程序(也有固有的內(nèi)部表示,稱為機(jī)器語言表示)也是一種數(shù)據(jù)形式。機(jī)器語言程序可構(gòu)造為存儲(chǔ)位置的序列,每個(gè)包含一或多條指令,每條包括操作碼和若干操作數(shù)(指示)。操作計(jì)算機(jī)必須包含有一個(gè)固有的基本操作集,通常和機(jī)器語言指令中操作碼一一對(duì)應(yīng)。典型的操作集包括在固有數(shù)值類型上的基本算術(shù)操作。測(cè)試數(shù)據(jù)項(xiàng)各種性質(zhì)的基本操作。訪問和修改數(shù)據(jù)項(xiàng)的基本操作??刂艻/O設(shè)備的基本操作。順序控制的基本操作。傳統(tǒng)的機(jī)器是CISC,complexinstructionsetcomputers.新近發(fā)展的是RISC,reducedinstructionsetcomputers.更少的基本指令,更簡(jiǎn)單的內(nèi)部邏輯。順序控制程序地址寄存器(位置計(jì)數(shù)器)的內(nèi)容決定了下一條將執(zhí)行的指令,即包含了下條指令的地址。某些基本操作允許修改程序寄存器,從而傳遞控制到程序的其他部分。解釋器實(shí)際地使用程序地址寄存器并指導(dǎo)操作序列。解釋器是計(jì)算機(jī)操作的中心,其周期動(dòng)作如圖所示:數(shù)據(jù)訪問除了操作碼外,每個(gè)機(jī)器指令必須指明所需的操作數(shù)(必須在主存或寄存器中)計(jì)算機(jī)必須結(jié)合指定操作數(shù)的手段和從給定操作數(shù)指示器檢索操作數(shù)的機(jī)制。同時(shí),操作的結(jié)果也必須存儲(chǔ)在指定的位置。傳統(tǒng)的存儲(chǔ)控制機(jī)制是為存儲(chǔ)位置設(shè)定整數(shù)地址,提供操作從給定地址的位置檢索內(nèi)容和存儲(chǔ)新值。寄存器也賦以整數(shù)地址。存儲(chǔ)管理機(jī)器設(shè)計(jì)的一個(gè)驅(qū)動(dòng)原則是保持所有計(jì)算機(jī)資源盡可能多地被使用,中心沖突是:CPU中的操作是納秒級(jí)(一個(gè)操作10—50ns)訪問主存是是微秒級(jí)(0.1~0.2微秒,100—200ns)外部數(shù)據(jù)操作是毫秒級(jí)(15—30毫秒)這樣在內(nèi)外速度間相差1000,000倍。為了平衡速度差異,各種存儲(chǔ)管理機(jī)制是必須的。1、在最簡(jiǎn)單的設(shè)計(jì)(如低價(jià)PC)中,只有簡(jiǎn)單的存儲(chǔ)管理設(shè)施。程序和數(shù)據(jù)執(zhí)行時(shí)駐留內(nèi)存,在一個(gè)時(shí)刻只有一個(gè)程序準(zhǔn)備執(zhí)行。雖然CPU必須等待數(shù)據(jù),它也是價(jià)格有效的,因?yàn)椴恍杓尤敫郊佑布?、為加速外部數(shù)據(jù)訪問和CPU間的平衡,操作系統(tǒng)常使用多道程序設(shè)計(jì),當(dāng)?shù)却撩肴プx數(shù)據(jù)時(shí),計(jì)算機(jī)將執(zhí)行另一個(gè)程序。為了保證多個(gè)程序同時(shí)駐留主存,通常有硬件設(shè)施負(fù)責(zé)頁面查找或動(dòng)態(tài)程序重定位,頁面查找通過預(yù)測(cè)進(jìn)行,預(yù)測(cè)在最近將來最可能使用的頁面,將其放入主存。如在主存,則程序執(zhí)行,否則,出現(xiàn)頁間錯(cuò),操作系統(tǒng)將從外存中讀取所需頁,同時(shí)執(zhí)行別的程序。3、為加速主存和CPU間的不平衡,常使用Cache存儲(chǔ)器(小的高速數(shù)據(jù)存儲(chǔ))。Cache可允許計(jì)算機(jī)操作,好象主存具有和CPU相同速度,通常是1K到256K字節(jié),32K的Cache,可達(dá)到95%的選中率。操作環(huán)境計(jì)算機(jī)的操作環(huán)境通常包括外圍存儲(chǔ)器和I/O設(shè)備,這些設(shè)備表示了計(jì)算機(jī)的外部世界,和計(jì)算機(jī)的任何通訊必須通過它們。操作環(huán)境中通常有硬件的不同,如:高速存儲(chǔ)(擴(kuò)展內(nèi)存),中速存儲(chǔ)(磁盤),低速存儲(chǔ)(磁帶)和I/O設(shè)備。各種計(jì)算機(jī)體系結(jié)構(gòu)計(jì)算機(jī)硬件的組織有多種形式,上面的討論是基于VonNeumann體系結(jié)構(gòu)。VonNeumann體系結(jié)構(gòu):命名來源于數(shù)學(xué)家JohnvonNeumann,他在40年代開發(fā)這個(gè)初始設(shè)計(jì),作為ENIAC計(jì)算機(jī)設(shè)計(jì)的一部分,現(xiàn)今計(jì)算機(jī)仍屬此體系結(jié)構(gòu)。多處理器:VonNeumann設(shè)計(jì)的最大問題是外部數(shù)據(jù)設(shè)備的慢速和CPU寄存器高速間的矛盾。解決方案之一是在指定系統(tǒng)中使用多個(gè)CPU,這樣的多處理系統(tǒng)已使用了30多年,通過幾個(gè)相對(duì)不昂貴的CPU的粘合,再加上單一的主存、磁盤、磁帶等,得到一個(gè)高效系統(tǒng)。操作系統(tǒng)將不同程序運(yùn)行于不同CPU上,從而整個(gè)性能得到改善。語言和系統(tǒng)設(shè)計(jì)正在演化,使得能夠書寫程序在多個(gè)計(jì)算機(jī)上執(zhí)行并相互通訊。計(jì)算機(jī)狀態(tài)對(duì)計(jì)算機(jī)靜態(tài)組織的了解只是一個(gè)部分,全面了解則涉及計(jì)算機(jī)在程序執(zhí)行時(shí)的動(dòng)態(tài)操作,包括:執(zhí)行開始時(shí)各存儲(chǔ)部件的內(nèi)容,操作執(zhí)行順序。執(zhí)行進(jìn)行時(shí)如何修改各種數(shù)據(jù)部件,程序執(zhí)行的最后結(jié)果等。通常對(duì)計(jì)算機(jī)動(dòng)態(tài)行為的觀察是通過計(jì)算機(jī)狀態(tài)(執(zhí)行過程中某點(diǎn)主存、寄存器和外存的內(nèi)容決定)的概念。程序的執(zhí)行體現(xiàn)為一系列狀態(tài)的變化初始狀態(tài)通過一系列狀態(tài)變遷(從當(dāng)前狀態(tài)通過存貯內(nèi)容的修改進(jìn)入新的狀態(tài)),得到最終狀態(tài)。如果我們可以預(yù)測(cè)狀態(tài)變遷序列,則可以聲稱了解了計(jì)算機(jī)的動(dòng)態(tài)行為。固件計(jì)算機(jī)如前定義,計(jì)算機(jī)=算法集+數(shù)據(jù)結(jié)構(gòu)集 可執(zhí)行程序表示為計(jì)算機(jī)的機(jī)器語言程序通常認(rèn)為計(jì)算機(jī)操作在相當(dāng)?shù)图?jí)的機(jī)器語言之上,具有簡(jiǎn)單的指令格式。然而,機(jī)器語言并不一定限制到低級(jí)??梢赃x擇任何程序設(shè)計(jì)語言,精確地刻劃數(shù)據(jù)結(jié)構(gòu)集和定義程序執(zhí)行規(guī)則的算法,這樣該計(jì)算機(jī)的“機(jī)器語言”就是該高級(jí)語言。每個(gè)程序定義了計(jì)算機(jī)的初態(tài),程序執(zhí)行的規(guī)則定義了程序執(zhí)行過程中狀態(tài)的變遷序列,程序執(zhí)行結(jié)果由程序執(zhí)行完成后計(jì)算機(jī)的終態(tài)決定。給定一個(gè)精確的計(jì)算機(jī)定義,總是可能將其用硬件實(shí)現(xiàn),從而可使計(jì)算機(jī)的機(jī)器語言為C、Ada、或其他高級(jí)語言。如此考慮的一個(gè)重要的基本原則是:任何精確定義的算法或數(shù)據(jù)結(jié)構(gòu)可以用硬件實(shí)現(xiàn)。計(jì)算機(jī)簡(jiǎn)單地是算法和數(shù)據(jù)結(jié)構(gòu)的集合,我們可以假定其硬件實(shí)現(xiàn)是可能的,不管其復(fù)雜度和相應(yīng)的機(jī)器語言。實(shí)際的計(jì)算機(jī)通常有相當(dāng)?shù)图?jí)的機(jī)器語言。高級(jí)語言作為機(jī)器語言會(huì)使機(jī)器非常復(fù)雜,具應(yīng)用靈活性較差。一個(gè)具有低級(jí)通用指令集和簡(jiǎn)單的、無結(jié)構(gòu)的主存和寄存器的計(jì)算機(jī)可以被編程為相當(dāng)廣范圍的高效計(jì)算機(jī)。一個(gè)常用的選擇(相對(duì)于計(jì)算機(jī)的嚴(yán)格硬件實(shí)現(xiàn))是固件計(jì)算機(jī),由運(yùn)行在特殊的微可偏程硬件計(jì)算機(jī)上運(yùn)行的微程序來仿真。這種計(jì)算機(jī)的機(jī)器語言是絕對(duì)低級(jí)的微指令集,用微指令集可編碼得到微程序,微程序?qū)⒎抡嫠M挠?jì)算機(jī)的操作,并定義了解釋周期和各種基本操作。通常微程序本身駐留在特殊的只讀存儲(chǔ)器中,由宿主機(jī)硬件高速執(zhí)行,這種計(jì)算機(jī)在執(zhí)行速度上和硬件直接實(shí)現(xiàn)計(jì)算機(jī)無太大差別。計(jì)算機(jī)的微程序仿真有時(shí)可稱為emulation(仿真),該計(jì)算機(jī)稱為虛擬機(jī),因?yàn)闄C(jī)器本身并不存在。翻譯器和軟件仿真計(jì)算機(jī)理論上,有可能直接構(gòu)造硬件或固件計(jì)算機(jī),運(yùn)行任何特殊的程序設(shè)計(jì)語言,但構(gòu)造這樣的計(jì)算機(jī)并不經(jīng)濟(jì)?,F(xiàn)實(shí)的考慮是實(shí)際計(jì)算機(jī)采用低級(jí)機(jī)器語言(基于速度、靈活性和價(jià)格考慮),編程仍以高級(jí)語言進(jìn)行。語言實(shí)現(xiàn)者面臨的任務(wù)是如何使高級(jí)語言程序執(zhí)行在實(shí)際計(jì)算機(jī)上,不管其機(jī)器語言。這個(gè)實(shí)現(xiàn)問題有兩個(gè)基本方案。1、翻譯(編譯)高級(jí)語言程序→翻譯器→等價(jià)的機(jī)器語言程序→硬件直接執(zhí)行源語言→目標(biāo)語言幾種特殊類型的翻譯器:A、匯編器目標(biāo)語言:實(shí)際計(jì)算機(jī)的機(jī)器語言源語言:匯編語言,機(jī)器語言的符號(hào)表示大多數(shù)指令是一對(duì)一的翻譯B、編譯器目標(biāo)語言:匯編和機(jī)器語言源語言:高級(jí)語言C、裝配器或連接編輯器(loader/linkeditor)目標(biāo)語言:實(shí)際的機(jī)器代碼源語言:幾乎相同于機(jī)器代碼,通常包含可重定位的機(jī)器語言程序和數(shù)據(jù)表(刻劃可重定位代碼為變成真正可執(zhí)行所必須修改的地方)D、預(yù)處理器或宏處理器源語言:某種高級(jí)語言的擴(kuò)展形式目標(biāo)語言:同樣語言的標(biāo)準(zhǔn)形式。通常進(jìn)行宏替換。高級(jí)源語言到可執(zhí)行機(jī)器語言的翻譯通常涉及多個(gè)翻譯步驟,有時(shí),編譯本本身也涉及多遍(多步),如:先產(chǎn)生某種中間形式。2、軟件仿真(軟件解釋)我們可以通過運(yùn)行在另一臺(tái)宿主機(jī)上的程序仿真一臺(tái)計(jì)算機(jī),其機(jī)器語言為高級(jí)語言。用宿主機(jī)的機(jī)器語言構(gòu)造一個(gè)程序集(表達(dá)高級(jí)語言執(zhí)行必需的算法和數(shù)據(jù)結(jié)構(gòu)),即用軟件構(gòu)造運(yùn)行于宿主機(jī)上的高級(jí)語言計(jì)算機(jī),稱為高級(jí)語言計(jì)算機(jī)在宿主機(jī)上的軟件仿真(或軟件解釋)。仿真計(jì)算機(jī)接受高級(jí)語言程序作為輸入,主仿真器程序完成解釋算法(解碼并執(zhí)行語言),最后從程序產(chǎn)生輸出。軟件仿真和翻譯的不同:均以高級(jí)語言程序?yàn)檩斎耄?,翻譯為目標(biāo)碼后再運(yùn)行于實(shí)際計(jì)算機(jī)上仿真計(jì)算機(jī)直接執(zhí)行輸入程序翻譯器以物理輸入順序處理程序語句,每個(gè)語句只處理一次。仿真器以邏輯控制流處理程序,可能重復(fù)處理某些語句而完全忽略其他語句。純粹的翻譯和純粹的仿真形成兩個(gè)極端全翻譯是很少的,除了輸入語言和輸出語言非常相似,如匯編語言。全仿真也非常少,除了操作系統(tǒng)控制語言或交互式語言情形。通常語言實(shí)現(xiàn)是二者的結(jié)合。如圖所示。翻譯和仿真各有不同優(yōu)點(diǎn)有的程序結(jié)構(gòu)最好翻譯成更簡(jiǎn)單的形式,——如循環(huán)中語句多次執(zhí)行,翻譯可省去解碼時(shí)間。有的方面最好保持原有形式,在執(zhí)行時(shí)根據(jù)需要處理。翻譯的主要缺點(diǎn)是失去了關(guān)于程序的一些信息。單個(gè)的高級(jí)語言語句比單條機(jī)器語言指令含有更多信息。仿真的優(yōu)缺點(diǎn)基本正好相反。不需要太多的空間來存儲(chǔ)代碼序列的多份拷貝。但解碼代價(jià)高。通常,如源語言結(jié)構(gòu)在目標(biāo)語言中有直接表示,則代碼擴(kuò)展不太嚴(yán)重,可采用翻譯。其他情形,可采用仿真。是否程序執(zhí)行時(shí)的基本表示為實(shí)際機(jī)器的機(jī)器語言,形成了語言劃分的基礎(chǔ)。1、編譯型語言。如:C、C++、Fortran、Ada等源語言翻成機(jī)器碼,仿真僅限于一些運(yùn)行支持例程(用于仿真源語言中和機(jī)器語言沒有緊密類似的基本操作)。通過硬件解釋器,可實(shí)現(xiàn)更快的程序執(zhí)行。當(dāng)然,也可能有的部分仍采用軟件仿真,如數(shù)據(jù)控制結(jié)構(gòu)和存儲(chǔ)管理。2、解釋型語言。如:LISP、ML、Prolog、Smalltalk等翻譯器不是產(chǎn)生機(jī)器代碼,而是產(chǎn)生某種中間形式,比源語言更易執(zhí)行。然后使用軟件解釋器對(duì)中間代碼進(jìn)行執(zhí)行。通常執(zhí)行慢,也需要對(duì)基本操作、存儲(chǔ)管理和其他語言特性的仿真,這類語言翻譯器很簡(jiǎn)單,更多的復(fù)雜性在軟件仿真。2.2虛擬計(jì)算機(jī)和綁定時(shí)間計(jì)算機(jī)的構(gòu)造方式1、通過硬件實(shí)現(xiàn),直接使用物理設(shè)備2、固件實(shí)現(xiàn),在合適的硬件計(jì)算機(jī)上使用微程序設(shè)計(jì)3、軟件仿真,在宿主機(jī)上用某種語言實(shí)現(xiàn)4、上述技術(shù)的組合,各自選擇合適的實(shí)現(xiàn)方式當(dāng)一個(gè)程序設(shè)計(jì)語言被實(shí)現(xiàn),程序執(zhí)行時(shí)使用的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)和算法定義了一個(gè)計(jì)算機(jī)。類似計(jì)算機(jī)的固件實(shí)現(xiàn),我們稱其為由語言實(shí)現(xiàn)定義的虛擬計(jì)算機(jī)。該虛擬機(jī)的機(jī)器語言是該語言的翻譯器產(chǎn)生的可執(zhí)行程序(形式:對(duì)編譯是實(shí)際的機(jī)器碼形式;對(duì)解釋是某種任意結(jié)構(gòu));其數(shù)據(jù)結(jié)構(gòu)是程序運(yùn)行時(shí)使用的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu);基本操作是那些運(yùn)行時(shí)實(shí)際可執(zhí)行的;順序控制、數(shù)據(jù)控制和存貯管理結(jié)構(gòu)也是那些運(yùn)行時(shí)使用的,不管其是用軟件、硬件或微程序表示。語法和語義語法:程序看起來象什么。語法規(guī)則規(guī)定了如何書寫語句、聲明和其他語言結(jié)構(gòu)。語義:對(duì)各種語法結(jié)構(gòu)賦予的含義。在語言手冊(cè)和其他語言描述中,通常圍繞語言中的各種語法結(jié)構(gòu)組織語言描述。典型地,給出語法(對(duì)一個(gè)語言結(jié)構(gòu),如語句、聲明),然后給出語義,BNF是主要的語法記號(hào)體系。本書的組織方式略有不同,圍繞和虛擬機(jī)相關(guān)聯(lián)的結(jié)構(gòu)來組織,這種風(fēng)格用用在虛擬機(jī)中的數(shù)據(jù)結(jié)構(gòu)和操作來描述語言的語義。有時(shí),這些數(shù)據(jù)結(jié)構(gòu)和操作是直接和語言語法中的特殊結(jié)構(gòu)相關(guān)聯(lián)的,而通常,這種聯(lián)系并不是太直接。如:Pascal虛擬機(jī)中可能在程序執(zhí)行中使用向量,而向量結(jié)構(gòu)是在聲明中直接給出的;然而,虛擬機(jī)也可能有其它不能在程序中直接可見數(shù)據(jù)結(jié)構(gòu),如子程序“活躍記錄”的中心棧。這些“隱藏”的虛擬機(jī)結(jié)構(gòu)和那些直接對(duì)應(yīng)程序員寫在程序中的某些東西的“可見”結(jié)構(gòu)一樣,對(duì)更好地了解語言同等重要。因此,這里的討論是圍繞在虛擬機(jī)中看到的結(jié)構(gòu),而不僅僅是語法元素來進(jìn)行的。一個(gè)特殊的虛擬機(jī)元素可能在程序中沒有語法表示;可被單個(gè)語法元素直接表示;可被幾個(gè)分開的語法元素表示(由翻譯器合起來產(chǎn)生一個(gè)虛擬機(jī)元素)。虛擬機(jī)和語言實(shí)現(xiàn)如果語言用它們的虛擬機(jī)來定義,使得每個(gè)語言和一個(gè)共同理解的虛擬機(jī)相關(guān)聯(lián),則使用虛擬機(jī)來描述語言的語義是直接的。然而,語言定義通常是個(gè)體地對(duì)每個(gè)語法結(jié)構(gòu)給出語義,語言定義僅隱含地刻劃了一個(gè)虛擬機(jī)。語言在不同計(jì)算機(jī)上的每次實(shí)現(xiàn),實(shí)現(xiàn)者都會(huì)從語言定義中看到略微(或非常)不同的虛擬機(jī)。同一語言的兩個(gè)不同實(shí)現(xiàn),可能使用不同的數(shù)據(jù)結(jié)構(gòu)和操作集合(特別是在語法中隱藏的部分)。每個(gè)實(shí)現(xiàn)者有很大自由度確定自己的虛擬機(jī)結(jié)構(gòu),這些是他的語言實(shí)現(xiàn)的基礎(chǔ)。當(dāng)語言在一特定計(jì)算機(jī)上實(shí)現(xiàn)時(shí),實(shí)現(xiàn)者首先確定表示語言的語義解釋的虛擬機(jī),然后通過基本計(jì)算機(jī)提供的軟、硬件元素來構(gòu)造虛擬機(jī)。語言實(shí)現(xiàn)的組織和結(jié)構(gòu)由實(shí)現(xiàn)者的許多細(xì)微決策確定,需考慮計(jì)算機(jī)各種軟、硬件設(shè)施和使用代價(jià)。例:虛擬機(jī)如有整數(shù)加和平方根操作,則整數(shù)加可直接用硬件提供的整數(shù)加來實(shí)現(xiàn),平方根可用軟件仿真,使用一個(gè)子程序。整數(shù)變量x可直接用存儲(chǔ)位置實(shí)現(xiàn),該位置存放x的值;也可帶有標(biāo)記,由標(biāo)記和指針(擴(kuò)向存取x值的位置)構(gòu)成)。實(shí)現(xiàn)者還需確定什么通過翻譯處理?什么在執(zhí)行中解決?通常,如果在程序翻譯并建立運(yùn)行時(shí)結(jié)構(gòu)的過程中,采用了某些動(dòng)作,則可以使用一個(gè)特定的表示虛擬機(jī)數(shù)據(jù)結(jié)構(gòu)或操作的方式。如果實(shí)現(xiàn)者略去這些動(dòng)作而簡(jiǎn)化翻譯器,則不同的運(yùn)行時(shí)表示可能是必須的。三個(gè)因素導(dǎo)致相同語言的不同實(shí)現(xiàn)1、實(shí)現(xiàn)者虛擬機(jī)概念的不同(隱含在語言定義中)2、宿主機(jī)提供的設(shè)施的不同3、實(shí)現(xiàn)者如何用宿主機(jī)提供的設(shè)施仿真虛擬機(jī)元素的選擇和如何去構(gòu)造翻譯器支持這些虛擬機(jī)選擇的不同。計(jì)算機(jī)層次程序員以某種高級(jí)語言編程使用的虛擬機(jī)事實(shí)上形成了一個(gè)虛擬計(jì)算機(jī)層次。底層:實(shí)際的硬件計(jì)算機(jī)。通常程序員很少直接使用這個(gè)計(jì)算機(jī),一般地,硬件機(jī)被一個(gè)或多個(gè)軟件層(或微程序)變換成一個(gè)虛擬機(jī),它可能和硬件機(jī)有很大不同。二層:由稱為操作系統(tǒng)的例程集合定義的虛擬機(jī)(如微程序形成第二層,那么這也可稱為第三層)。典型地,OS提供了一系列新的操作和數(shù)據(jù)結(jié)構(gòu)的仿真(這不是由硬件直接提供的)。如:外部文件結(jié)構(gòu)或文件管理原語。OS也從OS定義的虛擬機(jī)上刪去了某些硬件原語,使得它們不能由操作系統(tǒng)用戶直接訪問。如:關(guān)于I/O、錯(cuò)誤監(jiān)測(cè)、多道程序設(shè)計(jì)和多道處理的硬件原語。OS定義的虛擬機(jī)通常就是高級(jí)語言實(shí)現(xiàn)者使用的機(jī)器。三層:語言實(shí)現(xiàn)者提供了一個(gè)新的軟件層,運(yùn)行于OS虛擬機(jī)上,仿真高級(jí)語言虛擬機(jī)的操作;也提供了翻譯器:將用戶程序翻譯成語言定義虛擬機(jī)的機(jī)器語言。四層:高級(jí)語言定義的虛擬機(jī)并不是層次的最后一層。實(shí)際上,程序員編制的程序形成了新的一層虛擬機(jī)。那么,什么是這個(gè)程序員定義的軟件仿真虛擬機(jī)的機(jī)器語言呢?(這個(gè)程序的輸入數(shù)據(jù)將由這個(gè)機(jī)器語言構(gòu)成或?qū)懗桑R坏┏绦騿T建立了一個(gè)程序,必須有一個(gè)“程序”在該程序定義的虛擬機(jī)上運(yùn)行,這個(gè)“程序”通過選擇合適的輸入數(shù)據(jù)集合而寫成。這個(gè)概念之所以難于理解,是因?yàn)閷?duì)很多程序而言,輸入數(shù)據(jù)非常簡(jiǎn)單,僅僅可稱為最平凡的程序設(shè)計(jì)語言。如:排序程序的機(jī)器語言可認(rèn)為是整數(shù)集,即以一定格式構(gòu)成的整數(shù)表為程序。然而,明顯的是:每一個(gè)在我們上述層次上構(gòu)造較低層次的程序員必須記住這個(gè)觀點(diǎn),因?yàn)樵诿恳粚訕?gòu)造的程序和數(shù)據(jù)結(jié)構(gòu)事實(shí)上表示了下一層程序員編程使用的虛擬機(jī)的仿真。上面討論中一個(gè)隱含的中心概念是:程序和數(shù)據(jù)是等價(jià)的。我們習(xí)慣于在編程中將對(duì)象區(qū)分為“程序”和“數(shù)據(jù)”,這通常是一種有用的直覺的區(qū)分,但如上所討論,這種區(qū)分是一種表面性的。在某語境中的程序可能在另外的語境中變成數(shù)據(jù)。如:我們寫Pascal程序,但對(duì)Pascal編譯器來說,該程序是被輸入處理的數(shù)據(jù),其輸出是機(jī)器語言程序。如果觀察程序的執(zhí)行,你會(huì)發(fā)現(xiàn)它又是執(zhí)行計(jì)算機(jī)中解釋器的數(shù)據(jù)。我們總是將某程序的輸入等價(jià)為將被處理的數(shù)據(jù)或?qū)⒈粓?zhí)行的程序。進(jìn)一步考慮這個(gè)問題(等價(jià)性)。如:在C、Fortran語言中,表示可執(zhí)行程序的存儲(chǔ)空間通常是和其數(shù)據(jù)空間分開的。但在LISP和Prolog中,則沒有不同,程序和數(shù)據(jù)是混合的,只有執(zhí)行過程可將其區(qū)分開來。綁定和綁定時(shí)間不嚴(yán)格地說,一個(gè)程序元素到某特定特征或性質(zhì)的綁定,僅是從一個(gè)可能性質(zhì)的集合中性質(zhì)的簡(jiǎn)單選擇。決定這個(gè)選擇的程序陳述或處理的時(shí)間稱為性質(zhì)對(duì)元素的綁定時(shí)間。語言中有不同的綁定和不同的綁定時(shí)間。綁定時(shí)間的類型對(duì)綁定類型沒有簡(jiǎn)單的分類,但可區(qū)分出一些主要的綁定時(shí)間。這里,我們基于一個(gè)基本假設(shè):程序的處理總是先翻譯,后執(zhí)行。1、執(zhí)行時(shí)(運(yùn)行時(shí))很多綁定是在程序執(zhí)行過程中完成的。如:變量到值的綁定,變量到特定存儲(chǔ)位置的綁定(在很多語言中)。進(jìn)一步可分為:a.進(jìn)入子程序或塊時(shí)。大多數(shù)語言中,重要的綁定只限制發(fā)生在執(zhí)行中進(jìn)入子程序或塊時(shí),如C、Fortran中形參到實(shí)參、以及
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)生課間健身課件視頻
- 中級(jí)消防監(jiān)控室培訓(xùn)課件
- 三年級(jí)科學(xué)上冊(cè)第二單元人與植物教材說明首師大版
- 2022年東北電力大學(xué)自考英語(二)練習(xí)題(附答案解析)
- 教學(xué)課件制作培訓(xùn)總結(jié)
- 安全鏈控制系統(tǒng)課件
- 指南培訓(xùn)課件
- 上半年大班第二學(xué)期班務(wù)參考計(jì)劃
- 人教部編版二年級(jí)下冊(cè)所有必須背誦的古詩(shī)和課文
- 大班交通安全日課件
- 《中國(guó)缺血性卒中和短暫性腦缺血發(fā)作二級(jí)預(yù)防指南2022》解讀
- 廣東省大灣區(qū)2023-2024學(xué)年高一上學(xué)期期末生物試題【含答案解析】
- 飛機(jī)電氣系統(tǒng)電子緒論課件
- 電纜及電纜橋架安裝施工方案
- 泌尿護(hù)士述職報(bào)告
- 汽車OTS工程樣件認(rèn)可流程課件
- 明細(xì)賬(三欄式)模板
- 正大天虹方矩管鍍鋅方矩管材質(zhì)書
- 2024年山東魯商集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 審計(jì)控制活動(dòng)方案
- 妊娠劇吐伴酮癥護(hù)理查房課件
評(píng)論
0/150
提交評(píng)論