一份可搜尋的參考資料,列出了十二個來源經過核實的 Hello World 程式,涵蓋 JavaScript、Python、Java、C、C++、C#、Go、Rust、Ruby、PHP、Swift 與 Kotlin——可依語言、執行環境、檔名或簡短的程式碼片段進行篩選——是給那些不想在部落格文章、Stack Overflow 解答及各語言說明文件分頁之間來回切換的開發者,最乾淨的「不同程式語言的 Hello World 替代方案」。參考頁面將十二個程式碼片段並列陳述,每個並附上典型的原始檔檔名,以及所屬的廣義執行環境家族,使該列能對應到你本機已安裝的官方編譯器或直譯器。頁面上不會執行、上傳或儲存任何內容;它是唯讀、純用戶端、無外部相依的,因此適合作為一份可直接複製的靜態速查表,無須擔心遙測、廣告腳本或貼上程式碼時的跳脫字元問題。由於每一列都展示了傳統的命令列進入點——直譯器呼叫、編譯後執行,或 .NET 專案建置——同一份參考資料既能在安裝新的工具鏈後作為首次執行的健全性檢查,也能在比較十幾種生態系如何表達同一行訊息時充當教學輔具。這份參考也標示了明確的範疇:Hello World 是一條能證明工具鏈可運作的狹窄路徑,頁面並不會假裝要教你套件管理、輸入處理、錯誤處理、測試、專案結構或部署。

