程式語言編年史
Program History
介紹程式語言的發展歷史,通過閱讀,可以對程式語言有一個巨集觀的印象,有助於我們理解自己學習程式語言的動機和如何更好地學習程式語言。
機器語言
機器語言:
-
只有數字
0
和1
- 並不代表任何'數量',而是代表'模式(pattern)'的訊號
指令:
- 給計算機輸入的相當於'命令'的數字,稱為'指令'
- 通過指令來操作,讓計算機做一些事,就是程式設計的本質活動
指令集:
- '模式'到'指令'的對映的集合
- 通過金屬引腳接受0和1輸入的CPU的所謂'指令集',本質上就是由晶片製造廠商給出的數字組合定義
- 晶片設計結構不同,每種晶片的指令集也就不同
組合語言
組合語言:
- 機器語言程式設計難度很大,且不可讀,從數字到助記符號的轉譯很快隨之出現,形成了組合語言
-
0010 0000
–>ADD X, Y
- 組合語言由專門的小程式'翻譯'成二進位制的機器碼
- 只有二進位制的機器碼才是真正可以輸入處理器去按下電晶體的程式電子訊號
- 每種處理器的組合語言仍舊是不同的
機器語言,組合語言的優點:每條指令都幾乎對應於晶片能做的一件事, 直接對一塊晶片下命令, 效率非常高;缺點:指令集不同, 操作重複枯燥。
高階語言
高階機器語言:
- 傾向於描述需要解決的問題,而不是描述計算機具體進行何種操作;
- 封裝了那些不需要關心的細節,把細小步驟想要達成的意圖抽象出來。
最古老的高階語言:
- FORTRAN,ALGOL,COBOL,LISP;
- 目前流行的一切計算機語言,幾乎全都是上述四種古老語言的綜合演進。
程式語言演進:
- 程式語言的'修飾、擴充套件和融合'的動機和幅度,主要取決於程式設計師的實際需求;
- 計算機逐步小型化,廉價化,應用範圍大幅度擴充套件,新的語言特性需求與日俱增。
正規化(paradigm):
- 語言設計者不可能一下子追蹤,彙總所有的需求,總要有所側重;
- 新發明的語言往往會側重於一種特定的方法,製作特定的語言功能。
高階計算機語言簡史
Fortran:
- 第一個 計算機語言,誕生於1957年,由IBM設計;
- 設計思想基於馮.諾依曼體系結構,是命令式語言的鼻祖 。
Lisp:
- 源於數學的計算機語言,誕生於1960年,由麥卡錫和其學生設計實現;
- 區別於馮.諾依曼體系結構;
- 建立在列表和 lambda 演算和基礎上,是函數語言程式設計的鼻祖 。
Algol:
- 通用科學計算語言,誕生於1958年,由蘇黎世會議制定;
- 是後來所有計算機語言語法的鼻祖 ,除 Cobol 外。
COBOL:
- 通用商務語言,釋出於1960年,在商務領域被廣泛的使用。
PL/I:
- 跨領域語言,誕生於1964年,是跨科學計算和商務應用領域的計算機語言。
SIMULA 67:
- 1967年改進的64年誕生的SIMULA I;
- 第一個定義類結構的語言 ,被認為是面向物件的起源。
將指令式程式設計中的資料和資料的有關函式整合在一起,就形成了面向物件程式設計中的物件,而物件的型別就是類。將指令式程式設計中主程式呼叫子程式的從屬關係 ,變為面向物件程式設計中物件之間互相傳送訊息的平等關係 。
BASIC:
- 初學者的語言,誕生於1971年;
- 第一個被廣泛使用的分時處理語言 ;
- 來自於 Fortran IV,語法受 Algol 60 影響。
Pascal:
- 學院派語言,誕生與1971年,來自於Algol 68;
- 重大影響來自於程式設計教學,取代了Fortran作為程式設計入門語言的地位。
C:
- 系統語言 ,一個可移植系統的程式語言;
- 丹尼斯.李奇主導,和肯.湯普森(UNIX作者)共同完成。
Prolog:
- 邏輯語言,誕生於1972年,邏輯是變成的鼻祖 ;
- 邏輯式程式設計,就是以形式邏輯的方式將計算過程傳遞給計算機。
Scheme:
- 極簡主義語言,一種Lisp方言,誕生於1975年,MIT;
- 第一個引入詞法作用域,延續體,閉包等概念 ;
- 將資料和函式等同對待;
- Scheme是函式式語言 主要用於數學演算法教學,Pascal是命令式語言 主要用於程式設計教學。
ML:
- 誕生於1979年,開創了以Algol做語法的函式式語言的先河。
Haskell:
- 強型別惰性純函式式語言,1990年標準化Mirada語言(86年部分基於ML語言誕生)的結果;
- 最大特點是惰性求值。
OCaml:
- Caml,支援面型物件的函式式語言,誕生於1996年,基於ML和Haskell;
- OCaml 是 Caml 的面向物件版本,釋出於2006年;
- F*是基於OCaml的.NET平臺版本,釋出於2010年。
Ada:
- 嵌入式語言,誕生於1980年;
- 廣泛的用於商務,國防航空和交通運輸領域。
Smalltalk:
- 純面嚮物件語言,誕生於1980年,第一個完全支援面向物件程式設計的語言 ;
- 源於SIMAL 67,完善並定義了訊息傳送,和物件的繼承關係;
- 在 Smalltalk 中,所有資料都是物件。物件的型別是類,類中可以定義方法,屬性等。
C++:
- 命令式面嚮物件語言,誕生於1983年;
- 是在 C 的基礎上,以 SIMUAL 67 的方式對指令式程式設計的面向物件擴充套件;
- C++ 的成功在於完全相容 C 的情況下支援了面向物件,從而使面向物件程式設計成為了指令式程式設計的一個子類,傳統的指令式程式設計 被叫做面向過程程式設計 ;
- C/C++ 吸收了太多的語言特性,成為了世界上最難精通的語言 ,競爭對手是 Java。
Self:
- 原型面嚮物件語言,誕生於1986年,源自於Smalltalk;
- 提出了"萬物皆物件"的思想;
- Self中物件建立物件的方式是自我拷貝,叫做原型;
- 原型面嚮物件語言的鼻祖 ,就像 SIMUAL 67 是類面嚮物件語言的鼻祖。
它刪除了面向物件概念中的類的概念,認為類也是一種物件;訊息仍然作為最基本操作;把物件的屬性理解為獲取或更改屬性這兩種方法,從而把屬性的概念簡化位方法;取消了變數和賦值,替代它們的是通過訊息來讀槽和寫槽。
Objective-C:
- 另一個對 C 進行面向物件擴充套件的語言,誕生於1983年;
- 以 Smalltalk 的面向物件為基礎(C++ 是以 SIMUAL 67 的面向物件基礎);
- 蘋果公司的。
Delphi:
- 對 Pascal 進行面向物件擴充套件的語言。
Perl:
- 指令碼語言,釋出於1987年,起源於作業系統的控制檯(shell)的命令;
- sh 檔案就叫做指令碼 ,指令碼只是一些命令列,但是Perl時已經是一個相當成熟的語言了。
Lua:
- 關聯列表函式式面向物件指令碼語言,誕生於1993年,設計目的是嵌入應用程式,成為其指令碼;
- 基於 Self 和 Scheme ,第一個以關聯列表作為主要資料的函式式語言 。
Java:
- 虛擬機器面嚮物件語言,誕生於1995年,由Sun公司開發,第一個在虛擬機器上執行的語言 ;
- Java 運行於 JM (Java虛擬機器)上;
- Java 是面向物件程式設計使用人數最多的語言,強力競爭對手是 C# 。
在此之前的計算機語言,動態語言,由直譯器解釋執行原始碼(大多數命令式語言),靜態語言,將原始碼編譯連線成實際的計算機指令後再由計算機執行(大多數命令式語言);JM和直譯器的區別,JM會將java原始碼程式設計成位元組碼,然後再由JM解釋執行。由於編譯和執行過程是交錯的,所以從外部來看就像是JM直接執行Java原始碼一樣。
Python:
- 面向物件解釋式指令碼語言,誕生於1989年,是面向過程+面向物件 語言。
Ruby:
- 純粹面向物件解釋式指令碼語言,誕生於1996年;
- 基本等於 Smalltalk + Lisp 。
PHP:
- Web 伺服器基本語言,誕生於1994年;
- 和 JavaScript 的語法相似,都是嵌入在HTML中,只不過一個在伺服器端,一個在瀏覽器端。
JavaScript:
- 瀏覽器指令碼語言;
- 表面上是一個指令式程式設計語言,本質是一個以關聯列表位資料格式的函數語言程式設計語言。
C#:
- .NET平臺主語言,於2000年和 .NET 平臺一起由微軟釋出。