如何理解所有的程式語言和語言

我對上帝說西班牙語,對女人說義大利語,對男人說法語,對我的馬說德語。
——法國國王查理五世(1500——1558)
首先,讓我們先來玩個記憶遊戲,請你仔細地瀏覽這張圖,並儘可能記住所有的細節。仔細瀏覽的意思是說,從上至下,從左至右,從實線到虛線,每一個字、每一幅圖都仔仔細細地看一遍。

自然 - 語言 - 符號
吾愛汝。 我愛你。 I love you. Te amo.
上面四句話,是什麼意思?換句話說,它背後的本質是什麼?相信你一定懂得第一句和第二句話,即便你不懂第四句話,但通過前三句話,你也一定知道第四句話表達的是同樣的意思——“我愛你”——就是這四句話的本質,它們唯一的區別是 符號 不同。
發現了嗎?文字僅僅只是一種符號,光是看著 Te amo 這些符號的組合,你什麼都不明白,也什麼都做不了。只有當你把Te amo背後的那個“東西”與前面三個等同起來,它才有了意義和本質。
你完全可以自己設計出一套符號系統,用來表達,你想表達的含義,摩爾斯電碼和盲文就是很好的例子。
數學,也是一種語言,某知名高數教材,面向大一新生直接引入極限的精確定義,使得初學者無法理解背後的本質,學起來必然痛不欲生。
機器語言與動物語言
小貓喵喵喵喵,小狗汪汪叫,語言學家和動物學者可能會說小動物不會語言。我不這麼認為,難道發不出26個漢語拼音,英文字母的音就無法交流嗎?實際上,小動物才是真正的交流高手。高手過招往往都是點到為止,因此小動物的交流也很簡單,吃、喝、拉、睡——一個動詞,無需多餘的 編碼(code) 組合就能表達完所有意思,且不會造成歧義,快捷又高效。
編碼(code)
a. 一種在資訊傳輸過程中用來表述祖母或數字的訊號系統。
b. 由被賦予了一定主觀意義的符號、字母以及單詞所組成的系統,該系統可用於傳輸需要保密或簡短的資訊。
c. 一種由若干符號和規則組成的系統,用來向計算機表述指令。
相比之下,我們的語言就複雜得很多了,一說到學習英語,一些人就會苦惱,小的時候記26個字母的發音、寫法,再大一點要記住它們的排列組合,也就是編碼,再來還有它們的語法規則,主、謂、賓、定、狀、補、從句……甚至人類的語言還有很多的“ 噪音 ”,歧義重重——往往越解釋,越不清楚,越描越黑。
被誤解是表達著的宿命。
——馬東《奇葩說》
20世紀40年代末,第一臺計算機誕生了,隨著計算機的出現,一種新的語言也誕生了,叫做 機器語言(machine language) 。程式設計師使用這種語言編寫程式,輸入到計算機中,經過計算機的處理,產生結果再返還給程式設計師。機器語言(也稱機器指令、機器碼)是計算機可以直接識別的 二進位制位(binary digit) 編碼,之所以採用二進位制,因為電路的電壓便於用“高”和“低”兩種狀態來表示,就像這樣:
10001100 10100000 // A加B
同樣的它們都是符號,一旦經過設計和編碼,就可以表達特定的含義。
和小動物一樣,計算機也有基本的需求——做算術運算。“0”和“1”經過編碼,就可以做出加、減、讀、寫等基本操作了。
但是,程式設計人員很快就發現了——作為人類自身的不足,用兩種狀態表達計算過程,容易出錯,記憶困難,不便閱讀,編寫起來十分枯燥。
機器語言(machine language):以二進位制形式表示的機器指令。
二進位制位(binary digit):也成為位。基數為2的數字中的0或1,它是資訊的基本組成元素。
組合語言
程式設計師認識到這個問題,很快就設計出了 組合語言(assembly language) ,利用助記符來編寫程式,顧名思義,是幫助程式設計人員記憶的符號語言。
add $t0, $s0, $s1 // 將暫存器$s0的值和$s1值相加,賦值給$t0 add $t1, $s2, $s3 // 將暫存器$s2的值和$s3值相加,賦值給$t1 sub $t0, $t0, $t1 // 將暫存器$t0的值和$t1值相減,賦值給$t0
但是根本問題依舊沒有解決,計算機懂的是機器語言,不是組合語言,因此每次使用匯編語言編寫完程式後,還是需要程式設計師翻譯為機器語言,這時, 彙編器(Assembler) 就誕生了,它充當翻譯官的角色,將組合語言翻譯為機器語言。
由於組合語言與機器語言十分接近,機器語言與組合語言又統稱為 低階語言 。雖然助記符比機器語言要容易記憶,但用它編寫程式依舊十分繁瑣,程式設計人員必須將注意力和時間消耗細節上,告訴計算機每一條指令的執行:第一步從記憶體的某一個位置取一個數,第二步加到某個暫存器中,第三步再……這些工作,費時費力,因此產生了新的需求。
組合語言(assembly language):以助記符形式表示的機器指令。
彙編器(Assembler):也叫彙編程式,將指令由助記符形式翻譯成二進位制形式的程式。
高階語言與自然語言
記憶、閱讀與理解起來困難,不符合人類的認知規律, 高階語言 應運而生。只要你學過四則運算,和初等代數,你就一定能理解下面這句話在做什麼,滿足了什麼樣的需求。
a = (b + c) – (d + e);
這段程式碼,和上面的彙編程式碼本質所做的事,滿足的需求,所表達的含義是等同的,卻更符合,人類的認知,容易記憶。
高階語言:如C、C + +、Java、Visual Basic等可移植的語言,由一些單詞和代數符號組成,可以由 編譯器 轉換為彙編程式。
編譯器:將高階語言翻譯為計算機所能識別的機器語言的程式。這個過程相當複雜,不作過多介紹。
高階語言與低階語言在某些方向上是一致的,因為其本質的工作,所需要完成的任務本質上並無變化,不外乎要做基本的運算,所有的高階語言都有基本的運算子號,運算規則:
I love you. She needs me. They eat hamburgers.
人也有基本的需求,我愛你,我需要你,我吃漢堡,我喝可樂。語法老師在教你時,肯定會告訴你:
I 是 主語 love 是 動詞 you 是 賓語
一個完整的句子必須有 動詞 ,同時你必須按照 主+謂+賓 的順序來聽說讀寫,那是因為“我”和“你”本身本無任何聯絡,“她”和“我”本身並無聯絡,“他們”和“漢堡”也無聯絡,而 love, need, eat 產生了動作,才使得他們產生了聯絡。自然語言中 I, you, she, me, they, hamburger 歸類為名詞,在程式語言中我們把它們稱為 型別 。我們用程式語言的形式,可以將上面的三句話改寫為:
love(I, you); she(needs, me); eat(they, hamburgers);
這時 I, you, she, me, they, hamburger 也叫作 引數 。love, she, eat 表示它們所完成的動作,稱為 函式 。
漢語和英語相比較而言,英語有16種時態變化,我們在學習與理解不同的語言時,要注重的是它們的共性與特性:
- 詞性(名詞,動詞,形容詞,副詞···)
- 句子結構(主+謂+賓···)
- ···
同樣的,學習現代程式語言,也需要去學習和理解它們的特性:
- 面向過程
- 面向物件
- 變數定義、引用
- 算術運算
- 函式定義、呼叫
- ···
一部分初學者,甚至某些已經學過程式語言的人,還糾結於在選擇什麼樣的程式語言這種問題上,是不正確的。
學習、理解或者掌握一門程式語言別無他法,就是學會使用其語言的特性,編寫出一定數量的程式碼,像學英語一樣僅僅靠背語法規則,但從不去使用在聽、說、讀、寫上是行不通的。
更重要的是,帶著問題,帶著目的去運用語言。
後記
還記得開篇的圖嗎?同樣的,與組合語言一樣,機器永遠只能識別二進位制,無法識別高階語言,我們需要將高階語言先轉化為組合語言,編譯器就是用來翻譯高階語言的。
我已經帶著你遍歷了自然語言、低階語言甚至是動物語言,希望看完之後你對所有的語言都有了更進一步的認識。
為了便於初學者學習,基本上已在文中出現的計算機相關術語下方,給出了較為準確的解釋,希望可以幫助初學者更好的理解這些專業術語。
感謝閱讀,全文完,喜歡記得關注打賞
版權所有,禁止轉載