1. 語言轉換的例子
- 舉例:有這樣一條指令,它在內存地址是 0: 0010 1110
- 前四位是操作碼,簡稱 OPCODE
- 前 4 位 0010 代表 LOAD_A 指令,即把值從內存複製到寄存器 A
- 後 4 位 1110 是內存地址,1110 是十進制的 14
- 所以,這 8 位表達的意思是:讀取內存地址 14,放入寄存器 A
- 它們只是使用了兩種不同的語言,就好像是英語和摩爾斯碼的區別,只是他們的編碼方式不同
- 摩爾斯碼只有點和線,計算機能處理二進制,二進制是處理器的「母語」
- 事實上,它們只能理解「二進制」,這叫「機器語言」或「機器碼」
2. 操作碼錶
- 在計算機早期階段,必須使用機器碼寫程序
- 具體來講,先在紙上用英語寫一個「高層次版」,這種對程序的高層次描述,叫「僞代碼」
- 紙上寫好後,用「操作碼錶」把僞代碼轉換成二進制機器碼,然後可以把程序喂入計算機並運行
3. 助記符
- 出現原因:人們厭煩了上述的操作
- 1940 - 1950 年代,程序員開發出一種新語言,更可讀,更高層次,每個操作碼分配一個簡單的名字,叫「助記符」
- 「助記符」後面緊跟數據,形成完整指令
- 舉例:與其用 0 和 1 寫代碼,程序員可以寫 “LOAD_A 14”,這樣更加容易理解
4. 彙編器
- CPU 不知道 LOAD_A 14 是什麼,它不能理解文字,只能理解二進制
- 程序員想了一個技巧,寫二進制程序來幫忙,它可以讀懂文字指令,自動轉成二進制指令,這種程序叫做「彙編器」(assembler)
- 作用:讀取「彙編語言」寫的程序,然後轉成「機器碼」
- “LOAD_A 14” 是一個彙編指令的例子
- 隨着時間的推移,彙編器有更多的功能,讓編程更容易,其中一個功能是自動分析 JUMP 地址
- 彙編器不用固定跳轉地址,而是讓你插入可跳轉的標籤
- 當程序被傳入彙編器,彙編器會自己搞定跳轉地址
- 程序員可以專心編程,不用管底層細節,隱藏不必要細節來做更復雜的工作
- 彙編只是修飾了一下機器碼,一般來說一條彙編指令對應一條機器指令。所以,彙編碼和底層硬件的連接很緊密
- 彙編器仍然強迫程序員思考,用什麼寄存器和內存地址
5. 哈佛 1 號計算機
- 在 1944 年建成,幫助盟軍作戰
6. 算數語言版本 0
- 戰後,Hopper 設計了一門高級語言,叫「算數語言版本 0」,簡稱「A-0」
- 彙編與機器指令是一一對應的,但是一行高級編程語言,可能會轉成幾十條二進制指令
- 爲了做到這種複雜的轉換,Hopper 在 1952 年創造了第一個編譯器
- 編譯器專門把高級語言轉換成低級語言,比如「彙編」或「機器碼」
- A-0 的代碼沒有遺留下來
7. 變量
- 代表內存地址的抽象
8. FORTRAN
- 名字來自「公式翻譯」
- 由 IBM 在 1957 年發佈,主宰了早期計算機編程
- FORTRAN 寫的程序比等同的手寫彙編代碼短 20 倍,然後 FORTRAN 編譯器會把代碼轉成機器碼
- 因爲能讓程序員寫程序更快,所以成了一個更經濟的選擇。運行速度滿一點點,編程速度大大加快
- 最初 FORTRAN 代碼只能跑在 IBM 計算機上
9. 數據系統語言委員會和 COBOL
- 1950 年代,大多數編程語言和編譯器只能運行在一種計算機上,如果升級電腦,可能要重寫所有代碼,
- 1959 年,工業界、學術界、政府的計算機專家組件了一個聯盟,「數據系統語言委員會」,Grace Hopper 擔任顧問,開發一種通用編程語言,可以在不同機器上通用
- 最後誕生了一門高級,易於使用,「普通面向商業語言」,簡稱 COBOL
10. 1959 年,計算機黃金時代開始
- 1960 年代的語言
- ALGOL
- LISP
- BASIC
- 1970 年代
- Pascal
- C
- Smalltalk
- 1980 年代
- C++
- Objective-C
- Perl
- 1990 年代
- Python
- Ruby
- Java
- 新千年
- Swift
- C#
- Go
- 有些語言現在還存在
- 瀏覽器可能是 C++ 或者 Objective-C
- 新的語言在不斷誕生
- 使用更聰明的抽象,讓某些方面更容易或更強大
- 或利用新技術和新平臺帶來的優勢,讓更多人能快速做出美妙的事情
11. 聖盃
- 很多人認爲,計算機的聖盃是直接使用英文,直接對計算機說話,然後它會理解並執行
- 這種智能系統目前只存在於科幻小說