機器語言
這個問題應該從機器語言是怎么工作說起的。
在計算機的太古宙時代,在制造一臺計算機之前,首先要做的是為它建造一座能夠容納它的大房子。然后還要配接上水電資源,因為它運行起來就要耗費半座城市的電能,散熱也得跟上。
而能夠操縱這樣的由電子管組成的怪獸的人,則是看起來低調神秘的科學怪人,他們在一卷紙帶上打上不規則的孔,送入機器,然后等著這臺怪獸一陣轟鳴之后在紙帶上輸出結果。
而這樣的機器也僅能進行算術運算,那些穿孔紙帶組成的神秘符號,就是機器語言。
下面看一段機器語言的代碼吧:
A10010
8B160210 01D0 A10410
要是有誰一眼就能說出它的功能,那么請接受我雙膝跪地頂禮膜拜。如果看不明白,也沒關系,后面語言越高級越容易看明白。
上面的每一條語句就是CPU可執行的一條指令。CPU常被比喻成計算機的大腦,因為指令的計算最終是由它來完成的。
而指令通常包括運算和賦值,往往單條指令的動作都是簡單的,只做一件事情。我們通過把多條指令按順序排列讓CPU執行,以此來實現復雜的邏輯。

匯編語言
可想而知,如果要這樣寫代碼,人類還怎么進步?于是科學家們就做了一下改進,讓代碼好懂了些,這就有了匯編語言。
將上面機器的代碼翻譯成匯編語言:
mov AX, X
mov DX, Y add AX, DX
mov Z, AX
在這里我們可以看到,神秘的字母和數字組合轉化成了有意義的單詞和字母了。學過匯編語言的同學們自不必說,沒學過的也可以大略猜測到,mov應該就是move的縮寫,是搬運、賦值;add就更好理解,加法。
而匯編的特點是它雖然比機器語言更好理解了些,但它和機器語言也是逐條對應的。要想實現復雜的邏輯控制,寫出來的代碼仍然很不好理解。
科學家們再一次對編程語言進行了改進,而這一次則是飛躍。
高級語言
誕生于1957年的Fortran,以及1960年左右發布的COBOL,被認為是最早的計算機實用編程高級語言。它們相對于匯編語言的改進在于,語句不再和機器指令對應,而是更接近自然語言。
所以高級語言中的“高級”二字,并不是說新的編程語言有多么先進,而是說它們在系統中處于更高一級的抽象。高級語言的代碼更適合于人類編寫與閱讀了。
例如前述的機器語言和匯編語言代碼,如果用Fortran語言寫出來,就是這樣:
Z = X + Y
怎么樣?即使不懂編程,也能看出來是什么意思吧,這類似一個數學算式了。當然,在計算機語句里,這是一條賦值語句,和數學語境中的等式還是有所不同的。
而高級語言需要通過編譯器,將文本符號翻譯成機器可以執行的指令集。編譯的過程一般分為四個過程,分別是預處理、編譯、匯編、鏈接,最后得到可執行文件。
可以使用近似于自然語言的方式寫程序,這顯然有助于編程技術的推廣,也推動了計算機的普及和軟件的快速發展。
可是編程的效率提高之后,另一個問題也隨之而來。那就是代碼缺少規范,只要能實現功能,大家可以隨心所欲地寫代碼。尤其是對goto語句的濫用,導致代碼混雜扭曲,因此這樣的代碼也被稱為“面條式代碼”。
當軟件需求進一步膨脹時,這樣的編程效率又跟不上發展了。由此在20世60年代爆發了軟件危機。1968年北約在聯邦德國的國際學術會議上正式提出了這個名詞。
軟件危機的意思就是說,大家照這樣去寫代碼,那么再過幾十年,全人類都去當程序員也生產不出實際需要的軟件來。確實有點危言聳聽,但我們知道現在并沒有出現那么駭人的景象,這都要感謝科學家們在編程思想上的進步。
結構化編程
同樣是在1968年,荷蘭計算機科學家Dijkstra在寫給ACM通訊的一封信中,聲明應該在程序中廢除goto語句,只需要使用三種基本結構就可以完成所有的程序功能。
這封信就是著名的“GoTo letter”,由這封信開始掀起了結構化編程的浪潮,Dijkstra也因為他在計算機技術上的卓越貢獻,在1972年獲得了圖靈獎。