為何 Hello World 範例會散落一地
典型 Hello World 搜尋的問題在於,搜尋結果的前幾名彼此互相矛盾。一篇教學預設你在 Visual Studio 中使用圖形應用程式範本;另一篇預設你使用 Jupyter cell;第三篇預設你使用完全不需要檔案的互動式 shell;第四篇則自從該語言變更了標準建置指令後就再也沒有更新過。為前一個主要版本編譯器所撰寫的程式碼片段,雖然今天仍可能建置成功、產生未使用變數的警告,或甚至因為標準程式庫已經異動而直接失敗。當初學者複製了第一個看起來還算合理的範例,隨之而來的第一次診斷訊息讀起來就像雜訊——「expected ';'」、「unresolved reference」、「module not found」——而錯誤訊息與該範例本應展示的語法規則之間的關聯,就此完全消失。
那種分散零碎的體驗,正是「不同程式語言的 Hello World」整合式參考資料之所以值得保留的原因。一列對應一種語言、一個傳統檔名、一個當前的命令列進入點,以及一段不借用無關建置系統範本的程式碼片段。這份參考縮減了跨工具鏈混搭範例的接觸面,讓讀者能挑出對應到自己實際安裝之編譯器或直譯器的那一列,而不必反推某篇老舊部落格文章當年使用的是哪一套建置系統。
十二種語言及其進入點
這份參考提供了十二個精簡的程式,使用各語言的標準進入點輸出同一段傳統訊息。每一列都標示了典型的原始檔檔名與所屬的廣義執行環境,使該片段可直接搬入工具鏈能識別的檔案中,而不會混入來自無關建置系統或圖形應用程式範本的內容。
| 語言 | 典型檔名 | 執行環境家族 | 傳統進入點 |
|---|---|---|---|
| JavaScript | hello.js | Node.js 或瀏覽器 | 頂層腳本;瀏覽器輸出會送至開發人員控制台 |
| Python | hello.py | CPython 直譯器 | 頂層腳本搭配 print();無須進入函式 |
| Java | HelloWorld.java | JDK / JVM | public 類別內含 public static void main(String[] args) |
| C | hello.c | 原生可執行檔 | int main(void) 回傳 int |
| C++ | hello.cpp | 原生可執行檔 | int main() 回傳 int |
| C# | Program.cs | .NET 專案 | .NET 專案檔內含靜態類別與靜態 Main |
| Go | hello.go | 原生可執行檔 | package main 內含 func main() |
| Rust | main.rs | 原生可執行檔 | fn main() |
| Ruby | hello.rb | CRuby 直譯器 | 頂層腳本搭配 puts |
| PHP | hello.php | PHP 直譯器 | 頂層腳本包覆於 <?php … ?> |
| Swift | main.swift | Swift 工具鏈 / 原生 | Swift 腳本中的頂層程式碼,或在型別上使用 @main |
| Kotlin | Main.kt | JVM 或 Kotlin/Native | 頂層 fun main(),或類別內含 fun main |
各列之間的差異並非風格上的差異。引號、分號、大括號、縮排、include 或 import 陳述式,以及換行跳脫字元,都是語言語法本身,而這份參考如實保留了這些差異。Python 使用縮排來表示區塊;C 家族範例在貼到會把直引號替換成彎引號的所見即所得編輯器時可能會出錯。某些語言允許省略分號,有些則強制要求,這就是為什麼每個片段都必須以完整區塊複製,而不是逐行拼湊。
這份參考也會標示每種語言的傳統命令列進入點,使讀者不會混淆——例如——Node.js 腳本與瀏覽器腳本。JavaScript 可以在瀏覽器控制台或 Node.js 中執行,但兩者的全域物件與模組規則不同;同一個 console.log 呼叫在一個環境中會輸出到開發人員控制台,在另一個環境中則會輸出到標準輸出。除此之外,標準輸出可能會經過緩衝或重新導向,因此這份參考所記錄的是傳統慣用的通道,而非對你本機終端機的保證。
尋找並複製 Hello World 片段
這份參考圍繞著四個簡短步驟設計。
- 在瀏覽器中開啟 不同程式語言的 Hello World 參考頁面。
- 在搜尋欄位中輸入語言名稱、執行環境關鍵字、典型檔名或簡短的程式碼片段;表格會即時篩選至符合的列。
- 複製符合列中的完整片段,包括任何前導的指令行、import 或 include 陳述式,以及結尾的大括號或標籤。
- 將該區塊貼入一個新檔案,檔名與「檔名」欄中所顯示的完全一致,並以工具鏈可接受的文字編碼儲存——大多數現代語言使用 UTF-8,較舊的 C 編譯器則使用 ASCII。
檔案儲存完成後,下一步就是使用官方工具鏈。這份參考刻意停在檔案邊界:複製下來的片段本身無法解決 PATH、編譯器、SDK 或版本的衝突;同一行範例在互動式 shell 中可能合法,但儲存成應用程式後卻可能需要進入函式、類別、套件宣告、編譯器呼叫或專案檔。
使用官方工具鏈執行程式碼片段
在片段以傳統檔名存到磁碟之後,從原始碼到輸出會分成四個實務類別。請挑選與上方「執行環境家族」欄相符的類別,並務必對照該語言目前的官方說明進行核對,因為工具鏈會持續演進。
直譯式語言
對於 Python、Ruby、PHP 與 Node.js,沒有獨立的編譯步驟。明確地將檔案傳遞給直譯器,以確保執行的是正確的版本——python hello.py、ruby hello.rb、php hello.php 或 node hello.js。以直譯器為導向的範例仍然依賴已安裝的執行環境以及負責挑選目標版本的指令,因此在預期「那段在互動式 shell 中能跑的程式碼,從檔案啟動時行為也會相同」之前,請先用 python --version 或 node --version 確認版本。
原生編譯型語言
對於 C、C++、Go、Rust 與 Swift,需要額外的步驟先產出可執行檔,程式才能執行。請使用該語言目前的官方編譯器驅動程式(C 與 C++ 用 gcc 或 clang、Go 用 go build、Rust 用 rustc、Swift 用 swiftc),然後執行所產生的二進位檔。當出問題時,每個編譯器會印出不同的第一道診斷訊息;原則是讀取診斷訊息的第一行,先與檔名及版本進行比對,再決定是否修改原始碼。
JVM 語言
Java 與 Kotlin 會先編譯為 JVM 位元組碼,然後在 Java Virtual Machine 上執行。Java 的傳統流程是 javac 接著 java;Kotlin 方面則是 Kotlin 編譯器(或建置工具的包裝指令)接著 JVM。兩種語言都要求原始檔中的類別名稱必須與內部宣告的 public 類別相符,而且 Java 範例特別需要那層外層類別,即便 Python 並不需要——這是進入點模型的差異,與該訊息的意義無關。
.NET 與瀏覽器 JavaScript
C# 通常是在 .NET 專案內建置,其中 Program.cs 是較大 csproj 結構中的一個檔案;在專案目錄中執行 dotnet run 就會建置並執行程式。瀏覽器 JavaScript 則是另一條路徑:程式碼片段會輸出到開發人員控制台,而非可見的頁面,因此預期的輸出會出現在 DevTools 中,而不是渲染後的 DOM 上。
這份參考刻意不涵蓋的範圍
這份參考刻意保持狹窄。它只示範「原始碼抵達標準輸出」(或對於瀏覽器 JavaScript 來說,抵達開發人員控制台)的這條路徑。它不會教你套件管理、輸入處理、錯誤處理、測試、專案結構、部署或慣用架構。下一張表格會把這個範疇講得更明確,避免讀者把那些屬於該語言官方生態系的缺口,錯怪到這份參考頭上。
| 面向 | 由參考涵蓋 | 由官方工具鏈負責,而非參考 |
|---|---|---|
| 首次執行的「能不能跑?」檢查 | 是——複製、儲存、執行、觀察輸出 | — |
| 傳統檔名與進入點 | 是——一種語言一列 | — |
| 編譯器或直譯器的呼叫方式 | 已標示,但不實際執行 | 以本機安裝的工具鏈執行 |
| 標準輸出與開發人員控制台輸出 | 是——僅有的輸出通道 | — |
| 輸入、錯誤、日誌、可觀測性 | 否 | 語言標準程式庫與生態系工具 |
| 測試 | 否 | 語言測試執行器(pytest、go test、cargo test 等) |
| 套件管理與相依性 | 否 | pip、npm、cargo、go mod、Maven、NuGet 等 |
| 專案結構、設定、建置檔 | 否 | 官方建置工具(Make、CMake、Gradle、MSBuild 等) |
| 部署 | 否 | 語言及平台的部署指南 |
| 慣用架構與設計模式 | 否 | 風格指南、語言導覽、真實專案 |
正式上線的應用程式應使用正規的日誌機制,而不是把教學式的 print 散落在對效能或隱私敏感的程式碼中。請勿僅為了證明某段程式路徑有跑過,就把密碼、權杖、Cookie、個人資料或機密的商業輸入寫進日誌;這種習慣從 Hello World 開始養成,若不及早替換,會一路帶到正式上線環境。
驗證程式碼片段與官方文件的一致性
由於工具鏈會持續演進,在複製任何程式碼片段後,建議的檢查方式就是與目前的官方文件進行簡短的比對。在工作過程中,有兩個參考資料值得保持開啟,兩者皆引用如下。
- 位於 docs.python.org 的 Python 內建 print 參考資料,確認了簽名、預設的結尾分隔符號,以及參考資料中 Python 程式碼片段所依賴的 file 參數。
- 位於 doc.rust-lang.org 的 Rust 書籍中關於 Hello World 的章節,確認了 Rust 程式碼片段所使用的 fn main() 進入點與 println! 巨集。
如果編譯失敗,契約其實很簡單:閱讀第一行診斷訊息,確認檔案名稱與版本與上表相符,然後將程式碼片段與官方文件逐字元比對。參考資料中的 12 個範例中,有 8 個是依據相關的官方語言文件所校對,其餘則使用跨語言比對來源,但當指令或檔案名稱有所變更時,官方來源永遠是最終的決定依據。
引號、分號、大括號、縮排,以及 import 或 include 陳述式都屬於語法的一部分,而非裝飾性的差異,所以請複製整個區塊,保留 ASCII 標點符號,並以工具鏈支援的編碼儲存。參考資料也透過資料表大小與唯一性測試來保護這 12 筆記錄,但實際編譯或解譯程式碼片段的本地工具鏈,仍然由使用者自行負責。
Hello World 之後 — 後續步驟
能夠運作的 Hello World 是入門票,而不是目的地。一旦訊息能夠正確列印,參考資料建議採取三個小步驟:
- 新增一個小型測試來驗證進入點 — 也就是單一斷言,確認程式的輸出包含預期的字串,並透過該語言的原生測試執行器來執行。
- 將原始檔案納入版本控制,並建立一個空的初始提交 (commit),以便未來的迭代能夠進行差異比對與還原。
- 學習該語言的官方建置與依賴管理流程 — Python 使用 pip 與虛擬環境,Node.js 使用 npm 或 pnpm,Rust 使用 cargo,Go 使用 go mod,.NET 使用 dotnet CLI,JVM 語言使用 Maven 或 Gradle,清單中的其他語言則使用對應的等效工具。
請刻意將第一次實驗保持小而可重現。一旦在某個 shell 環境中能成功建置並通過測試,該語言的其餘部分 — 其標準函式庫、生態系、慣用法與工具 — 便都開放可供探索。
相關閱讀:專為安全設計的 Linux 指令速查表替代方案。
相關閱讀:如何安全地合併欄位不同的 Excel 檔案。