1. 程式人生 > >淺談程式語言的本質

淺談程式語言的本質

前言

最近部落格和公眾號文章差不多有二個多月沒有更新了,相比之前每月一篇文章的更新頻率,最近確實懶散了許多,一來年底收尾之際手上的工作繁重抽不出時間,二來自己最近的空閒時間的學習計劃也排的緊密,久而久之就把寫部落格是事情落下了

但是也得益於自己之前堅持寫部落格的習慣,累積了一些讀者,我們知道人都是有惰性的,但每次想偷懶不寫部落格的時候,看到訂閱欄裡面讀者就覺得心生愧疚,我想這也是開放分享的一個好處,就是通過的外部力量去督促你去堅持下去,經過實踐,這確實是一種非常好的方式

為什麼會想寫這篇文章?主要有如下幾個原因

  1. 我最近利用空閒時間學習了一門新的程式語言,學習過程中有很多不同的體驗和大家分享
  2. 我發現很多文章只有當下才能寫出來,所以我想把握好時機(例如我曾經寫過紅黑樹的文章,但是由於近期工作原因疏忽了演算法的練習,所以我當下的狀態肯定是再也寫不出紅黑樹的程式碼了,甚至連反轉雙向連結串列都寫不出來)

今天想寫下關於程式語言的本質,這個命題很大,所以只是從淺顯的層次上談一談,從應用層面聊聊不同語言的差異,因為我未曾有時間深入學習過《編譯原理》(也是大家俗稱的龍書),所以並未深入到編譯原理等層次上,還請見諒

正文

先丟擲我的個人觀點:程式語言的本質就是規則

經歷是我上兩週花了週末兩天的時間,學習了一門新的程式語言,並且在第三天就寫了一個類似購物商城的簡單程式,學完後我就在反覆思考,為什麼可以在熟悉一門程式語言後,再去學習其他的程式語言,可以僅僅花費幾天時間就可以掌握,而我在學習第一門程式語言的時候卻足足花費了半年時間才覺得自己僅僅入門?

帶著這個疑問我開始思考問題,我的學習路徑是這樣,我入門程式語言學的是 Java,後面自學了 JavaScript,Groovy,Ruby, 自我計劃後續還繼續打算深入學習 C 和 GO 語言,想學習 C 和 GO 主要是有以下幾個目的:

  1. 主要是希望對作業系統底層能有更深入的理解(作業系統,資料庫等基礎軟體都是 C 寫的)
  2. 目前的計算機世界是建立的 C 的基礎之上的,不管是什麼牛逼的軟體,深入到底層都是 C 的原始碼
  3. 學習 C 語言是為了更好的理解 GO 語言(GO 的創始人也就是 C 的創始人,沒錯就是 Ken Thompson)
  4. 學習 GO 語言主要是希望對 PAAS 層有更深入的理解(Docker 和 Kunbernate 就是 GO 語言的代表作)

(圖片來自 Medium:Why should you learn Go?)

關於語言的應用場景,這方面我們就不繼續展開討論了,回到文章的主題,淺談程式語言的本質,經過思考後我認為,任何一門程式語言實際上是包含了兩種內容

  1. 知識(程式語言的共性,可遷移)
  2. 規則(程式語言的特性,不可遷移)

知識說是共性,是因為它面向所有程式語言通用,例如知識包含對以下內容的理解:

  1. 資料型別
  2. 流程控制
  3. 邏輯控制
  4. 異常處理
  5. 集合容器
  6. 併發模型

所以以上內容解釋了,為什麼入門學習程式語言這麼慢?是因為你在剛剛接觸第一門程式語言的時候,其實你面對的是兩個知識體系的內容,既共性內容(知識)+ 特性內容(規則),例如你剛學習 Java 你除了需要去學習什麼是布林值 Boolean,整型 Integer,浮點 Float,字串 String,這些通用的“知識”外,你還需要去學習它的規則,常見的 Java 語言規則就包含以下:

  1. 繼承,介面的使用規則
  2. 多型,面向物件的使用規則
  3. 類和內部類的使用規則
  4. 等等……

如果明白了程式語言的本質後,你會發現共性的知識只要學習一遍就可以了,當你理解知識再去學習其他語言的時候,你會發現你學習一門新的語言並不是從零開始,你熟悉的共性知識都出現在你要學習的新語言裡面,萬變不離其宗,因為任何程式語言都無法跳過這些基礎知識,正是這是知識加速你對新語言的學習理解,所以你只需要學習新語言的規則就可以了,瞭解下它的邏輯控制,異常怎麼玩,有什麼新特性,適用於什麼場景,這都為你節省了大量的時間和精力

例如 Ruby 我只需要大概瞭解它的 Meta Programing 怎麼玩,邏輯和流程控制符的規則,Java 我只需要大概知道它的異常體系,介面,繼承和封裝怎麼玩,泛型和相應的工具類怎麼用就可以上手了

總結

今天寫這篇文章自己在學習新語言中的體會,也剛好解釋了一個問題,就是為什麼很多程式設計師可以同時掌握多門語言?他們是怎麼做到的?他們為什麼會那麼多的精力?

其實答案就是,首先能區分和抽離 不同程式語言的基礎共性(知識) + 不同程式語言的特性(規則),先把程式語言的共性練習的足夠紮實,再去學習不同語言的特性規則,其實新語言學起來就容易得多,然後就是隨著使用實踐增加熟練程度,最後對整體架構的掌握,就可以做到熟練的切換和玩多種不同程式語言的程式

這雖然是看似很 coooool 的事情,但是背後都是付出的都是持續關注和投入時間,精力的過程,所以不要覺得很簡單,也不要覺得很困難,很多事情如果喜歡,做就是了