天天看點

附錄B 程式設計的本質附錄B 程式設計的本質程式設計的本質N小結程式設計簡史名詞紀要參考資料

附錄B 程式設計的本質

程式設計的本質

N

尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日—),生於于瑞士溫特圖爾,是瑞士計算機科學家。Pascal語言之父。

讓我們暫時撇開平台、架構、技術、設計模式、對象思想、靈活開發論等。 追問程式本質。

2.0 什麼是程式設計?

程式設計的本質是創造世界。

從本質上來說, 程式就是一系列有序執行的指令集合。 如何将指令集合組織成可靠可用可信賴的軟體(美妙的邏輯之塔), 這是個問題。

N有一句在計算機領域人盡皆知的名言:

算法+資料結構=程式(Algorithm+Data Structures=Programs)

所有程式設計語言的最終目的都是提供一種“抽象”方法。這裡的抽象,就是思維的對問題空間的映射。語言,隻是為了表達我們的思想。

每一次“抽象”都抛棄了一些非本質特征而提煉出更普适的精髓特征,因而每一次抽象都是在透過現象看本質,每一次提煉都是一次質的飛躍和升華,進而使由此得到的新理論更具普遍性與包容性。例如量子力學不僅能解釋經典力學的各種現象,還能解釋微觀世界裡特有的(不能被經典力學或經典電動力學解釋的)現象,如AB效應。

從硬體電路上的高低電平,到機器代碼的01組合,再到彙編指令的mov、add,再到,中進階語言中的for、print, 程式設計語言的從底層到高層的發展,在做一層一層抽象的,正是編譯器。

就好比是在數學中,無論多麼複雜的問題,最終都可以拆分化歸到最基本的運算和公理上一樣;對于程式設計來說,每一個程式最終都可以被分解成一個一個最基本的指令以及這些指令的組合。

人類對這些問題的分析和了解,對問題的拆分,并用算法和代碼來描述的過程,就是“程式設計”,這樣的人,我們稱之為“程式員”。

詩人用優美的意象,建構一個美的情感世界。作家用個性鮮明的人物,曲折離奇的情節,創造一個理想王國。音樂家用音符,創造一個悠遠優雅的聲音世界。數學家,通過最基本的公理推導出定理,數學規律,建構一個龐大的宇宙空間形式的邏輯世界……程式員,通過最基本的算法,資料結構,建構龐大的網際網路雲端的“虛拟世界”。是的,他們都是在創造一個世界。

從這個角度看,無論哪個學科,哪個領域,都是這樣的一個過程。是以,人類的所有知識體系、學科類别,都是相通的。畢竟,都是人類大腦思維的結果。人類的大腦就像是JVM , 計算機程式設計、數學證明、實體公式、音樂、藝術設計、詩歌小說……等等就像是java,scala,kotlin,groovy,clojure,jython……等等,通過不同的思想與語言表現出不同的形式,但是通過人類大腦(jvm)

連通。

2.1 結構化程式設計

1971年4月份的 Communications of ACM上,N發表了論文“通過逐漸求精方式開發程式’(Program Development by Stepwise Refinement),首次提出“結構化程式設計”(structure programming)的概念。

不要求一步就編制成可執行的程式,而是分若幹步進行,逐漸求精。

第一步編出的程式抽象度最高,第二步編出的程式抽象度有所降低…… 最後一步編出的程式即為可執行的程式。

用這種方法程式設計,似乎複雜,實際上優點很多,可使程式易讀、易寫、易調試、易維護、易保證其正确性及驗證其正确性。

結構化程式設計方法又稱為“自頂向下”或“逐漸求精”法,在程式設計領域引發了一場革命,成為程式開發的一個标準方法,尤其是在後來發展起來的軟體工程中獲得廣泛應用。有人評價說沃思的結構化程式設計概念“完全改變了人們對程式設計的思維方式”,這是一點也不誇張的。

從程式設計角度來說, 開發者應對的就是邏輯, 邏輯的表達、組織和維護。 邏輯是事物自此及彼的合乎事物發展規律的序列。指令是邏輯的具體實作形式。

