程式語言

Elementry
最後更新: 標籤: 介紹

你已經知道程式只是電腦遵循的指令清單。但這裡有個常見的問題:*那些指令是用什麼語言寫的?*答案幾乎從來不是單一一種語言——一旦你理解了為什麼,整個軟體世界就開始清晰起來。

為什麼有這麼多程式語言存在?

想想自然語言。英文很適合寫科學論文。日文的文法讓禮貌程度的表達非常精確。阿拉伯文在詩歌中流動得很美。每種語言都從使用它的人的文化和需求中成長起來。沒有哪種語言是「最好的」——它們各自在某些事情上很適合。

程式語言也類似。幾十年來,程式設計師不斷遇到現有語言在某項工作上顯得笨拙或緩慢的情況。所以他們發明了新的語言。每種新語言都做出取捨:寫起來更快,還是執行起來更快?適合初學者,還是對專家功能強大?避免 bug,還是靈活追求效能?

今天有數百種語言在使用中。但它們不是隨機的——它們傾向於圍繞它們解決的問題類型聚集。讓我們巡覽一下這些類別。

通用語言——以及社群如何在其周圍形成

你會遇到的大多數語言都是通用程式語言(general-purpose programming languages)——意思是沒有什麼能阻止你將它們用於幾乎任何任務。但在實踐中,社群、工具和函式庫已經圍繞某些使用案例成長,給了每種語言一個主場。

這個區別很重要。下面的類別——網路、原生應用程式、基礎設施——描述的是每種語言通常使用的地方,而不是只能使用的地方。Java 是大規模伺服器端網路應用程式的主導語言,但Minecraft 是用 Java 寫的。Rust 廣泛用於作業系統和 Cloudflare 的全球網路基礎設施,但你絕對可以用它來建立網路服務。Kotlin 是 Android 應用程式的首選,但它也在伺服器上運行。

把它想成料理:法國廚師可以做泰國菜,有些廚師做得很出色。但如果有人問「法國料理以什麼著名?」,你仍然會給出具體的答案。這些類別是真實且有用的——只是不要把它們誤認為是牆壁。

用於建立網路的語言

當你開啟一個網站,幕後發生了很多事情。有程式碼在你的瀏覽器中執行(前端(front end)),也有程式碼在某處的伺服器上執行(後端(back end))。不同的語言在每一側占主導地位。

JavaScript——瀏覽器的語言

JavaScript 是唯一一種瀏覽器能原生理解的程式語言。如果一個網站有任何互動行為——下拉選單、即時搜尋框、做某事的按鈕——幾乎肯定是 JavaScript 在背後。

JavaScript 在 1995 年的十天內被創造出來,從那以後一直是網路的核心。它有一些怪癖(用一個委婉的說法來描述「奇怪的行為」),但它也非常強大,並且在任何地方都能執行。

TypeScript 是一種直接建立在 JavaScript 之上的較新語言。它添加了一個型別系統——一種標記資料的方式,讓電腦在程式執行之前就能捕捉錯誤。今天大多數嚴肅的網路專案使用 TypeScript 而不是原始的 JavaScript。

伺服器端語言

伺服器——儲存你的資料並將其發送到你的瀏覽器的電腦——幾乎可以執行任何語言。一些流行的選擇:

  • Java 是世界上最古老且部署最廣泛的語言之一。它寫起來有些囉嗦但可靠,巨大的組織(銀行、航空公司、Google 的後端)把關鍵系統託付給它。「一次編寫,到處執行」是 Java 最初的承諾:一個 Java 程式無需重寫就能在任何電腦上執行。

  • Kotlin 是一種執行在與 Java 相同平台(JVM,Java Virtual Machine,Java 虛擬機器)上的現代語言。它修復了 Java 的許多粗糙之處,寫起來愉快得多。你可以在同一個專案中混合 Kotlin 和 Java 程式碼,所以公司可以逐步採用 Kotlin。

  • PHP 最初是一個向網頁添加動態內容的簡單工具,但它發展成了一門完整的語言,驅動了大量的網際網路——WordPress、Wikipedia 和 Facebook 都起步於 PHP。

  • Ruby 透過一個叫做 Ruby on Rails 的框架獲得了人氣,這個框架讓用令人驚訝少的程式碼建立一個功能完整的網路應用程式成為可能。它優先考慮開發者的幸福感和可讀性,雖然它為此犧牲了原始速度。

  • Elixir 是一種建立在非常古老且久經考驗的平台 Erlang(下文詳述)上的較新語言。Elixir 設計用於建立需要處理數百萬個同時用戶的系統——即時聊天應用程式、即時通知、多人遊戲。Discord 平台多年來使用 Elixir 處理數百萬個並發連線。

