程序设计语言诞生——程序设计语言的发展历史
程序設計語言誕生
??????? 1946馮·諾依曼提出了馮·諾依曼原理:
??????? CPU逐條從存儲器中取出指令執行,按指令取出存儲的數據經運算后送回。
?????? 數據和指令(存儲地址碼、操作碼)都統一按二進制編碼輸入。數據值的改變是重新賦值,即強行改變數據存儲槽的內容,所以說它是命令式的(imperative)。
??????? 第一臺按馮·諾依曼原理制成的通用電動計算機是1951年美國蘭德公司的UNIVAC-1。人們就開始了機器語言的程序設計: 指定數據區編制一條條指令。由于任何人也無法記住并自如地編排二進制碼(只有1和0的數字串),則用8、16進制數寫程序,輸入后是二進制的。
?????? 單調的數字極易出錯,人們不堪其苦,想出了將操作碼改作助記的字符,這就是匯編語言,匯編語言使編程方便得多。但匯編碼編的程序必須要通過匯編程序翻譯為機器碼才能運行。盡管匯編碼程序和機器碼程序基本一一對應,但匯編語言出現說明兩件事,一是開始了源代碼——自動翻譯器——目標代碼的使用方式,一是計算機語言開始向宜人方向的進程。
?
50年代高級語言出現
?
????? 1954年Backus根據1951年Rutishauser提出的用編譯程序實現高級語言的思想,研究出第一個脫離機器的高級語言FORTRAN I。其編譯程序用18個人一年完成(用匯編語言寫)。到1957年的FORTRAN Ⅱ,它就比較完善了。它有變量、表達式、賦值、調用、輸入/輸出等概念; 有條件比較、順序、選擇、循環控制概念; 有滿足科技計算的整、實數、復數和數組,以及為保證運算精度的雙精度等數據類型。表達式采用代數模型。
?????? FORTRAN的出現使當時科技計算為主的軟件生產提高了一個數量級,奠定了高級語言的地位。FORTRAN也成為計算機語言界的英語式世界語。
?????? 1958年歐洲計算機科學家的一個組織GAMM和美國計算機協會ACM的專家在蘇黎士會晤起草了一個“國際代數語言IAL”的報告,隨后這個委員會研制了ALGOL 58得到廣泛支持和響應。1960年歐美科學家再度在巴黎會晤對ALGOL 58進行了補充,這就是眾所周知的ALGOL 60。1962年羅馬會議上對ALGOL 60再次修訂并發表了對“算法語言ALGOL 60修訂的報告”。由于該報告對ALGOL 60定義采用相對嚴格的形式語法。ALGOL語言為廣大計算機工作者接受,特別在歐洲。在美國,IBM公司當時經營世界計算機總額75%的銷售量,一心要推行FORTRAN,不支持ALOGL,以致ALGOL 60始終沒有大發展起來。盡管如此,ALGOL 60還是在程序設計語言發展史上是一個重要的里程碑。
?????? 1959年為了開發在商用事務處理方面的程序設計語言,美國各廠商和機構組成一個委員會。在美國國防部支持下于1960年4月發表了數據處理的COBOL 60語言。開發者的目標要盡可能英語化,使沒有計算機知識的老板們也能看得懂。所以像算術運算符+、*都用英文ADD、MULTIPLY。COBOL 60的控制結構比FORTRAN還要簡單,但數據描述大大擴展了,除了表(相當于數組)還有紀錄、文件等概念。COBOL 60雖然繁瑣(即使一個空程序也要寫150個符號),由于其優異的輸入/出功能,報表、分類歸并的方便快速,使它存活并牢固占領商用事務軟件市場,直到今天在英語國家的商業領域還有一定的地位。
?????? 50年代計算機應用在科學計算和事務處理方面有了FORTRAN、COBOL,因而應用得到迅速發展。工程控制方面剛剛起步,仍是匯編語言的市場。1957年,美國MIT科學家McCarthy提出LISP,并把它用于數學定理驗證等較為智能性的程序上。但LISP在當時只是科學家的語言,沒有進入軟件市場。
?
60年代奠基性研究
?
??????? 60年代計算機硬件轉入集成電路成本大幅度下降。應用普及的障礙是語言及軟件。這就促使對編譯技術的研究。編譯技術的完善表現在大型語言、多種流派語言的出現。
?????? 1962年哈佛大學的K. Iverson提出APL語言。它是面向數學(矩陣)的語言。它定義了一套古怪的符號,聯機使用非常簡潔,深得數學家喜愛。它提出動態數據(向量)的概念。
?????? 1962年AT&T公司貝爾試驗室R.Griswold提出正文處理的SNOBOL,可以處理代數公式、語法、正文、自然語言。以后發展為SNOBOL 3,SNOBOL 4。80年代后裔叫ICON,用于測試。
?????? 1963-64年美國IBM公司組織了一個委員會試圖研制一個功能齊全的大型語言。希望它兼有FORTRAN和COBOL的功能,有類似ALGOL 60完善的定義及控制結構,名字就叫程序設計語言PL/1。程序員可控制程序發生異常情況的異常處理、并行處理、中斷處理、存儲控制等。所以它的外號叫“大型公共汽車”。它是大型通用語言的第一次嘗試,提出了許多有益的新概念、新特征。但終因過于復雜、數據類型自動轉換太靈活、可靠性差、低效,它沒有普及起來。但IBM公司直到80年代在它的機器上還配備PL/I。
?????? 1967年為普及程序語言教育,美國達特茅斯學院的J.G. Kemeny和T.E.Kurtz研制出交互式、解釋型語言BASIC(“初學者通用符號指令碼”字頭)。由于解釋程序小(僅8K)趕上70年代微機大普及,BASIC取得眾所周知的成就。但是它的弱類型、全程量數據、無模塊,決定了它只能編制小程序。它是程序員入門的啟蒙語言。
?????? LOGO語言是美國MIT的S. Papert教授于1967年開發的小型語言。其目的是無數學基礎的青少年也能學習使用計算機,理解程序設計思想,自己編制過程或程序。但直到80年代初微機普及到家庭它才受到重視。LOGO是交互式語言,用戶編程就在終端前定義過程命令,并利用系統提供的命令構成程序。LOGO的數據是數、字、表。由于它能方便地處理符號表,可以利用人工智能成果開發情報檢索、演繹推理、自然語言會話小程序。青少年可設計各種智能游戲。屏幕上的海龜使青少年直觀地構造各種圖形。遞歸程序的表達能力使青少年可受到自動程序良好訓練。1979年MIT LOGO小組推出Apple LOGO,及TI LOGO(德州儀器公司TI 99/4A機)。這兩個版本最為普及。LOGO是青少年入門的啟蒙語言。
??????? LOGO的近于自然語言的命令及海龜、鍵盤、程序、圖形并用的使用風格,對以后的命令式語言、用戶界面語言有一定的影響。
?????? 1967年挪威計算機科學家O.J. DahI等人研制出通用模擬語言SIMULA67。它以ALGOL 60為基礎,為分層模擬離散事件提出了類(Class)的概念。類將數據和其上的操作集為一體,定義出類似類型的樣板。以實例進入運算。這是抽象數據類型及對象的先聲。
?????? 60年代軟件發展史上出了所謂的“軟件危機”。事情是由1962年美國金星探測衛星“水手二號”發射失敗引起的。經多方測試在“水手一號”發射不出錯的程序在“水手二號”出了問題。軟件無法通過測試證明它是正確的。于是,許多計算機科學家轉入對程序正確性證明的研究。這時,著名的荷蘭科學家E. Dijkstra提出的“goto語句是有害的”著名論斷,引起了一場大爭論。從程序結構角度而言,濫用goto語句會使程序無法分析、難于測試、不易修改。這時也提出了全程變量帶來的數據耦合效應、函數調用的副作用、類型隱含聲明和自動轉換所帶來的難于控制的潛伏不安全因素等等過程語言中的一些致命性弱點。60年代對大型系統軟件的需求大為增長(如編制較完善操作系統、大型軍用系統),要求使用高級語言以解決生產率之需,加上高級語言使用以來積累的經驗,加深了人們對軟件本質、程序語言的理解。人們積極研制反映新理論的語言。
?????? 1964年,ALGOL工作組成員N. Wirth改進了ALGO 60,提出結構化的語言ALGOL W。由于它結構簡潔、完美。ALGOL W成為軟件教程中示例語言。1968年,他帶著ALGOL W參加新一代ALGOL的研究委員會,即開發ALGOL 68的工作組。
?????? ALGOL 68追求的目標也是能在多個領域使用的大型通用語言。1965年以Wijngaarden為首的一批科學家開始研究新ALGOL。強調了語言設計中冗余性(少作隱含約定)、抽象性(數據抽象與控制抽象)、正交性(一個語言機制只在一處定義并與其它機制無關)。強化了類型定義和顯式轉換; 有并發、異常處理功能; 保留goto允許有限制的函數邊界效應: 過程可以作為參數傳遞; 用戶可定義較復雜數據結構、定義運算符。語法定義是半英語半形式化的。語言作成可擴充式,也就是說,有一個相對完備的小語言核心,可以不斷增加新特征以增強語言表達能力。表達式采用利于快速編譯和提高目標碼效率的逆波蘭表示法。ALGOL 68集中了當時語言和軟件技術之大成。但因學究氣太重,一般程序員難于掌握。強調語言簡單的人持有不同看法。但文本草案在Wijngaarden堅持下通過了。為此,Dijkstra等人發表了“少數人聲明”。N.Wirth帶著競爭失敗的ALGOL W回去研究以后著稱于世的Pascal。Pascal的研制者一開始就本著“簡單、有效、可靠”的原則設計語言。1971年Pascal正式問世后取得了巨大的成功。它只限于順序程序設計。是結構化程序設計教育示范語言。
?????? Pascal有完全結構化的控制結構。為了方便,除三種最基本的控制結構(順序、if-then=else、while-do)外,又擴充了二種(do-until、for-do)。程序模塊有子程序(過程和函數),分程序,可任意嵌套,因而有全程量、局部量、作用域與可見性概念。保留goto語句但不推薦使用。
????? Pascal的數據類型大大豐富了,有整、實、字符、布爾等純量類型: 有數組、記錄、變體記錄、串等結構類型; 增加了集合、枚舉、指針類型。為用戶描述復雜的數據結構乃至動態數據提供了方便。所有進入程序的數據都要顯式聲明、顯式類型轉換。并加強了編譯時刻類型檢查、函數的顯式的值參和變量參數定義便于限制邊界效應。在人們為擺脫軟件危機而對結構化程序設計寄于極大希望的時代,Pascal得到很快的普及。它也是對以后程序語言有較大影響的里程碑式的語言。
?
70年代完善的軟件工程工具
?
??????? 硬件繼續降價,功能、可靠性反而進一步提高。人們對軟件的要求,無論是規模、功能、還是開發效率都大為提高了。僅管Pascal得到普遍好評,但它只能描述順序的小程序,功能太弱。在大型、并發、實時程序設計中無能為力。程序越大越要求高的抽象力、安全性、積少成多的模塊拼合功能。為了對付日益加劇的新意義上的軟件危機。70年代語言繼續發展,在總結PL/1和ALGOL 68失敗的基礎上,研制大型功能齊全的語言又一次掀起高潮。
??????? 70年代是微機大發展的時代。設計精巧的小型過程語言藉微機普及得到發展。軟件市場FORTRAN、COBOL、匯編的三分天下開始緩慢地退卻。結構化FORTRAN、COBOL力圖在新的競爭中保全自己的地位,專用語言叢生。一旦證實它的普遍性,它就變為通用語言。C就是在這種情況下成長起來的優秀語言。
??????? 硬件的完善使得過去難以實施的組合爆炸算法得以緩解。人工智能的專家系統進入實用。LISP發展為INTEL LISP和MAC LISP兩大分支,其他智能語言陸續推出。特別是Backus在1978年發表“程序設計能從馮·諾依曼風格中解放出來嗎?”一文。非過程式語言、高抽象模式語言大量涌現。
??????? 70年代繼60年代的形式語言語法研究,形式語義取得重大成果。最先是IBM維也納實驗室集合歐洲著名的計算機科學家于1972年寫出PL/1的操作語義。該語義用維也納定義語言VDL表達,長達1500頁,終因抽象層次太低,而此時(1971年)牛津大學D.Scott和C.Strachey提出了更加數學化的指稱語義學,維也納實驗室轉而研究PL/1的指稱語義描述。1973-1978年D. Bjorner和C. Jones開發了維也納開發方法VDM。所用語言是Meta IV。雖然巨大投資(3.5億)未見可見效益,IBM終止了維也納實驗室的語義學研究方向,但VDM方法及指稱語言學對計算機語言發展影響是深遠的。1973年C.Hoare和Wirth用指稱語義寫Pascal語義發現了Pascal的設計上的許多問題竟做不下去。VDM以后還用于多種語言如CHILL,Ada,指導編譯器的開發。
?????? 1971-72年,DEC公司和卡內基﹒梅隆大學的Wulf合作,開發了PDP(以后是VAX)上的系統程序設計語言Bliss。它是無類型的結構化語言,沒有goto語句。有異常處理和匯編接口,面向表達式。直到80年代末DEC公司還用它作系統設計。
????????1972年,AT&T公司貝爾實驗室Ritchie開發了C語言。C語言的原型是1969年Richard開發的系統程序設計語BCPL。K.Thompson將BCPL改造成B語言,用于重寫UNIX多用戶操作系統。在PDP-11機的UNIX第五版時用的是將B改造后的C。C擴充了類型(B是無類型的)。1973年UNIX第五版90%左右的源程序是用C寫的。它使UNIX成為世界上第一個易于移植的操作系統。UNIX以后發展成為良好的程序設計環境,反過來又促進了C的普及。
?????? C語言是個小語言,追求程序簡潔,編譯運行效率高。是一個表達能力很強的、順序的、結構化程序設計語言。它給程序員較大的自由度,下層數據轉換靈活。程序正確性完全由程序員負責。上層是結構化的控制結構,有類似Pascal的數據類型。它的分別編譯機制使它可構成大程序。輸入/出依賴UNIX,使語言簡短。語言學家極力反對的goto語句、無控制指針、函數邊界效應、類型靈活轉換、全程量這些不安全的根源C全部具備。在某種意義下C得益于靈活的指針、函數副作用和數據類型靈活的解釋。易讀性又不好,偏偏程序員都喜愛它。因為它簡潔,近于硬件,代碼高效,并有大量環境工具支持。C程序寫起來又短,調試起來又快。微機上的各種移植版本的C語言,對C成為通用的程序設計語言起到了推波助瀾的作用。C語言正以席卷系統程序設計領域的勢頭發展,并向應用領域擴展。以后的發展把與它同期出現的Pascal遠遠拋在后面,成為系統軟件的主導語言。
?????? 1972年法國Marseille大學的P.Roussel研制出非過程的Prolog語言。Prolog有著完全嶄新的程序設計風格,它只需要程序員聲明“事實”“規則”。事實和規則都以一階謂詞的形式表示。Prolog規則的執行是靠該系統內部的推理機,而推理機按一定的次序執行。在這個意義上它又有點過程性。以回溯查找匹配,Prolog的數據結構類似Pascal的記錄或LISP的表。它是以子句為基礎的小語言,最初被解釋執行,編譯Prolog是很久以后的事,由于Prolog是以邏輯推理作為模型的語言,它可以直接映射客觀世界事物間邏輯關系。在人工智能研究中得到了廣泛的應用,80年代日本聲稱研制的五代機以Prolog作為主導語言并研制Prolog機。
??????? 70年代,在傳統語言中出現了以下有代表性的語言:
?????? 為了開發大型可維護程序,施樂公司1972-74年由Geschke領導研制了Mesa語言。Mesa是強類型結構化語言,有模塊(若干子程序集合)概念和抽象數據類型。支持并發程序設計,由監控器協調各模塊執行。有分別編譯,異常處理機制。保留goto語句,也可以抑制類型檢查。Mesa可配置語言編譯后的各模塊。
?????? 1974年MIT的Liskov和Zilles提出CLU語言,它突出的是數據抽象。數據抽象是70年代類型強化和抽象技術的重要成果,它允許用戶定義抽象的數據類型。這些類型的定義和它的實現可顯式地分開。定義描述了語義,實現對于使用該數據的用戶是無關緊要的,因而,利于修改。增強模塊性和獨立性,從而易于保證程序正確。數據抽象可定義更遠離機器而近于人類的數據概念。如堆棧就可定義為抽象數據類型。人們可通過壓入數據、彈出數據的操作對棧體進行操作。其外在行為就是后進先出的數據棧,而棧體可由數組、或鏈表、或記錄任一種數據結構實現。
?????? CLU的抽象數據類型稱之為簇(Cluster)。由構造算子(Constructor按簇的樣板建立運算對象(實例)。CLU無goto,無全程量概念。用戶可定義新的迭代(通過迭代算子Iterator)。
?????? 數據抽象在1975年卡內基﹒梅降大學Wulf和Shaw開發的ALPHARD語言中是數據模型FORM。ALPHARD的特點是支持程序的驗證。程序設計和驗證同時進行。
?????? 另一個支持程序驗證的語言是加州大學Poperk和加拿大的Horning于1976年到77年開發的EUCLID。為了易于驗證,無goto語句,指針僅限于集合類型,類型兼容有嚴格的定義,函數調用絕無邊界效應。編譯自動生成驗證用的斷言。EUCLID以后發展成數據流語言。
?????? 在并發程序方面,1975年丹麥學者B.Hanson開發了并發Pascal。它沒有追求大而全,只是將Pascal向并發方面作了擴充,希望用Pascal寫操作系統。有抽象數據類型的類(Class)機制。控制方面提出進程類和管程類的概念。通過init語句激活類實例,cycle語句使進程無限循環地運行。通過管程(管理資源的模塊)實現進程通訊。有較強的靜態類型檢查,可查出靜態“死鎖”。
?????? 令人不解的是正當人們對進程、管理概念充分評價時,B.Hanson本人放棄了這些概念。1981年發表了小型系統程序設計語言Edison,僅用并發語句控制并發進程的執行。Hanson極力推崇語言的簡單性,所以Edison比并發Pascal小得多,普通(不大的)微機都可以運行。但其表達能力比C差多了。沒有達到并發Pascal那樣的影響。
????? Pascal在結構化程序設計方面是一個示范性語言,在推行結構化程序設計教學上發揮了卓越的作用,但在工程實踐上暴露出設計上的許多缺點。Pascal除了無獨立模塊和分別編譯機制不能編大程序而外,原來它的強類型是有漏洞的。類型等價似乎是按名等價,實現是按結構等價。最后的結論它是“偽強類型”。數組定長對處理字符串很不方便,布爾表達式求值定義不嚴,I/O規定太死,難于寫出靈活的輸入/輸出。聲明順序過嚴,無靜態變量概念(局部量一旦所在局部塊執行完畢就消失)都給程序設計帶來不便。從小而靈活方面,它又不及C,沒有位(bit)級操作,指針操作限制過死。于是Pascal的設計者1975年又開始開發Modula語言,1977年正式發布為Modula-2。
?????? Modula-2除了改進Pascal的上述弱點而外,最重要的是有模塊結構。可分別編譯的模塊是用戶程序的資源。系統資源也以模塊形式出現。模塊封裝了數據和操作(過程),模塊定義和模塊實現顯式分開。程序員在定義模塊中通過移入,移出子句控制程序資源(類型、變量、過程、子模塊)的使用。
?????? Modula-2增加了同步進程機制以支持并發程序設計,有有限的低級設施直接和系統打交道。取消goto語句、增加case語句中otherwise機制,封裝的模塊可作抽象數據類型設計。它是用于系統設計的強類型語言。西歐的計算機科學家對Modula-2是歡迎的,但它不巧與美國開發的Ada非常近似,與Ada競爭處于非常不利的地位。盡管它的9000句編譯器具有Ada20萬句編譯器80%的功能,也沒有取得Pascal那樣的成就。
?????? 70年代中期美國軟件的最大用戶美國國防部(美國軟件市場約2/3經費直接或間接與它相關)深感軟件費用激增并開始研究原因。研究結果表明,在硬件成本降低和可靠性提高的同時,軟件費用不僅相對數,絕對數也在增加。美國軍用的大量大型、實時、嵌入式系統軟件開發方法落后、可靠性差。語言眾多(常用400-500種,加上派生方言多達1500種)造成不可移植、難于維護,為擺脫這種新的軟件危機下定決心搞統一的軍用通用語言。從1975年成立高級語言工作組開始投資五億美元,前后八年研制出Ada程序設計語言。Ada是在國際范圍內投標設計的,法國的一家軟件公司中標,J.Ichbian成為Ada發明人。多達1500名第一流軟件專家參與了開發或評審。它反映了70年代末軟件技術、軟件工程水平。為了提高軟件生產率和改善軟件可移植性,提出開發語言的同時開發支持該語言的可移植環境(APSE)。
?????? Ada是強類型結構化語言。封裝的程序包是程序資源構件。用戶只能看到程序包規格說明中顯式定義的數據(包括抽象數據類型)和操作。數據結構和操作(過程或函數)的實現在程序包體中完成。封裝支持模塊性和可維護性。規格說明和體的分離支持早期開發(可延遲決策)。分別編譯機制可組成復雜的大型軟件。
?????? Ada有并發、異常機制。可定義精確的數據(如浮點數小數點后任意多的位數)。有將數據對象、類型、過程參數化的類屬機制。有為目標機寫目標程序(機器語言的或匯編語言地)的低級設施,可對字節、字位操作。Ada的私有類型支持數據隱藏,程序包可實現數據抽象。標識符和運算符重載概念,既方便程序員又使程序好讀且安全。強調大型系統可讀性勝于可寫性,Ada程序自成清晰的文檔。
?????? Ada語言的開發過程完全按軟件工程方式進行。嚴格禁止方言。美國國防部有一個嚴格管理Ada及其環境的機構AJPO(Ada聯合規劃辦公室)負責Ada的確認、修改、維護、培訓。從業界轉向軟件工程方法開發軟件的意義上,Ada也稱之為里程碑式語言。
?????? 由于Ada過多強調安全性和易讀性,Ada編譯程序要做較多的靜態檢查,因而體積龐大(約20萬句、512KB的微機裝下了微機Ada編譯就剩不下工作空間了)。程序代碼較長,雖不像COBOL繁瑣但要比C語言程序長60%。運行效率,特別是嵌入式實時控制應用中,通過交叉編譯得到的目標機代碼一時還難滿足要求。環境工具發展緩慢,因為除軍方外民間公司更樂于開發對所有語言通用的計算機輔助軟件工程環境(CASE)。自80年代第一個語言版本,83年修改定型至今, Ada沒有達到投資者預想的成就。目前已看到Ada83只反映80年代初期的軟件工程技術。隨著軟件工程本身向集成化、可重用、面向對象方向發展,Ada已有一些不適應了。但美國軍方還在全力支持,1995年Ada完成面向對象改造推出了Ada-95。增加了標簽類型、類寬類型、抽象類型;放寬了訪問類型;使一個靜態強類型語言可以支持OO的動態束定。這種改造非常痛苦,使Ada-95語法規則增至277條,成為最龐大臃腫的語言。耐人尋味的是Ada-95很塊被ANSI和ISO 接受,它成為世界上第一個有法定標準的面向對象的語言。
?????? 70年代末到80年代初值得一提的還有FORTH語言。FORTH是典型的中級語言。它是匯編語言指令碼向用戶自定義方向的發展。也就是說,用戶可以面向一個堆棧機器模型定義操作命令——字(word)。最低層的字是指令碼,逐層向上,上層字由下層組成。因此,FORTH系統有良好的繼承性。系統提供核心字、解釋器字、編譯字和設備字。對于簡單的計算解釋器字直接執行命令(字),復雜計算可將字定義編譯成目標碼存入堆棧供以后執行。有匯編字集合以便用戶直接使用機器,要求字集合操作數值計算,引用字集合使用戶可以引用系統和用以前已定義的字。FORTH程序員首先查看系統中字的字典,以它們組合成新字,進而構成程序。FORTH程序的逆波蘭表示法便利于解釋和編譯,這對長期從事匯編編程的程序員并不生疏。FORTH把具體的機器抽象為堆棧機,既可以使程序員直接操縱機器又不涉及具體機器指令碼、操作碼、存儲安排。而且良好的繼承性使程序越編越短,在最終用戶層一兩個命令就完成了程序設計。它大受控制領域、要求單片、單板計算機(例如儀表工業)領域的程序員喜愛。
??????? FORTH是C.Moore一個人開發的語言,他于1968年在IBM 1130機器上實現第一個FORTH。他說他的語言是第四代的(Fourth-Generation)。由于1130只允許五個字符的名字才叫FORTH。1973年成立FORTH公司并把它投入航天工程應用,發展了通用商務FORTH系統。此后世界各地開始重視FORTH。1976年成立歐洲FORTH用戶小組(EFUG),1978年成立FORTH標準化國際組織,80年發布FORTH-79標準文本。與此同時美國FORTH愛好者小組FIG)也制定了標準fig FORTH。各國天文行業,儀表行業紛紛以其為行業用計算機語言。FORTH并不好讀,也不宜編大程序。但在它自己的領域簡單好用、擴充方便、編譯迅速。與傳統語言追求的目標大相徑庭。給人耳目一新。
80年代的面向對象發展
?
?????? Ada的大、功能齊全、開發耗資可以說是程序設計語言之最。但它還沒有普及就有些落伍了。可能今后不再有人再投入巨資去開發大型過程語言。
?????? 80年代繼續向軟件危機開戰,但軟件工程以陳舊技術難于作出龐雜的軟件工具。為了改善這種情況,人們乞靈于面向對象技術。程序設計語言紛紛面向對象靠攏。正如上一個10年程序設計語言結構化一樣。這是主要特點。
?????? 80年代的第二個特點是“用戶友好”的所謂第四代語言的出現。
?????? 80年代的第三個特點是各種技術相互滲透各種更高級非過程性語言出現。
????? 1972年美國施樂公司保羅·奧特研究中心的A.Kay領導的軟件概念小組為方便不同用戶處理各種信息在小機器上搞了一個Dynabook計劃。它以全部的“對象”概念建立自己的系統。1980年Smalltalk-80作為正式的發布版本。
?????? Smalltalk語言是該系統的軟件。專用的硬件機、Smalltalk環境、用戶界面、面向對象程序設計風格構成了整個系統。
???? “對象”是有自己的數據和操作的實體,各對象相對封閉。程序設計就是建立應用系統中的對象群,并使之相互發消息。接到消息的對象就在自己封閉的存儲中響應執行操作。操作的結果是改變這組對象的狀態、完成計算(發出輸出消息,對象響應后完成輸出)。
?????? 為了使各自封閉的對象數據和操作不致多次重復定義。Smalltalk有類和繼承的概念。類如同傳統語言中的類型,只有類的實例進入實際運算(叫實例對象)。類對象中的數據和操作可為它的子類繼承,它自己的數據和操作也繼承自超類。于是一個Smalltalk系統就必須有支持它的一個類庫,它象一棵大樹,所有的行之有效類都在這棵大樹的某個位置上。用戶只要選取其中某些類稍加修改變成自己問題所需要的類(子類),定出通訊協議,讓它們的實例相互通訊完成計算。無論是系統對象和用戶定義的對象都按不同的抽象層次放在統一的類庫中。例如,向編譯對象發消息并傳送用戶對象,該用戶對象(程序)就被編譯了。Smalltalk中只有不同抽象層次的對象,小到一個整數、大到一個系統都叫對象,且別無其它計算單元。面向對象程序設計的概念因此而出。
?????? Smalltalk因為它天然的封裝性體現了模塊性和數據隱藏,利于維護修改。它的繼承性實質上是軟件的重用。這對困惑于大程序難于管理的軟件工程學無疑是一條絕好出路。
?????? Smalltalk類對象概念來自SIMULA 67,響應消息的方法表達式求值類似LISP的歸約。它本身是在小機器上開發的小系統。龐大的類庫占去了很大的空間,難于編制大型程序。加上它獨特的編程風格,Smalltalk本身并未發展起來。但面向對象思想,語言和環境一致性; 交互式和極端用戶友好(用菜單和鼠標即可上機),對80年代語言和計算系統產生了巨大影響。它也可稱之里程碑式的語言。
??????? 各種過程語言,甚至匯編語言都借鑒對象思想,以求能支持面向對象程序設計。82-86年相繼出現Object Pascal、Objective-C、Objext Assembler(68000匯編程序改造)。Object、LOGO、Object FROTH它們以原有語言采納對象——消息編程模式。
?????? 另一些語言向類、對象延伸。以對象——引用編程模式編程。如85年AT&T公司推出的C++。87年Borland公司的Turbo Pascal 5.5。
?????? 傳統的人工智能語言也向面向對象上發展。施樂公司1983年在Intel LISP基礎上研制了LOOPS。是面向對象LISP美國西海岸版本。85年美國符號處理公司在MIT的LISP機上開發了Flavos,稱之為東海岸版本。Flavos有更為靈活和復雜的多繼承性。85年施樂公司又作出Common LOOPS。1988年,ANSI X3J13組將它們統一為CLOS。85年,IBM日本分公司開發了SPOOL是Prolog面向對象的擴充。86年Valcan和施樂聯合開發的并發Prolog預處理程序,也是支持面向對象的。
?????? 70年代在軟件發展史上是數據庫成熟的年代。數據庫有數據描述語言DDL數據操作語言DML。它們都是為實現某種模式數據庫的專用語言。目標簡單,在所應用的領域高效。因此,不能以通用程序設計語言代替。數據庫給用戶以界面(即查詢)語言。對于簡單程序沒有必要轉到通用語言再編程序。查詢語言進一步擴充,就形成一系列查詢命令加上約束條件控制的非過程語言。如SQL。1988年SQL成為正式ANSI/ISO標準。
?????? 80年代軟件環境大發展。操作系統原有的作業控制語言(JCL)和系統調用命令也逐步發展為該環境的統一的界面語言。如UNIX的Shell。
?????? 80年代系統軟件中開發環境的思想向各專業滲透。各專業都為本專業的最終用戶提供簡便的開發環境。即事先將程序模塊以目標碼存放計算機,用戶只需簡單的命令,甚至本專業常用的圖形就可組成應用程序。這些圖形、菜單、命令即用戶界面語言。
??????? 這些語言共同的特點是聲明性(只需指明要做的事)、非過程性、簡單、用戶友好。而應用程序的實現可由系統自己完成(低層有固定不變的計算模型,如關系運算,也可以連接備用模塊智能推理)。這就所謂的第四代語言(4GL)。
?????? 4GL并沒有為程序設計語言學帶來什么新概念和新特征。一般用傳統技術做出界面語言解釋器。要求環境有較好的工具支持(應用程序、程序庫、各種測試、調試、文檔工具)。最簡單的4GL是圖形——菜單,用戶不用擊鍵即可完成計算(用鼠標器)。
?????? 4GL是硬件高速發展和快速降價必然的結果。因為不可能在短期內培養出與硬件發展需要出匹配的那么多的程序員。但4GL不易編制開創性程序。
九十年代網絡計算語言
?????? 九十年代計算機硬件發展速度依然不減。每片芯片上晶體管數目仍然是一年半增加一倍。計算機主頻從12-25兆赫增加到500-600兆赫(每秒鐘可執行750MIPS指令),價格進一步低廉。使用方式也從多人一機的分時系統到一人一機局域網計算,到每人都成為擁有全球資源的客戶。建立在異質網上的多媒體環境已成為客戶端使用環境的主流。支持“所見即所得”的用戶界面的“語言”大量涌現。
?????? ·由于有良好環境支持,程序設計重點從算法加數據結構實現技術向規模說明描述方面轉移。規模說明語言在80年代已有研究。(META-IV,EPROL,HOPE,CLEAR、SPECINT,Z)在個別具體領域也能實用。但作為通用,哪怕是某個行業建立在域分析基礎上的規格說明語言尚未出現。
?????? ·環境智能化、規模說明語言自動生成目標碼客觀上要求加入人工智能技術。異質網環境推行后各結點上數據庫資源共享都要求各語言間不要有人為的斷層。因此,多范型語言研究會有較大發展。80年代向面向對象擴充已經出現多范型語言,如C++,Ada 95(命令式加對象式)、CLOS(函數式加對象式0。為外小型研究有TABLOG(關系式加邏輯式)、Funlog(函數式加邏輯式)值得注意的是加拿大的Nial(1983-88)和美國的G(1986)語言,它們試圖將五種范型: 命令式+對象式+邏輯式+函數式+關系式統一在一個語言之中。雖然問題重重,但可由此發現許多新概念和新特征,對于程序設計語言研究是非常有利的。
?????? ·隨著面向對象數據庫和面向對象操作系統的成熟,完全消滅“語義斷層”的數據庫程序設計語言(DBPL)和持久性程序設計語言(PPL)終將匯合并標準化。這樣,程序運行時大量文件到內存轉換則可以取消,從而增大了計算機的實崐時性,甚至取消文件概念。
?????? ·4GL有了較大發展,種類花色增多,行業標準出現。支持它們的通用程序設計語言是C、C++、Ada。
?
2010-01-20 ? ? ? ? ? ? ? ? ?
注:源自原百度博客“至美心"
總結
以上是生活随笔為你收集整理的程序设计语言诞生——程序设计语言的发展历史的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fork函数结果分析
- 下一篇: 集成电路先进制造技术进展与趋势