Hello World 程式是可將訊息「Hello, World!」寫入標準輸出 (standard output) 的最小可行範例,而每一種主流語言都內建一個能展示其進入點、語法規則與標準輸出機制的標準版本。十二個這類標準程式已並列彙整於 不同程式語言的 Hello World 參考資料中,涵蓋 JavaScript、Python、Java、C、C++、C#、Go、Rust、Ruby、PHP、Swift 與 Kotlin 在一般命令列下的形式。每一列都標示出典型的原始檔檔名,以及執行它所屬的廣義執行環境,讓學習者能在不混入不相關的建置系統或圖形應用程式樣板的條件下,直接比較語法差異。該參考資料為唯讀:它只會篩選並複製範例文字,絕不會代替您呼叫編譯器、開啟檔案或執行程式。您仍然需要本機端對應的工具鏈才能實際執行程式,而這種區隔相當關鍵,因為同一行程式文字在互動式 shell 中可能合法,但儲存為應用程式後,則需要進入函式、類別、套件宣告、編譯器呼叫或專案檔才能運作。

how to say hello world in different programming languages
how to say hello world in different programming languages

十二種語言參考資料涵蓋的內容

該參考資料為每種語言公開一筆記錄,各包含一個唯一識別碼、語言名稱、典型原始檔檔名、執行環境分類,以及完整的程式碼片段。涵蓋的語言為 JavaScript、Python、Java、C、C++、C#、Go、Rust、Ruby、PHP、Swift 與 Kotlin,挑選依據是它們分別代表了直譯、編譯為位元組碼,以及編譯為原生程式碼等主流工作流程的分布。這些片段刻意精簡,且各自遵循該語言在命令列下的慣例進入點。其中八個範例已對照官方語言文件進行核對,其餘則對齊一份跨語言比較來源,使前後文措辭與教學中所引用的參考資料一致。

此參考資料「不」涵蓋的範疇,與它涵蓋的內容同樣重要。一行範例雖能展示標準輸出,但無法教導套件管理、使用者輸入、錯誤處理、自動測試、專案結構、部署,或慣用架構。該參考資料絕不會宣稱所複製的片段就是完整的可上線專案。編譯式語言在執行前仍須經過明確的建置步驟;直譯式範例則仍須仰賴已安裝的執行環境與正確的版本選擇指令;而 JavaScript 在瀏覽器開發者主控台中的行為,與在 Node.js 下的行為也有所不同。

為何 Hello World 在不同語言之間會有差異

這十二個程式之間的差異並非裝飾性的。引號、分號、大括號、縮排、include 或 import 陳述式,以及換行跳脫字元,都屬於語言語法的一部分,各範例展示的都是該語言的最小合法形式。Python 使用縮排來界定區塊,因此其 Hello World 只是對內建 print 函式的一次頂層呼叫。C 家族的語言使用大括號與明確的 main 進入函式,所以即使輸出的訊息相同,程式碼片段看起來也更為厚重。Java 要求在 main 之外再包一層類別,而 Kotlin 則提供一個頂層的 main 函式,編譯後會產生相同的 JVM 位元組碼。C# 通常存在於帶有 Program 類別的 .NET 專案中,這也是為何一行 Console.WriteLine 呼叫仍需要周圍的結構才能運作。

輸出目標同樣有所差異。十二者大多會寫入主機行程的標準輸出,但 JavaScript 可在瀏覽器開發者主控台或 Node.js 下執行,且這兩種環境下的全域物件與模組規則並不相同。瀏覽器中的 JavaScript 會寫入主控台,而不是寫入可見的網頁。輸出訊息本身使用英文標點與慣例的逗號,一旦程式能正確執行,更改文字是安全的,但 Unicode 輸出可能會引發與語言本身無關的終端機編碼與字型問題。

如何尋找、複製並執行 Hello World 範例

此參考資料設計為可納入一個小型且可重複的循環流程。下列步驟刻意將實驗範圍縮小,讓任何失敗都能指向工具鏈,而不是您自己所撰寫的程式碼。

  1. 以語言名稱、執行環境、典型檔名,或一小段程式碼片段 (例如 println、printf、console.log 或 fmt.Println) 進行搜尋。該搜尋為純文字式,會對正規化欄位與片段本體進行比對。
  2. 完整且如實地複製所顯示的範例。請勿改寫、省略結尾大括號,或合併多行;這些片段的大小經過設計,完整複製即可維持程式合法。
  3. 將該段程式碼以該語言所標示的純文字檔名儲存。請使用能保留 ASCII 標點、直引號,以及符合您工具鏈所預期之換行字元的文字編輯器。Python 官方文件中關於內建 print 函式的章節,描述了與參考資料中相同的最小呼叫形式。
  4. 遵循該語言現行官方的編譯器或執行環境操作說明。編譯式語言需要明確的建置步驟;直譯式語言需要已安裝的執行環境,以及能選取指定版本的指令;而 JavaScript 可在瀏覽器主控台或 Node.js 中執行,但兩者的周邊規則並不相同。
  5. 確認輸出結果。預期的一行就是慣例的「Hello, World!」訊息。若程式已執行但沒有顯示任何可見輸出,請檢查該語言是寫入標準輸出還是開發者主控台,以及 stdout 是否被緩衝或重新導向。
  6. 首次執行成功後,加入一個小型測試、將原始碼納入版本控制,並學習該語言官方的建置與相依性工作流程。以 Rust 官方手冊的 Hello World 章節為例,它會帶您走過同一個入門程式,以及 doc.rust-lang.org 上的工具鏈設定。