軟體的複雜性表現在如何表達和維護互動複雜的大型邏輯上。但無論軟體發展到多麼複雜的程度, 總有一群人(我們可稱之為“計算機科學家”), 在試圖從程式的本質中探究軟體開發的基本問題, 他們試圖論證和確定程式的正确性、提煉軟體的基本屬性并進行衡量; 程式的正确性本質是邏輯學來保證的。 沒有邏輯學, 程式根本就無法立足, 更不可能有今天的大規模應用。

2.2 怎樣解決問題?

工欲善其事必先利其器

在程式設計中,我們的武器裝備通常有(不限于)如下的幾個方面:

1.開發工具,讓我們更有效率地創造邏輯、 遠離文法錯誤的困擾(IDE);

2.公共庫,将常用的通用邏輯塊封裝成可反複使用的元件, 避免不必要的重複勞動(SDK);

3.設計模式,展現的是如何可擴充地解決常見的邏輯互動問題;

4.應用架構,解決的是應用的通用邏輯流的控制的問題,讓開發者更多地聚焦具體業務邏輯上(我們本書講的Spring Boot,就是這樣的一個優秀的應用架構);

5.問題領域模組化,在具體的應用情境下按照既定總體思路去探究具體問題解決的方法。

我們在軟體工程中,通常采用的自頂向下的架構設計思想,即先着手系統架構設計,然後逐層分解,進入業務子產品,最後進入細粒度功能子產品的詳細設計開發。

而所謂自底向上,就是先從一行代碼,一個Bug,一個子產品做起,然後再做一個流程,一個業務子產品,最後建構出一個龐大的系統架構。

自頂向下與自底向上這兩個過程,不是彼此孤立的,而是互相融合的。

2.3 階層化分解與複合

我們經常說一些代碼片段是優雅的或美觀的,實際上意味着它們更容易被人類有限的思維所處理。

對于程式的複合而言,好的代碼是它的表面積要比體積增長的慢。

代碼塊的“表面積”是是我們複合代碼塊時所需要的資訊(接口API協定定義)。代碼塊的“體積”就是接口内部的實作邏輯(API背後的實作代碼)。

在面向對象程式設計中,一個理想的對象應該是隻暴露它的抽象接口(純表面, 無體積),其方法則扮演箭頭的角色。如果為了了解一個對象如何與其他對象進行複合,當你發現不得不深入挖掘對象的實作之時,此時你所用的程式設計範式的原本優勢就蕩然無存了。

2.4 面向對象程式設計(OOP)

面向對象程式設計是一種自頂向下的程式設計方法.萬事萬物都是對象,對象有其行為(方法),狀态(成員變量,屬性).

所謂“面向對象語言”,其實就是經典的“過程式語言”(比如Pascal,C),加上一點抽象能力。所謂“類”和“對象”,基本是過程式語言裡面的記錄(record,或者叫結構,structure),本質是一個“映射表”(map)(一切皆是映射)。

2.5 函數式程式設計(FP)

函數式程式設計方法通過組合和應用函數來構造邏輯系統.函數式程式設計傾向于把軟體分解為其需要執行的行為或操作,而且通常采用自底向上的方法.同時,函數式程式設計也提供了非常強大的對事物進行抽象群組合的能力.

在函數式語言裡面,函數是“一類公民”(first-class)。它們可以像1, 2, "hello",true,對象…… 之類的“值”一樣,在任意位置誕生,通過變量,參數和資料結構傳遞到其它地方,可以在任何位置被調用。

很多所謂“面向對象設計模式”(design pattern),都是因為面向對象語言沒有first-class function,是以導緻了每個函數必須被包在一個對象裡面才能傳遞到其它地方。

2.6 混合式程式設計(HP)

深刻了解了“資料流”的本質(CPU的存儲,尋址,中斷等)。不管是OOP、FP,其實本質上都是把你的“思想”放進一個“管道”,讓其流動運作起來。隻是在不同的語言範式裡,放置的形式有一點不同而已!

對程式設計各種範式運用,遊刃有餘。

庖丁釋刀對曰:“臣之所好者,道也,進乎技矣。始臣之解牛之時,所見無非牛者。三年之後,未嘗見全牛也。方今之時,臣以神遇而不以目視,官知止而神欲行。依乎天理,批大郤,導大窾,因其固然,技經肯綮之未嘗,而況大軱乎!

