“編程”到底是個什麼“鬼”?

對於很多沒有從事計算機行業,或者涉入不深的朋友來說,編程要麼是一種神秘的行業,要麼就是一種“殘暴”的行業。因為在大多數人看來,為什麼26個英文字母+10個阿拉伯數字+加減乘除,怎麼就把阿波羅給送上月球了?真是太神奇了!

的確,乍一想確實很神奇。從這一期起,我們就來慢慢揭開“編程”的神秘面紗。

其實,一開始並沒有當今這個“程序”這一說的,也就是隻有硬件而沒有軟件。最原始的能跟“編程”扯上關係的硬件,莫過於“計算器”了。當時的計算設備,就跟現在的“計算器”差不多,你只要按下你要計算的數字,再按下計算符,就可以得到結果了。那麼計算器的原理是什麼哪?為什麼不管多大的數,也不管多麼複雜的計算,為什麼我們算一天都不見得能算完,而這麼小小的一個東東,卻可以在瞬間完成幾十億位數的計算哪?

這得感謝兩位大神——牛頓和萊布尼茨。

這兩位大神發現了“二進制”這個好東西(吐槽一句:據說他們是根據中國的《八卦圖》推測出來的,這也太氣人了吧!)。咱們上小學的時候老師就給我們講過二進制,但是缺不給大家講清楚二進制的用途,哼~

讓我們來重溫一下二進制。在二進制裡只有“0”和“1”這兩個數字(PS:看起來真簡單!),然後所有的數字都是用這兩個數字的組合來表示的。比如,2可以表示為“10”,3就用“11”,4就用“100”來表示……以此類推。

萊布尼茨接著放“損招”——他規定了二進制的運算法則。0+0=0,0+1=1+0=1,1+1=10。簡單地說,就是兩個數只要有一個為1就變1,要是兩個數都為1就進一位,後面補0——無聊!

所以,任何整數都可以用這種規則給計算出和。比如18+13就可以表示為:

我們用計算器一轉換,神奇的現象發生了——運算結果的“11111”轉換為10進制居然是31,跟十進制的運算結果一樣!有點兒意思了。

二進制能幹什麼哪?咱們人類肯定不直接用,否則太繁瑣了!

但是這個東西被搞機械和電路的人給盯上了。在電路里,有開關這種最基本的元件。它不止能機械地控制燈的開和關,還能表示“開”和“關”這兩種燈的狀態。人們就用“0”表示燈開著,“1”表示燈關著。那“00”就表示兩個燈都關著,“01”表示第一個燈關著,第二個燈開著……而“11”則表示兩個燈全開著……以此類推。

更無聊!

不知道誰想到了一個“損招”,將二進制表示數字的方法和開關的開關給聯繫起來了。所以,我們用一個開關就可以表示“0”和“1”這兩個數字,兩個開關就可以表示“0”至“3”這四個數字……以此又類推。

更更無聊!

於是又不知道哪天一位無聊的電子機械師,開始玩兩排燈泡對對碰的遊戲。用兩排燈(也就是開關)來模擬上面的二進制加法,也就是用燈泡亮和滅來模擬二進制運算。他居然成功了!

於是他將控制兩排燈泡的開關做到了一起,並做成了機械手柄。運算的時候他就手動打開或者關閉開關,看最後到底有哪些燈亮著,再將這些燈的開關狀態轉換為十進制數,就是運算結果了。

別急!這就跟中國的算盤一樣,當數字很小的時候,這麼做的確很無聊。但當參與運算的數字逐漸變大時,情況就不一樣了。我們會發現在紙上算不如挨個扳這些開關來得快。

於是,第一代的機械計算器就這麼誕生了!

後來,隨著電子技術的發展,人們發現可以把這些機械式的“大個頭”變成迷你的小電器,於是原來哪些手動開關,就變成了肉眼看不見的電信號,於是電子計算器就出現了。

這又跟計算機有什麼關係哪?我們發現,計算器每次都只能執行一個操作,而很多時候為了完成一項計算任務,往往要經過多次計算。所以人們不得不用筆和紙將計算器的每次計算結果都記錄下來,再重複錄入進去進行計算。

於是人們就在想,是不是可以讓計算器自己將每次的計算結果記錄下來,並且還把下一次要運算的操作記錄下來,自行進行計算。於是,第一代計算機就這樣誕生了!

所以,編程最原始的意思就是將我們要計算的序列想辦法輸入到計算機裡,讓計算機幫我們計算出最終結果。只不過,當時的輸入可不像現在這麼方便簡單,用小小的鍵盤噼裡啪啦敲進去就可以了。當時需要這樣做:

辣個人手裡拿的似森麼?似仄個東西:

對,你沒看錯,是打孔紙帶。事先將要計算的東西按要求在紙帶上打孔,然後塞到計算器裡去運算。

但我真的沒騙你,編程就是從“打孔”開始的。

只是後來,人們終於忍無可忍了,才開始用肉眼和智商可識的“字母+數字+運算符”的方式將程序寫出來,讓計算機自己把可識別的字符組合轉換為看不見的“紙帶”輸入給計算機。這才有了編程語言:

這樣的編程語言(彙編語言)依然是反人類的,所以人們對編程語言逐步優化,才有了後面的B語言->C語言,再到後來的什麼C++、Java之類的高級語言:

以上就是編程語言的發展歷史和基本原理。後面我們再來接著嘮~