本章節從宏觀角度探討程式語言的分類與本質,提出對於學習程式設計的「迭代學習法」。 同時,深入剖析了類型系統(Type System)如何影響我們的開發思維與效率。

1. 教學計畫:迭代學習法#

深入語言特性前,作者提出一種高效學習模式:迭代學習法

維度描述
定義在「具體知識」與「抽象理論」間增量式的循環學習
勝任要素 1才能:個人天賦與潛力基礎
勝任要素 2興趣:驅動持續探索的內在動力
勝任要素 3方法:建立自我學習的體系與路徑
勝任要素 4努力:達成目標所需的實踐與投入

一個好 「方法」 往往能激發潛藏的才能、維持長久興趣,並讓努力事半功倍。


2. 資料類型:規則與變通#

資料類型(Data Type)是程式語言的基石,它不僅具有針對機器的物理意義(記憶體佈局),更具有針對人的邏輯意義(語意表達)。

類型的核心要素#

  • 允許取值的集合:例如整數(Integer)有其數值邊界
  • 允許參與的運算:定義了該類型能進行哪些操作(如加減乘除或邏輯判斷)
  • 好處:保證程式碼的安全性,並提高抽象層級

關鍵區分:時間與強度#

在討論程式語言時,我們常混淆兩個維度:

維度分類檢查時機 / 約束強度核心特徵與影響
連結時間
(Check Time)
靜態 (Static)編譯期間 (Compile-Time)提前發現錯誤,執行效能較高,開發時需明確宣告
動態 (Dynamic)執行期間 (Run-Time)靈活性極高,代碼簡潔,但錯誤通常在運行時才爆發
約束強度
(Strictness)
強型別 (Strong)不允許隱式型別轉換嚴格要求型別一致性。例如:"1" + 2 會直接報錯
弱型別 (Weak)允許隱式型別轉換編譯器或解釋器會自動幫你轉型。例如:"1" + 2 可能變成 "12"
動態語言 vs. 靜態語言的詳細比較
特徵動態類型語言 (Dynamic)靜態類型語言 (Static)
檢查時機執行期間 (Run-Time)編譯期間 (Compile-Time)
變數宣告不需明確宣告,允許非繼承性多型需明確宣告類型
檢查哲學無罪推定(先跑再說,出錯再報)有罪推定(預設有錯,編譯通過才算對)
優點1. 程式碼簡明靈活
2. 易於重用
3. 適合泛型設計與快速原型 (Prototype)
1. 增強程式碼可靠性
2. 編譯器可最佳化,執行效率較高
3. 類型宣告即是輔助文件

3. 動態語言:穿著彩衣飛舞的腳本#

動態語言常被與「腳本語言(Scripting Language)」連結在一起。

維度腳本 (Scripting)程式 (Programming)
服務對象開發者/管理員 (內向型)終端使用者 (外向型)
執行機制解釋型:隨寫隨跑,無需預編譯編譯/連結型:需經過複雜的建構過程
主要角色膠水語言:連結不同模組或自動化任務地基語言:構建核心邏輯與基礎設施
開發效率高:語法簡潔,專注於流程自動化中/低:需考慮效能、穩定性與長期維護
典型語言Python, Shell, PowerShell, RubyC++, Java, Rust, Go
生命週期通常較短,隨任務完成而結束較長,需經歷多個版本的迭代與維護
維度動態語言 (Dynamic)靜態語言 (Static)
優化目標人工時間 (Human Time)機器時間 (Machine Time)
核心優勢開發極速、語法簡潔、靈活度高執行效能巔峰、穩定、型別安全
代價執行期開銷大,隱含邏輯錯誤風險開發週期長,需編寫大量 boilerplate 代碼
維護性小型專案極快,大型專案易混亂適合超大型、長週期、高可靠性系統
典型場景新創產品原型、腳本、Web 應用作業系統、遊戲引擎、高頻交易系統
代表語言Python, Ruby, JavaScriptC++, Rust, Go, Java

4. 語言誤區:打破宗教情結#

許多開發者對語言存有「宗教情結」,容易陷入無謂的爭論。作者對此提出了務實的看法。

關於語言的真相#

  1. 語言只有兩種
    • 一種是讓人怨聲載道的(流行的)
    • 一種是乏人問津的(沒人用的)
  2. 立身之本:對程式設計師而言,語言是工具,也是生存根本

技術含金量與薪資回報往往成正比。我們永遠需要比別人多掌握一門紮實功夫,而不是停留在語言優劣的口舌之爭。