1.1機器語言
.

計算機發展初期,人們都是用機器語言進行程式設計的,這也是人們能實現程式設計控制計算機的最低級別。那麼機器語言是什麼樣子的呢?就是用0和1組成的一個串(形如011010101),cpu的每一個功能對應著一個串,cpu得到這樣的串就去執行對應的功能,我們把這樣的串叫做一條機器指令。cpu提供的所有功能,這些功能對應的所有串,我們稱之為這種cpu的指令集。這裡我們就知道指令集是什麼東東了。cpu提供的功能的個數是一定的,但是0和1組成的串卻有非常多的組合。所以並不是任意一個串都可以讓cpu去執行特定的功能,只有指令集中的串才可以。

每一種cpu,由於硬體設計和內部結構的不同,對應的指令集也是不同的。也就是說,每種cpu都有專屬於自己的一套指令集。這就好比兩個人,一個說英語,一個說法語,雖然他們的語言都是由相同的26個字母組成的(就像不同cpu的指令集都是由0和1組成的),但是同樣的一個單詞,他們兩人可能理解成不同的意思。同樣的,他們要表達同一個意思,也可能用不一樣的單詞。由此可見,用機器語言編寫的程式是不可移植的。什麼叫移植?就是你用cpu-A的指令集編寫一個程式,可以在cpu-A上成功執行,於是你想不改動該程式,然後在cpu-B上同樣執行成功,實現相同的功能。想想也是不可能,就好比你用英語寫了一篇文章,拿去讓只會法語的人讀,你說他會讀懂嗎?

早期用機器語言編寫程式的程式猿,不能不稱之為神。你要記住cpu提供的所有的功能,以及每個功能對應的一串二進位制指令,然後熟練的使用。萬一哪個地方0被錯誤寫成了1,你還要在萬千個0和1中把它找出來。想想都有點不可思議。關鍵是萬一換了其他的cpu,你還要重複上面的過程重新編寫你的程式。

注:其實還有更低級別的指令,叫做微指令,每條機器指令都被翻譯成幾條微指令然後讓cpu去執行。至於微指令,不用去了解,太底層了,而且是cpu生產商的機密(就好比用Iphone6,我們能使用Iphone6的各種功能,但是我們不知道這些功能是如何實現的,這就是商業機密,指令集就是一個功能集合,我們用指令集去實現自己想要的功能,但是這些功能如何實現的,就是微指令的事,人家不會告訴你的)。我們只要知道cpu中固化了一套自己的指令集就可以了。至於什麼是固化,我也不懂,貌似是涉及硬體的東西,但是你只要明白,不是我指令集裡的東西我不認。

講個很久以前的笑話,說有個人很牛逼,有天發現自己的驅動軟體壞掉了,於是他找來一張空光碟,拿起一根細針,瘋狂得戳呀,一個小時過去了,塞入光碟,驅動安裝成功。這雖然是誇張,但是由一點是非常正確的,不管你用什麼語言編寫的程式,最終都會被翻譯成機器語言在機器上執行,沒辦法,誰讓機器只認0和1呢。