這裡的“牛”,可以了解為我們所說的各種程式設計思想,程式設計範式,程式設計方法,程式設計技巧等等。最後,達到“運用之妙,存乎一心”之境也。

小結

程式設計的本質就是創造世界。

程式設計簡史

1940之前

提花織布機

1801,Joseph Marie Jacquard用打孔卡為一台織布機編寫指令,在提花織布機(或稱甲卡提花織布機,Jacquard loom)上,運用打孔卡上的坑洞來代表縫紉織布機的手臂動作,以便自動化産生裝飾的圖案。Jacquard織布機是第一台可進行程式控制的織布機。用打孔卡進行程式設計的概念,直到電子計算機被發明出來之後仍然被廣泛運用。

1842,愛達·勒芙蕾絲(Ada lovelace)在1842年至1843年間花費了九個月,将意大利數學家Luigi Menabrea關于查爾斯·巴貝奇新發表機器分析機的回憶錄翻譯完成。分析機由于其設計思想過于先進,在當時根本沒有 被制造出來。(Babbage的分析機一般被認為是現代電子通用計算機的先驅)。她于那篇文章後面附加了一個用分析機計算伯努利數方法的細節,被認為是世界上第一個電腦程式。 “她的努力隻遇到了一點點小小的麻煩,那就是:實際上并沒有任何計算機能夠用來運作她的程式。後來的企業架構師們重新吸收了她的這個技能,用來學習如何更好地使用UML進行程式設計。”[8]

1890,霍列瑞斯(Herman Hollerith)在觀察列車長對乘客票根在特定位置打洞的方式後,意識到他可以把資訊編碼記載到打孔卡上,随後根據這項發現使用打孔卡來編碼并紀錄1890年的人口統計資料(這種語言是種編碼)。

1936, Alan Turing發明了世間一切程式語言的最終形态,但很快他就被英國軍情六處“請”去當007了。與通用圖靈機(Universal Turing machine)等價的語言被稱為圖靈完備的(Turing completeness),它定義了“什麼樣的語言可以被稱作是程式語言”。

1936 , Alonzo Church同時也發明了世間一切程式語言的最終形态,甚至做得更好。他發明的λ演算是當今函數式程式設計(FP)的鼻祖,對函數式程式設計有巨大的影響,特别是Lisp 語言。Church是Turing在Princeton的博士生導師,他在λ演算方面的工作先于Turing指出了不存在一個對可判定性問題的通用解法,這後來證明和Turing針對停機問題提出的圖靈機模型是等價的。即著名的“Church-Turing”論題。

1940年代

最早被确認的使用電的計算機誕生在1940年代。

程式員在有限的速度及存儲器容量限制之下,撰寫彙程式設計式。用彙編語言的這種撰寫方式需要花費大量的腦力而且很容易出錯。

康拉德·楚澤于1948年發表了他所設計的Plankalkül程式設計語言的論文。但是在他有生之年卻未能将該語言實作。(關于康拉德·楚澤的故事,可參考本書:附錄1)

在這段期間被開發出來的重要語言包括有:

1943 - Plankalkül (Konrad Zuse)
1943 - ENIAC coding system
1949 - C-10
           

1950與1960年代

在這段期間被開發出來的重要語言有:

1951 - Regional Assembly Language
1952 - Autocode
1954 - FORTRAN
1954 - IPL (LISP的先驅)
1955 - FLOW-MATIC (COBOL的先驅)
1957 - COMTRAN (COBOL的先驅)
1958 - LISP
1958 - ALGOL 58
1959 - FACT (COBOL的先驅)
1959 - COBOL
1962 - APL
1962 - Simula
1962 - SNOBOL
1963 - CPL (C的先驅)
1964 - BASIC
1964 - PL/I
1967 - BCPL (C的先驅)
           

其中有三個現代程式設計語言于1950年代被設計出來,這三者所派生的語言直到今日仍舊廣泛地被采用:

Fortran ,1954

名稱取自"FORmula TRANslator"(公式翻譯器),約翰·貝克斯(John Backus)針對彙編語言的缺點而研究開發的語言。

LISP,1958

