要說什麼是程式語言?
我們先來說一下什麼是自然語言。
自然語言是我們人類交流的語言,包括漢語、方言、日語、英文、韓語等。
自然語言能夠承載的信息非常豐富,越是高級的程式語言越接近於自然語言。
不同的自然語言,有其獨特的語法規則。
這些年,計算機科學家們一直研究如何能夠讓計算機更好的識別、理解、模擬自然語言,這是人工智慧的一個研究方向領域。
人類發明計算機的時候,根據計算機的特性為它設計了最早的計算機語言——機器語言
這門語言的組合很簡單只有0和1兩個數字,也是計算機會的唯一一門語言。
漢語的基本組成單位是偏旁部首,英語的基本組成單位是26個字母。
一個道理。
為了讓大家能容易理解,我們把計算機擬人化一下。
假設要讓計算機把11和22進行相加,編程人員需要對計算機「說」:「001001001110001111001。」
計算機就明白啦,原來是讓我把11和22進行相加。
後來大家覺的這樣太麻煩了,人類就是這樣,因為嫌上樓麻煩,發明了電梯。
因為嫌走路麻煩,發明了汽車,火車,飛機。
對計算機講機器語言太麻煩了,還容易出錯,萬一多輸入了一個0或者少輸入了一個1,那意思可能完全變了。
研究計算機的前輩大牛們覺的機器語言太不好用了,也不知道折騰了多久,搗鼓出了彙編語言。
如果用彙編語言對計算機說,把11和22進行相加,那就容易多了。
mov ax,11
add ax,22
ax是計算機內部一個存數字的「小盒子」,它有一個專業的名詞叫做「寄存器」,有沒有想到超市裡面臨時存東西的柜子,一個道理。
但計算機理解不了彙編語言,因為計算機只懂機器語言。
所以,大牛們又設計了一種程序,叫做「彙編器」。
彙編器相當於一個翻譯,把人類寫好的彙編代碼翻譯成機器語言,這樣子計算機就聽懂了。
彙編語言的每一行語句都和機器語言相對應,所以彙編語言,我們可以理解成人類能夠直接看懂的「機器語言」。
這個過程聽起來簡單,但其實非常不簡單。
但人類還是嫌麻煩,能不能更簡單一點。
於是又設計了一些程式語言,我們就拿其中的C語言做代表吧。
11+22
那計算機自然就更聽不懂了,於是前輩們又設計了一種程序,叫做「編譯器」。
編譯器負責把高級語言翻譯成彙編語言。
彙編器再把彙編語言翻譯成機器語言。
有的朋友開始忍不住提問了:高級語言不能直接轉換為機器語言嗎?為什麼要先用編譯器,再用彙編器?
這個問題提的非常有水平,從技術上是可以實現的,但不是最優的解決方案,為什麼?將來學完編譯原理就知道了。
機器語言是被設計出來的,只能使用0和1.
但不同的公司設計的機器語言標準不一樣。
讓計算機把兩個數相加:
A公司設計的機器指令是:1000
B公司設計的機器指令是:0001
那麼一個程序如果使用A公司的彙編器生成的機器指令,就無法在B公司的機器上運行。
自然而然就誕生了一些協會,或者有權威的機構企業為了避免讓這種事情發生,會制定一些行業設計標準。
讓大家設計機器語言的是參考某個標準去設計,不要亂定義,和諧是人類一直追求的事情,但有時候為了賺錢,總有人會破壞和諧。
x86架構和Arm架構就是兩種標準指令集(機器語言)的編號縮寫。
想像一下你買的是聯想電腦筆記本,你朋友買的是戴爾筆記本。
但是兩臺電腦的USB口大小不一樣,你的U盤只能插到指定的筆記本上,那是一件多麼糟糕的事情。
(不過USB馬上也要淘汰了,大家插USB口的時候,有沒有一種感覺?第一次插,總是插不進去)
第一圖是現在的USB口,第二張圖是這幾年開始流行的USB-type-C接口,正反插都可以插入。
手機充電器也會慢慢全部改成第二種接口。
在聖經中記載了一段歷史,起初上帝創造人類,語言是相通的,但由於人類太過於驕傲,要合力造巴別塔,上帝讓人類說不同的語言,使人類無法溝通,計劃因此失敗,從此各散東西。
此事件,為世上出現不同語言和種族提供解釋。
直到今天,我相信全球統一化程式語言,是很多人曾經心中的夢想或者現在正在懷揣的夢想。
以上只是為了幫助大家理解程式語言,用擬人化的思維極其簡單的給大家說了一下原理。
慢慢的,計算機不僅僅局限於計算了,當可以處理簡單的文字,圖片信息的時候。
人類開始考慮,能不能讓計算機聯網,信息共享傳輸,有了這個腦洞之後,也不知道過了多久,大牛們就把網際網路就搗鼓出來了。
隨著科技進步,手機、嵌入式等各種電子設備誕生包括網站這個名詞概念的誕生,為了應付不同的行業需求,也誕生了許多相關產業。
在這個過程中,發明了各種各樣的程式語言解決這些需求,當然也有各種各樣的硬體廠商,CPU,顯卡,滑鼠,顯示器,鍵盤,印表機,掃描儀,音響,路由器……
程式語言那也是被發明出來一個接一個的。
Python、Php、Html、Css、Javascript、.Net、Delphi……截止今天,人類歷史上有過幾百種程式語言,今天能夠活下來沒有被淘汰的說明的確有市場還需要它。
有了作業系統、資料庫……
隨著代碼量越來越多,開發軟體難度越來越大,有了軟體工程,代碼管理,多人協同開發,設計模式,框架、類庫等概念,目的都是一個,為了簡化開發難度,保證開發質量,管理開發進度而誕生的相關技術。
但這個過程是非常艱難,不容易的,花費了很多智商頂尖科學家的腦力才有了我們今天的計算機技術。
上述任何一個專業名詞,都可以寫幾千頁的書去詳細描述,學無止境,浩瀚如煙,博大精深等這些詞語,大家以後隨著接觸計算機知識越來越多,越覺的人是多麼渺小卑微。
有些行業,年輕的時候學習的知識,老了還能用得上,只要堅持下去,就會厚積薄發,經驗豐富,越老越吃香。
但計算機行業,有些技術淘汰的很快,你可能還沒學透徹,才使用了沒幾年,某個技術就被淘汰了,如果追求這些皮毛的技術,經驗就不會持續疊加,隨著年老,經驗和記憶力衰退,拼不過年輕人了,中年危機……
這個行業,有深度有深度,要廣度有廣度。
就拿設計來說,有建築設計,工業設計,程序設計,動畫設計。
建築設計又能分為橋梁設計、古建築設計,現代建築設計……
動畫設計分為2D,3D各種,我不清楚的專業術語……
程序設計也能給你分出很多來……
大家千萬不要東學學,西學學,最後都是半桶水,先挑一個領域深入,到了一定的程度,再考慮相關領域的拓展,也就是廣度的發展。
說到這裡,其實不光是計算機行業,醫學行業,生物行業,天文學,物理學,機械學都是如此。
有的人就覺的,學的東西也太多了,有一種非常絕望的感覺!
不要怕,活在當下,怕什麼真理無窮,進一寸有一寸的歡喜。
不要跟別人比較,跟自己比,今天的自己是不是比昨天的自己優秀了一點點。
每天進步一點點,這也是我為什麼一開始就強調,必須把心安靜下來,否則走不遠,即使呆在這個行業,想要走純技術路線也是不現實的。
而且單純的走技術路線,要獲得比較高的成就還是比較難的,我們具體點說,要賺很多錢,有點難。
在這個講究人際關係,情緒管理、為人處世的時代,職業的發展路線也是多元化的,結合自己的性格,找到適合自己的路,才是王者之道。
摘選自《極客編程》之《從零學編程》系列教程之《計算機原理》之《簡談計算機》