用於原生應用程式的語言

**原生應用程式(native app)**是直接在特定裝置和作業系統上執行的應用程式——而不是在瀏覽器內執行。原生應用程式往往更快,且能更好地存取裝置功能(相機、GPS、感應器),但它們需要針對每個平台以不同的方式編寫。

  • Kotlin(再次出現)是建立 Android 應用程式的主要語言。Google 在 2017 年採用它作為首選的 Android 語言,它已穩步取代了那個空間中的 Java。

  • Swift 是 Apple 用於在 iPhone、iPad 和 macOS 上建立應用程式的語言。Apple 在 2014 年發布 Swift 以取代一種叫做 Objective-C 的舊語言,後者以出了名的奇怪語法聞名。Swift 更易學,同時仍然非常快速。

  • C#(讀作「C sharp」)是 Microsoft 的語言,也是 .NET 平台的基石。C# 用於建立 Windows 桌面應用程式,但也因為 MAUI 等框架而支援跨平台應用程式。它也是你在 Unity 遊戲引擎中編寫腳本的語言。

  • C++ 是仍在大量使用的最古老的語言之一。它讓你對電腦硬體有極為精細的控制,這使它成為效能關鍵的原生應用程式的首選:AAA 電玩遊戲、圖形引擎、音訊處理軟體,以及每毫秒都很重要的應用程式。代價是 C++ 很難且容易出錯。

  • Dart 是 Google 的語言,主要為 Flutter 設計——一個讓你編寫一套程式碼並同時發布到 Android、iOS、網路和桌面的框架。Dart 相對較新,但因為 Flutter 的人氣而迅速成長。

用於基礎設施的語言

「基礎設施(infrastructure)」是一個廣泛的詞,涵蓋了使其他軟體成為可能的一切:作業系統、資料庫、網路工具、雲端服務、編譯器等。這些系統需要極快、極可靠,且通常在資源有限的硬體上執行。這裡由一種不同類別的語言主導。

  • C 是現代程式語言的祖父。大多數作業系統——Windows、macOS、Linux——主要用 C 編寫。你的微波爐、汽車、路由器裡的微控制器——許多都執行 C。它讓你直接存取記憶體和硬體,這既是它的超能力,也是它的危險所在:C 不保護你免受錯誤的影響,而那些錯誤可能導致嚴重的 bug。

  • C++ 也出現在這裡,因為它本質上是 C 加上了物件導向(object-oriented)特性。瀏覽器(Chrome、Firefox)、資料庫引擎(MySQL、PostgreSQL)和遊戲引擎通常都用 C++ 編寫。

  • Go(有時稱為 Golang)在 2009 年由 Google 創建。它設計成易於學習、編譯速度快,且非常擅長同時處理許多任務。Go 已成為現代雲端基礎設施的骨幹——Docker、Kubernetes 和 Terraform 等工具都是用 Go 編寫的。

  • Rust 是一種較新的語言(首次穩定發布於 2015 年),有一個大膽的抱負:與 C 和 C++ 一樣快,但安全。Rust 有一個系統,在編譯時捕捉整類的 bug——那種會讓程式崩潰或產生安全漏洞的 bug——在程式執行之前。這是你最終在本課程中將要學習的語言,它越來越多地被 Linux、Windows、網頁瀏覽器和嵌入式系統採用。

  • Erlang 在 1980 年代由 Ericsson(一家電信公司)建立,用於執行電話交換機——那種絕不能停機的系統。Erlang 有非凡的工具來優雅地處理故障並同時執行數百萬個輕量級行程。WhatsApp 的後端在 Erlang 上執行,以一支小型工程團隊著名地每天處理數十億條訊息。

  • COBOL(Common Business-Oriented Language,通用商業導向語言)在 1959 年設計,它仍然靜靜地執行著世界上大部分的金融基礎設施。你銀行的核心交易處理、社會安全付款背後的系統、航空訂位——大量的 COBOL 程式碼坐落在全球金融的基礎上。它以笨拙著稱,而懂得它的程式設計師越來越稀少,這實際上是一個重大的經濟問題。