名稱取自"LISt Processor"(枚舉處理器),約翰·麥卡錫(John McCarthy)在1958年基于λ演算所創造,采用抽象資料清單與遞歸作符号演算來衍生人工智能。LISP為函數式程式設計語言,所有運算都能以函數作用于參數的方式來實作。LISP核心的操作符隻有7個:quote、atom、eq、car、cdr、cons、cond。前三者quote、atom、eq用于符号的推斷;car、cdr、cons操縱表格;cond負責分支判斷。這種簡潔定義,非常接近圖靈機原型的純函數式語言,是現代語言完全無法比拟的。

ALGOL 60,1960

名稱取自"ALGOrithmic Language"(算法語言)。ALGOL 60是程式設計語言由技藝轉向科學的重要标志,其特點是局部性、動态性、遞歸性和嚴謹性,發明于1960年。ALGOL 60強化了當時許多關于計算的想法,并提出了兩個語言上的創新功能:

(1)嵌套區塊結構(Nested block structure):可以将有意義的代碼片段組群成一個區塊(block),而非轉成分散且特定命名的程式。

(2)詞彙範圍(lexical scoping):區塊可以有區塊外部無法通過名稱通路,屬于區塊本身的變量、程式以及函數。

另一個創新則是關于語言的描述方式:

一種名為巴科斯-諾爾範式 (BNF)的數學化精确符号被用于描述語言的文法。之後的程式設計語言幾乎全部都采用類似BNF的方式來描述程式文法中上下文無關的部分。

Pascal、Ada、Simula、C等都借鑒了ALGOL。

COBOL,1961

名稱取自"COmmon Business Oriented Language"(通用商業導向語言),由格雷斯·霍波(G.Hopper)所開發。COBOL語言以代碼極其冗長和通篇大寫字母的書寫風格而聞名。據稱用COBOL書寫的程式超過了2000億行。另有調查發現世界上目前使用的商業應用軟體之中的百分之七十是用COBOL代碼編寫的。

BASIC,1964