Dijkstra老爺子
Dijkstra提出的三種基本程序結構,分別是順序、選擇、循環。
順序 就是從第一條語句開始,直到執行至最后一條語句結束,中間每一條語句都要被執行到。
選擇 則是根據條件判斷,程序決定執行相應的語句。
循環 則是判斷條件,重復執行語句。
上世紀七十年代,誕生于貝爾實驗室的C語言是最知名的結構化編程語言。同時C語言也是使用最廣泛的編程語言。
時至今日,得益于物聯網的快速發展,在IOT技術棧中占有重要地位的C語言,又在TIOBE編程語言排行榜上大放異彩。對于一門存在了四十多年的編程語言來說,這不能不說是一個奇跡。
C語言因其簡潔的語法,同時具備對系統底層的操作能力,成為編寫操作系統及底層服務的最佳選擇。
軟件危機終究還是沒有爆發,人類也從單機時代進入了互聯網時代。人們又需要開發起來更快、還要更好用的編程語言了。
面向對象編程
面向對象編程的英文是Object Oriented Programming,下文中簡稱其為OOP。一般來說,支持OOP的語言都包含三個特性,即封裝、繼承和多態。
其實最早的面向對象編程語言是Simula 67,它誕生于1967年。在當時,OOP所要求的三個特性,Simula 67就都具備了。
所以面向對象技術還真不是我們遇到危機時才發明出來的,而是早已存在,但在60年代時太過超前而并沒有被普及開來。
直到互聯網和PC興起,快速產品化的要求催使人們去尋找更適合的方法。語法像自然語言已經遠遠不夠了,編程語言最好還能符合人類的自然思維過程,而OOP包含的三個基本特性,正好滿足了這個要求。
如今我們在學習面向對象編程語言時,老師都會通過現實世界打比方。例如定義一個類就相當于畫好了一張汽車的設計圖,所有的細節都隱藏在私有方法中,對外只公開操作方法,包括啟動和停止等。
通過類,就能派生出一個實例,也就是一輛實際可以開的車。你調用公開的方法就能開車上路了,而且不用關心它內部是如何運作的。你只要能把奧迪開起來,那么寶馬你也能開。
JAVA、C#、php等語言正是在這樣的背景下興起,它們上手簡單,一名新人經過短期培訓就能上崗工作。這降低了軟件開發的門檻,也讓互聯網企業具備了快速拓展業務的能力。
C++語言在早期因其包羅萬象的特點,曾被大神Linus痛批。但在C++ 11發布之后,C++被注入了許多現代編程語言的元素,也被稱為Morden C++。如今C++已經大量應用在游戲引擎、人工智能、大數據等領域的基礎組件構建中。
當進入移動互聯網時代之后,編程語言發展更加快速,但都會具備面向對象的三個基本特性。
在終端,蘋果公司推出的編程語言就有Objective C、Swift。以谷歌為主導的Android平臺則使用java、C/C++、Kotlin。
編程語言不斷推陳出新,但只要是支持OOP特性的,對程序員來說就可以快速上手工作。這可能也是中國在移動互聯網時代擁有諸多優秀企業和應用的原因吧。
結語
縱觀編程語言的發展,可以清晰地觀察到,它是朝著對人越來越友好的方向的。從便于識別,到易于閱讀,再到符合自然思維習慣。
編程語言前進的每一步,都是為了讓人在使用這種工具時,能夠更有效率地實現功能,達成目標。在一個階段被滿足之后,快速興起的需求又會推動編程語言走向下一個時代。
可以推測,基于人工智能技術的輔助,編程技術將不再需要經過大量專業學習才能掌握。任何人只要具備邏輯表達的能力,就能生產出符合自己需要的軟件產品。
這樣的設想在現在看來可能是太美好了一些,因為有科學家認為完全不需要人工干預就不太可能,因為機器無法處理所有的細節。
我也很好奇,在未來編程語言會是什么樣呢?