Hello World 是最小且可執行的程式,用來驗證工具鏈是否已安裝、語法是否能被辨識,以及輸出是否能從原始碼一路傳送到螢幕。它在程式設計中的目的並非教導某項功能,而是確認從人類撰寫的文字到實際執行指令的完整往返流程能夠端對端運作。這項確認之所以重要,是因為每種語言都有不同的慣例進入點:Python 預期一個腳本、Java 預期一個類別、C 預期一個編譯後的二進制檔,而瀏覽器則預期能寫入開發者控制台的 JavaScript。一個只印出一段訊息的簡短程式,就能揭露該語言的最低限度慣例,而無需引入程式庫、打包方式或專案檔案。由於這個範例非常短,其中的每個位元組都在執行明確可見的工作。缺少的匯入、副檔名不符、遺漏的大括號,或引號類型錯誤,都會立刻浮現出來,這正是為什麼 Hello World 幾乎成為所有程式語言預設的第一個練習。結合這項傳統與參考資料,Hello World 成為在撰寫任何實際程式碼之前,快速且可重複地確認新工具鏈是否真的能運作的方式。

Hello World 在程式設計中的起源與目的
Hello World 的傳統普遍被追溯至 Brian Kernighan 於 1972 年在 C 程式語言中的著作,當時使用一個簡短的列印範例來介紹語法。這個詞彙本身更早出現,但使用一個微型程式作為第一個練習的想法之所以流行,是因為它能隔離單一可觀察的行為:文字出現在輸出端某處。該行為會同時觸及編譯器、連結器、執行階段、標準程式庫,以及終端機或控制台。當訊息出現時,代表整個鏈結中的每個環節都已完成其工作。
Hello World 被使用,是因為它能讓錯誤顯而易見,卻又不至於付出高昂代價。缺少的分號、錯誤的檔名、遺漏的匯入,或未設定的 PATH,都會產生一個簡短且易讀的錯誤,並精確指出問題所在。學習者可以在程式變得龐大到足以掩蓋這些錯誤之前,先進行除錯。這就是為什麼 Hello World 仍是教科書、教學文件和入門指南中,幾乎每種通用語言(從 C 和 Python 到 Kotlin 與 Swift)的預設第一個程式。
它之所以被使用,也是因為它具有可重複性。相同的訊息、相同的檔名、相同的指令,以及相同的預期輸出,為每位學習者提供了一個共同的參考點。如果兩個位於不同國家的學習者在執行相同的指令後,看到相同的詞彙,就代表他們的環境是一致的。這種可重複性,正是 Hello World 能用於教學工具鏈、比較語法,以及在無需撰寫實際軟體的情況下對語言進行基準測試的原因。
Hello World 程式實際展示了什麼
Hello World 程式一次展示了四件事:原始檔案的配置方式、進入點的慣例、從原始碼到執行的路徑,以及從執行到輸出的路徑。這四個部分在各種語言之間各不相同,這就是為什麼一個微型程式能傳授如此多的內容。
原始檔案的配置方式包含副檔名與編碼。C 預期一個 .c 檔案、Java 預期一個檔名與公開類別相符的 .java 檔案、Python 通常使用 .py,而 Go 使用 .go。進入點的慣例是第二個課題。Python 使用內建的 print 函式從上到下執行腳本,詳情請參閱官方 Python print 函式文件。Java 要求一個帶有 main 方法的類別。C# 通常要求一個用於建置組件的專案檔。Go 預期一個帶有 main 函式的 main 套件。Rust 預期一個帶有 main 函式的二進制 crate。每種語言都定義了自己的形式。
從原始碼到執行的路徑揭示了工具鏈的特性。某些語言(如 Python 和 Ruby)僅需要直譯器。其他語言(如 C、C++、Go、Rust 和 Swift)則會將原始碼編譯為原生可執行檔後再執行。Java 與 Kotlin 會編譯為在虛擬機器上執行的 JVM 位元組碼。C# 會編譯為在 .NET 執行階段中執行的中介語言。從執行到輸出的路徑是最後一個課題。命令列程式會列印到標準輸出,瀏覽器中的 JavaScript 會列印到開發者控制台,而少數範例則使用日誌程式庫而非直接的 print 陳述式。第一個 Hello World 實際上就是對這四個層次的導覽,全部壓縮在短短幾行程式碼中。
Hello World 在 12 種程式語言中的差異
這些差異雖然微小,但卻至關重要。以下是 不同程式語言中的 Hello World 參考資料所涵蓋的 12 種語言的比較,展示了慣例的進入點以及執行時實際發生的事情。
| 語言 | 典型檔名 | 慣例進入點 | 執行階段會發生什麼 |
|---|---|---|---|
| JavaScript (Node.js) | hello.js | 腳本不需要進入函式 | 直譯器列印到控制台 |
| Python | hello.py | 頂層腳本 | 直譯器列印到標準輸出 |
| Java | Hello.java | 帶有 main 方法的 public 類別 | 編譯為位元組碼,JVM 執行它 |
| C | hello.c | int main(void) | 編譯為原生可執行檔 |
| C++ | hello.cpp | int main() | 編譯為原生可執行檔 |
| C# | 專案中的 Hello.cs | 頂層陳述式或帶有 Main 的類別 | 建置組件,.NET 執行它 |
| Go | hello.go | 帶有 func main 的 package main | 編譯為原生可執行檔 |
| Rust | 二進制 crate 中的 hello.rs | fn main | 編譯為原生可執行檔 |
| Ruby | hello.rb | 頂層腳本 | 直譯器列印到標準輸出 |
| PHP | hello.php | 帶有可選起始標籤的頂層腳本 | 直譯器列印到標準輸出 |
| Swift | hello.swift | 頂層腳本或 @main | 編譯為原生可執行檔 |
| Kotlin | Hello.kt | fun main | 編譯為 JVM 位元組碼 |
每個進入點的形式正是參考資料所標準化的內容。透過保持訊息不變並讓工具鏈明確化,比較就能聚焦於語言本身,而非花在列印文字的創意方式上。
如何尋找並複製任何語言的 Hello World 範例
若要並排比較 Hello World 程式而無需從頭撰寫每一個,請開啟「不同程式語言中的 Hello World」參考資料。以下步驟說明了支援的工作流程。
- 依語言、執行階段、檔名或一小段程式碼進行搜尋。搜尋會在這些欄位之間進行正規化處理,因此輸入「Java」、「.java」或「System.out」應該會顯示同一列。
- 將完整的範例複製到所顯示的純文字檔名中。請勿移除匯入、套件宣告或結尾的換行符號;該程式碼片段假設的就是這些精確的文字。
- 使用該語言目前的官方編譯器或執行階段說明。工具鏈會變動,因此該頁面不會嵌入指令;這個程式碼片段僅顯示原始碼。
- 確認輸出後,新增測試並學習真正的專案工作流程。成功的 Hello World 是課程的起點,而非終點。
這個流程能讓比較保持公正。該頁面不會執行程式碼片段、不會開啟檔案,也不會解析你的 PATH 上是哪個編譯器。它只會回傳參考文字。實際的建置與執行指令來自所選語言的官方文件,而該文件是你作業系統上精確旗標集合唯一可信的來源。
複製 Hello World 程式碼片段時的常見陷阱
將原始碼複製到所見即所得編輯器中,可能會引入破壞程式的隱性變更。彎引號會取代直引號,智慧型撇號會取代 ASCII 撇號,而在依賴縮排的語言中,定位點會取代空格。參考程式碼片段使用 ASCII 標點符號,以保持比較的公平性,但你所貼入的編輯器可能並非如此。請使用純文字編輯器,或以純文字方式貼上,以保留原始位元組。
第二個陷阱是檔名不符。Java 預期檔名與公開類別相符。C 與 C++ 預期檔名與你傳遞給編譯器的名稱相符。Go 與 Rust 使用檔名來識別套件或 crate,雖然其編譯器較為寬容。將檔案重新命名為方便的名稱(例如 test.txt)可能會將真實錯誤隱藏在無用的診斷訊息背後。在首次執行成功之前,請保留建議的檔名,之後再隨意重新命名。
第三個陷阱是將 Hello World 視為完整的專案。它並非如此。實際的應用程式包含套件管理、錯誤處理、測試、設定組態,以及部署。單一的 print 陳述式只能證明工具鏈能運作,除此之外什麼也證明不了。該參考資料是唯讀且刻意精簡的。它僅展示標準輸出,並不會教導相依套件的安裝、輸入解析或架構模式。請用它來確認起點,接著再進入你所選語言的官方建置與專案工作流程。
第四個陷阱是將 Hello World 視為一種日誌紀錄策略。生產環境中的程式碼很少能從散落的 print 呼叫中獲益,而教學範例中洩漏密碼、權杖、Cookie、個人資料或機密商業輸入的 print 陳述式,會造成真正的安全性問題。Hello World 的首次執行沒問題,但將這些 print 陳述式留在生產程式碼中則不可。一旦程式超出單一範例的規模,請將教學範例的 print 替換為適當的日誌紀錄。
Beyond Hello World: What to Learn Next
After Hello World prints once, the next lesson is the build and dependency workflow for the chosen language. For Python, that is virtual environments and pip. For Java and Kotlin, that is Maven or Gradle. For C and C++, that is a build system such as CMake or Meson. For Go, that is the module system and go.mod. For Rust, that is cargo. For C#, that is dotnet and a .csproj file. For Swift, that is Swift Package Manager. For Ruby, that is Bundler. For PHP, that is Composer. For JavaScript, that is npm or another package manager, plus the difference between Node.js and the browser.
The next lesson after the build system is a small test. Pick a tiny behavior, write a test for it, and watch the test pass. The point is to learn what "verified" means in the language you have chosen, not to over-engineer the example. Once a test exists, version control the source. A first commit should include the Hello World file and nothing else, so history is easy to read. Each of these steps is small on its own and large in the long run. Together they convert Hello World from a curiosity into the first commit of a real project.
A final lesson is to recognize the limits of the reference itself. Toolchains evolve, and the official documentation is the source of truth for current commands, project templates, and dependency managers. The reference shows minimal source text for twelve languages. It does not show the surrounding ecosystem, and it does not claim that one language is better than another because its Hello World is shorter. Shorter Hello Worlds reflect different entry-point conventions, not different capabilities. A one-line Python script and a one-page Java class can solve the same problem in production; the verbosity is a cost of the entry point, not a cost of the language.