不是每種「語言」都是通用程式語言

以上所有——JavaScript、Java、Rust、Go、Swift 等——共享一個關鍵屬性:它們是通用的。每一種原則上都可以應用於廣泛的問題。但在電腦科學中,有些「語言」是完全不同的東西。它們被建立來做一件事,並刻意放棄做其他任何事的能力。這些被稱為領域特定語言(domain-specific languages),或 DSL

SQL——資料庫的語言

SQL(Structured Query Language,結構化查詢語言,通常發音為「sequel」或拼出「S-Q-L」)用於與資料庫(databases)——組織好的資料存儲,如平台上的所有用戶、商店裡的所有產品,或銀行中的所有交易——通訊。

你不用 SQL「寫程式」,就像你用 Java 或 Rust 寫程式那樣。相反,你問問題:

-- "給我所有在 2024 年 1 月 1 日之後註冊的使用者姓名"
SELECT name
FROM users
WHERE signup_date > '2024-01-01';

SQL 在日常使用中不是圖靈完備的(意思是它無法像通用語言那樣表達任意計算),你也不會單獨用它來建立應用程式。但幾乎每個儲存資料的應用程式都在幕後使用 SQL——應用程式是用 Python 或 Ruby 或 Java 編寫的,而那些程式碼再向資料庫發送 SQL 查詢。

CSS——視覺樣式的語言

CSS(Cascading Style Sheets,層疊樣式表)描述網頁上的東西應該看起來如何:顏色、字型、大小、間距、版面。它與 HTML(描述頁面的結構)和 JavaScript(添加行為)一起使用。

CSS 在傳統意義上不是一種程式語言——它基本形式下沒有變數、沒有迴圈、沒有條件。你不是在給出要執行的指令;你是在宣告要應用的規則。如果一個段落有 warning 類別,讓它的文字變成紅色。如果螢幕寬度小於 600 像素,把這些欄位垂直堆疊而不是並排放置。

這些「語言」是軟體絕對必要的部分,即使它們不是用於通用程式設計的。程式是 JavaScript 或 Python 寫的,但那些程式不斷地生成或使用 SQL 和 CSS。理解這個區別——用於程式設計的語言用於描述某事的語言——是你深入研究科技時一個有用的心理模型。

一個充滿取捨的世界

沒有單一一種「最好的」程式語言,有經驗的開發者一生中會使用幾種。每種語言都是一組選擇:讓什麼變容易,讓什麼成為可能,讓什麼變得不可能。Rust 防止了整類的記憶體 bug。Python 讓資料分析程式碼容易寫。SQL 讓查詢結構化資料變得優雅。

你會發現學習第二種語言比學第一種容易得多,第三種比第二種容易。那些概念——迴圈(loop)、條件、函式(function)、資料結構——在所有語言中都會出現。語法改變;概念保持不變。

摘要

  • **程式語言(programming language)**是一種用於編寫電腦可以執行的指令的正式語言。今天有數百種在使用中,各有不同的優勢。
  • 網路前端:JavaScript(和 TypeScript)是瀏覽器能原生執行的唯一語言。
  • 網路後端:許多語言用於伺服器——Java、Kotlin、PHP、Ruby 和 Elixir 是常見的選擇。
  • 原生應用程式:Kotlin 用於 Android,Swift 用於 Apple 平台,C# 用於 Windows/.NET,C++ 用於高效能軟體,Dart 用於跨平台應用程式。
  • 基礎設施:C 和 C++ 用於作業系統和引擎;Go 用於雲端工具;Rust 用於安全的系統程式設計;Erlang 用於容錯的分散式系統;COBOL 用於舊有的金融基礎設施。
  • 領域特定語言(DSL),如 SQL 和 CSS,不是通用程式語言。它們描述或查詢特定的東西,在程式旁邊使用,而不是作為獨立程式本身。
  • 沒有語言是「最好的」。每種都是取捨,最好的開發者懂幾種。