十二種語言一覽

下表比較了這十二種語言各自的慣例檔名、建置或執行模型,以及輸出目標。檔名為典型而非強制,執行環境欄所列為廣義分類,並非指特定版本。

Language Typical source filename Build or runtime model Output target
JavaScript hello.js Browser console or Node.js Stdout or developer console
Python hello.py CPython interpreter Stdout
Java HelloWorld.java Compiles to JVM bytecode Stdout
C hello.c Compiles to native executable Stdout
C++ hello.cpp Compiles to native executable Stdout
C# Program.cs (or Hello.cs) Build within a .NET project Stdout
Go hello.go Compiles to native executable Stdout
Rust main.rs Compiles to native executable Stdout
Ruby hello.rb Ruby interpreter Stdout
PHP hello.php PHP interpreter Stdout
Swift hello.swift Compiles to native executable Stdout
Kotlin Hello.kt Compiles to JVM bytecode Stdout

編譯式與直譯式執行環境之間的區隔,是這份表格中最具參考價值的訊號。C、C++、Go、Rust 與 Swift 通常可從單一原始檔產生出原生可執行檔。Java 與 Kotlin 會編譯為 JVM 位元組碼,仍須仰賴 JVM 才能執行。C# 在結構上最接近 Java 與 Kotlin,但會在 .NET 專案內進行建置。Python、Ruby 與 PHP 屬於直譯導向,代表這類片段在互動式 shell 中可能合法,但儲存為檔案後仍須具備執行環境與版本選擇器。JavaScript 可在瀏覽器或 Node.js 中執行,兩者的全域物件與模組規則並不相同。

在不同語言之間複製片段時的常見陷阱

學習者將 Hello World 片段從一種情境複製到另一種情境時,常會反覆出現幾種錯誤。最常見的是貼到所見即所得的文字編輯器中,導致直引號被替換為花式引號,進而破壞所有 C 家族範例,因為編譯器會將花式引號視為一般字元,而非字串分隔符。其次常見的是以工具鏈無法識別的文字編碼儲存,尤其是像逗號、驚嘆號、換行字元這類在不同編碼間會產生差異的少數字元。

縮排與分號同樣會在跨語言複製時造成困擾。Python 使用縮排來劃分區塊,因此將 Python 片段刪去四個空格會導致語法錯誤。JavaScript、Java、C、C++、C#、Go、Rust 與 Swift 等語言允許或要求使用分號,且規則在這些語言之間也並不一致;Go 與 Rust 在某些情況下會自動補上分號,而 Java 與 C# 則多半要求每一行都明確寫出。若編譯失敗,第一個診斷訊息通常會指向缺少或多餘標點的那一行。確認檔名、工具鏈版本與命令列呼叫方式,通常能解決下一層的錯誤。

有兩種輸出行為值得特別注意。瀏覽器中的 JavaScript 會寫入開發者主控台,而不是寫入可見的網頁,因此呼叫 console.log 的腳本並不會改變 DOM。標準輸出也可能被緩衝或重新導向,這也是為何「腳本沒有任何可見輸出」未必代表它已經損壞。生產環境的應用程式應使用合適的日誌機制,而不是在效能敏感或隱私敏感的程式碼中散留教學式的 print 陳述式,而 Hello World 練習正好是學習這一課的好時機。字元編碼在此步驟中同樣重要,因為終端機字型與字碼頁對非 ASCII 位元組的呈現可能不一致;ASCII Code for Programming and Data Tasks 一文介紹了 Hello World 片段所依賴的七位元基本概念。

首次成功執行之後的下一步

Hello World 參考資料將首次成功執行視為一個檢查點,而非終點。下一步是撰寫一個小型測試,即使它僅僅是用來斷言輸出包含預期的訊息。接著,將原始碼納入版本控制系統,可以保留這個可運作的狀態,讓實驗得以重現,並提供一個基準,以便日後能夠針對變更進行差異比對。參考資料刻意在此打住;工具鏈、專案範本、相依套件管理、打包與部署,各自隸屬於不同的生態系,而這些內容的正確學習場所,就是你所選語言的官方文件。

參考資料中的十二筆記錄受到資料表大小與唯一性測試的保護,而經過驗證的範例則會與官方語言文件以及跨語言的比較來源進行核對。工具鏈會持續演進,因此在真實建置中信任這些當前指令與專案範本之前,務必先在上游進行驗證。刻意將第一個實驗保持得小而可重現,正是這一切的精髓所在。Hello World 程式是一條起點線,而非終點線。

若想深入了解,請參閱 為什麼 Hello World 會用於程式設計:實用指南