BASIC (初學者通用符号指令代碼,Beginners' All-purpose Symbolic Instruction Code),匈牙利人約翰·凱梅尼(John G. Kemeny)與數學教師托馬斯·卡茨(Thomas E. Kurtz)認為像FORTRAN那樣的語言都是為專業人員設計,沒有辦法普及。于是,他們在簡化FORTRAN的基礎上由共同研制出來的。1964年BASIC語言正式釋出。第一個BASIC程式在1964年5月1日早上4時,由BASIC編譯程式進行編譯後成功運作 。1975年,比爾·蓋茨把它移植到PC上。

1967-1978:确立基礎範式

在1960年代以及1970年代中,結構化程式設計的優點也帶來許多的争議,特别是在程式開發的過程中完全不使用GOTO。

1968 - Logo
1970 - Pascal
1970 - Forth
1972 - C語言
1972 - Smalltalk
1972 - Prolog
1973 - ML
1975 - Scheme
1978 - SQL (起先隻是一種查詢語言,擴充之後也具備了程式結構)
           

1960年代晚期至1970年代晚期的期間中,程式設計語言的發展也有了重大的成果。大多數現在所使用的主要語言範式都是在這段期間中發明的。

Simula,1967

第一個面向對象程式設計語言。由挪威科學家Ole-Johan Dahl和Kristen Nygaard,以Algol 60超集的方式設計開發。

Pascal,1970

Niklaus Wirth(就是那位說:“算法+資料結構=程式” 的人)創造了Pascal,一個過程式的語言。Pascal語言文法嚴謹,層次分明,程式易寫,具有很強的可讀性,是第一個結構化的程式設計語言。Pascal的名稱是為了紀念十七世紀法國著名哲學家和數學家Blaise Pascal。

C,1972

源自Ken Thompson發明的B語言,而 B語言則源自BCPL語言。1967年,劍橋大學的Martin Richards對CPL語言進行了簡化,于是産生了BCPL(Basic Combined Programming Language)語言。1970年,美國貝爾實驗室的 Ken Thompson,以BCPL語言為基礎,設計出很簡單且很接近硬體的B語言(取BCPL的首字母)。并且他用B語言寫了第一個UNIX作業系統。

1971年,Dennis M.Ritchie夥同Thompson一起,合作開發UNIX。1972年, D.M.Ritchie 在B語言的基礎上設計出C語言。Thompson和Ritchie就用C完全重寫了UNIX。在開發中,他們還考慮把UNIX移植到其他類型的計算機上使用。C語言強大的移植性(Portability)在此顯現。機器語言和彙編語言都不具有移植性,為x86開發的程式,不能在Alpha,SPARC和ARM等機器上運作。而C語言程式則可以使用在任意架構的處理器上,隻要那種架構的處理器具有對應的C語言編譯器和庫,然後将C源代碼編譯、連接配接成目标二進制檔案之後即可運作。

未來的JVM的“虛拟機”的思想,在某種程度上正是源自這裡,通過對不同平台上JVM的實作,向上封裝一層,進而使得基于JVM的程式設計語言可以更大限度的實作了跨平台(當然,對應需要實作各個平台上(比如說Windows,Linux,Mac OS)的JDK)。

Smalltalk,1975

由Alan Kay,Dan Ingalls,Ted Kaehler,Adele Goldberg等于70年代初在Xerox PARC開發的面向對象程式設計語言。

Alan Kay 總結了 Smalltalk 的五大基本特征。這是第一種成功的面向對象程式設計語言,也是Java 的基礎 語言。通過這些特征,我們可了解“純粹”的面向對象程式設計方法是什麼樣的:

(1) 所有東西都是對象。可将對象想象成一種新型變量;它儲存着資料,但可要求它對自身進行操作。理論 上講,可從要解決的問題身上提出所有概念性的元件,然後在程式中将其表達為一個對象。

(2) 程式是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什麼。為了向對象送出請求,需向那 27

個對象“發送一條消息”。更具體地講,可将消息想象為一個調用請求,它調用的是從屬于目标對象的一個 子例程或函數。

(3) 每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可制作出新型對象。所 以,盡管對象的概念非常簡單,但在程式中卻可達到任意高的複雜程度。

(4) 每個對象都有一種類型。根據文法,每個對象都是某個“類”的一個“執行個體”。其中,“類”(Class) 是“類型”(Type)的同義詞。一個類最重要的特征就是“能将什麼消息發給它?”。

(5) 同一類所有對象都能接收相同的消息。[10]

Smalltalk對其它衆多的程式設計語言的産生起到了極大的推動作用,例如:Objective-C,Actor, Java 和Ruby等。90年代的許多軟體開發思想得利于Smalltalk,例如Design Patterns, Extreme Programming(XP)和Refactoring等。

Prolog,1972

Prolog語言最早由Aix-Marseille大學的Alain Colmerauer與Phillipe Roussel、Kowalski等人于60年代末研究開發。它建立在邏輯學的理論基礎之上, 最初被運用于自然語言等研究領域。現已廣泛的應用在人工智能的研究中,可以用來建造專家系統、自然語言了解、智能知識庫等。

ML,1973

ML(Meta Language)是Robin Milner主管LCF項目時(1970),作為LCF項目的元語言(Meta Language)而設計的,這也是其名字的來曆。LCF項目是受Dana Scott給出的一組邏輯原則啟發而設立的,緻力于開發一種“可計算函數邏輯”(Logic of Computable Functions)。目标是構造一個友善實用的系統,來自動的或者半自動的證明函數程式中一些有趣的性質。今天,大多數著名的推理系統都是用ML寫的。目前ML有兩個發展分支:Standard ML和Caml。

ML使用了Hindley-Milner類型推論算法來推測大多數值的類型,而不需要四處使用注解。ML一般被歸為非純函數式程式設計語言,因為它允許副作用和指令式程式設計。這一點和純函數式程式設計語言例如Haskell很不一樣。ML特性有惰性求值的求值政策,一階類型函數, 帶有垃圾收集的自動記憶體管理, 參數多态,靜态資料類型,類型推斷,代數資料類型,模式比對和異常處理等。ML中的思想影響了衆多的語言,例如Haskell,Cyclone和Nemerle。

這些語言都各自演展出自己的家族分支,現今多數現代程式設計語言的祖先都可以追溯他們其中至少一個以上。

1980年代:增強、子產品、性能

1980年代的程式設計語言與之前相較顯得更為強大。C++合并了面向對象以及系統程式設計。美國政府标準化一種名為Ada的系統程式設計語言并提供給國防承包商使用。日本以及其他地方運用了大量的資金對采用邏輯程式設計語言結構的第五代語言進行研究。函數程式設計語言社群則把焦點轉移到标準化ML及Lisp身上。這些活動都不是在開發新的範式,而是在将上個世代發明的構想進一步發揚光大。

然而,在語言設計上有個重大的新趨勢,就是研究運用子產品或大型組織化的程式單元來進行大型系統的開發。Modula、Ada,以及ML都在1980年代發展出值得注意的子產品化系統。子產品化系統常拘泥于采用泛型程式設計結構:泛型存在(generics being)、本質(essence),參數化子產品(parameterized modules)。(參閱多态)

盡管沒有出現新的主要程式設計語言範式,許多研究人員仍就擴充之前語言的構想并将它們運用到新的内容上。舉例來說,Argus以及Emerald系統的語言配合面向對象語言運用到分布式系統上。

1980年代的程式設計語言實作情況也有所進展。計算機系統結構中RISC的進展假定硬體應當為編譯器設計,而非身為人類的彙編語言程式員。借由中央處理器速度增快的幫助,編譯技術也越來越積極,RISC的進展對進階語言編譯技術帶來不小的關注。

語言技術持續這些發展并邁入了1990年代。

1980 - Ada
1983 - C++ (加上類的C)
1984 - Common Lisp
1985 - Eiffel
1986 - Erlang
1987 - Perl
1988 - Tcl
1989 - FL (Backus)
           

C++,1983

Bjarne Stroustrup,他使用過Simula和ALGOL,接觸過C。他對Simula的類體系感受頗深,對ALGOL的結構也很有研究,深知運作效率的意義。既要程式設計簡單、正确可靠,又要運作高效、可移植。于是Bjarne Stroustrup以C為背景,以Simula思想為基礎,把他所聽說過的一切都試圖嫁接到C上,創造出了C++。它既可以進行C語言的過程化程式設計,又可以進行以抽象資料類型為特點的基于對象的程式設計,還可以進行以繼承和多态為特點的面向對象的程式設計。C++擅長面向對象程式設計的同時,還可以進行基于過程的程式設計,因而C++就适應的問題規模而論,大小由之。

1990年代:網際網路時代

1990年代未見到有什麼重大的創新,大多都是以前構想的重組或變化。這段期間主要在推動的哲學是提升程式員的生産力。

許多"快速應用程式開發" (RAD) 語言也應運而生,這些語言大多都有相應的內建開發環境、垃圾回收等機制,且大多是先前語言的派生語言。這類型的語言也大多是面向對象的程式設計語言,包含有Object Pascal、Visual Basic,以及C#。

Java,1995

1995年,網際網路的蓬勃發展給了Oak(Java之前的名字)機會。Java是一門面向對象程式設計語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以了解的多繼承、指針等概念。Java語言作為靜态面向對象程式設計語言的代表,極好地實作了面向對象理論,允許程式員以優雅的思維方式進行複雜的程式設計。

我們将在下一章中介紹Java程式設計簡史。另外,關于上面提到的“提升程式員的生産力”的哲學理念,本書介紹的SpringBoot架構,就是為了推動程式員的生産力而設計開發的。不管在程式設計語言設計領域,還是在程式設計架構的開發領域,很大一部分的目的,就是為了這一點。

1990 - Haskell
1991 - Python
1991 - Visual Basic
1993 - Ruby
1993 - Lua
1994 - CLOS (part of ANSI Common Lisp)
1995 - Java
1995 - Delphi (Object Pascal)
1995 - JavaScript
1995 - PHP
1997 - REBOL
1999 - D
           

當今的趨勢

程式設計語言持續在學術及企業兩個層面中發展進化,目前的一些趨勢包含有:

  • 在語言中增加安全性與可靠性驗證機制:額外的堆棧檢查、資訊流(information flow)控制,以及靜态線程安全。
  • 提供子產品化的替代機制:混入(mixin)、委派(delegates),以及觀點導向。
  • 元件導向(component-oriented)軟體開發。
  • 元程式設計、反射或是通路抽象文法樹(Abstract syntax tree)
  • 更重視分布式及移動式的應用。
  • 與資料庫的內建,包含XML及關系資料庫。
  • 支援使用Unicode編寫程式,是以源代碼不會受到ASCII字元集的限制,而可以使用像是非拉丁語系的腳本或延伸标點符号。
  • 圖形使用者界面所使用的XML(XUL、XAML)。

等等。

2001 - C#
2001 - Visual Basic .NET
2002 - F#
2003 - Scala
2003 - Factor
2006 - Windows PowerShell
2007 - Clojure
2009 - Go
2014 - Swift (程式設計語言)
           

程式設計語言發展史上的傑出人物

約翰·馮·諾伊曼,作業系統概念的發起者。

肯·湯普遜,發明了Unix。

丹尼斯·裡奇,發明了C。

約翰·巴科斯,發明了Fortran。

阿蘭·庫珀,開發了Visual Basic。

詹姆斯·高斯林,開發了Oak,該語言為Java的先驅。

安德斯·海爾斯伯格,開發了Turbo Pascal、Delphi,以及C#。

葛麗絲·霍普,開發了Flow-Matic,該語言對COBOL造成了影響。

肯尼斯·艾佛森,開發了APL,并與Roger Hui合作開發了J。

比爾·喬伊,發明了vi,BSD Unix的前期作者,以及SunOS的發起人,該作業系統後來改名為Solaris。

艾倫·凱,開創了面向對象程式設計語言,以及Smalltalk的發起人。

Brian Kernighan,與丹尼斯·裡奇合著第一本C程式設計語言的書籍,同時也是AWK與AMPL程式設計語言的共同作者。

約翰·麥卡錫,發明了LISP。

比雅尼·斯特勞斯特魯普,開發了C++。

尼克勞斯·維爾特,發明了Pascal與Modula。

拉裡·沃爾,創造了Perl與Perl 6。

吉多·範羅蘇姆,創造了Python。

......

名詞紀要

二進制

二進制是計算技術中廣泛采用的一種數制。二進制資料是用0和1兩個數位來表示的數。它的基數為2,進位規則是“逢二進一”,借位規則是“借一當二”,由萊布尼茲發現(啟蒙思想源自中國古代的易經八卦)。

指令

告訴計算機從事某一特殊運算的代碼。如:資料傳送指令、算術運算指令、位運算指令、程式流程控制指令、串操作指令、處理器控制指令。

代碼化指令序列就是計算機程式。

彙編

彙編是離機器碼最近的一個人類可閱讀可編寫的語言形式。計算機CPU隻能處理010101這樣的二進制碼。人類最早用0 和 1(紙袋打孔等) 來寫程式,這樣搞起來太費勁,效率太低。

幸虧人類有着聰明的善于思考,抽象問題的大腦。是以後來就有了彙編語言。人類用彙編語言來寫人類看得懂的程式(mov, add ... )。 但是這樣的彙編指令,CPU又看不懂了。怎麼辦?我們聰明的人類設計了“編譯器”。 之後這個程式會把人類編寫的程式,翻譯成CPU能了解的010101.........通過程式設計語言建立起人類和CPU之間的翻譯工作。(一切皆是映射)

編譯器

簡單講,編譯器就是将“一種語言(通常為進階語言)”翻譯為“另一種語言(通常為低級語言)”的程式。(一切皆是映射)是連接配接進階語言(如Pascal、C、C++、彙編語言)與機器語言(Machine code,01)的橋梁。

對于Java、C#等進階語言而言,編譯器先把源碼(SourceCode)編譯成通用中間語言的位元組碼(ByteCode)(遵循一套各自平台上定義的協定規範)。最後運作的時候通過通用語言運作庫,轉換成最終可以被CPU直接執行的機器碼。

參考資料

1

https://www.zhihu.com/question/22193700

2

http://baike.baidu.com/item/%E4%BA%8C%E8%BF%9B%E5%88%B6

3

http://baike.baidu.com/item/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80

4

http://baike.baidu.com/item/LISP/22083

5

http://baike.baidu.com/item/pascal/241171

6

http://baike.baidu.com/item/ada/5606819#3

7

https://en.wikipedia.org/wiki/History_of_programming_languages

8

http://james-iry.blogspot.co.at/2009/05/brief-incomplete-and-mostly-wrong.html

9

http://baike.baidu.com/item/%CE%BB%E6%BC%94%E7%AE%97

10 《Java程式設計思想》(Bruce Eckel)