歡迎光臨
每天分享高質量文章

Hello World 的由來 | Linux 中國

沒有人能確切說出為什麼 Hello World 能在快速創新著稱的行業中經受住時間的考驗,但是它又確實留下來了。

— Thussong

 

資深軟體開發人員都知道 Hello World[1] 程式,這是一個能在設備顯示器上輸出某種變體的 “Hello, World!” 的程式,是學習編程的第一步。在這個編程中只涉及到一些最基本語法的程式,可以用大多數編程語言了來編寫。事實上,路易斯安納理工學院計算機協會(ACM)在最近統計發現[2]這個程式至少有 204 個版本。

傳統意義上,Hello World 程式是用於說明編碼過程是如何工作的,以及確保編程語言或系統能正常運行。它們經常是新手程式員學習的第一個程式,因為即使是經驗很少或者沒有經驗的人也能輕鬆正確的執行 Hello World。

首先,Hello World 簡單,這就是為什麼它經常被用做程式執行成功的晴雨表。如果 Hello World 在該框架中無法有效執行,那麼其它更複雜的程式中也可能會失敗。正如 Win-Vector[3]的一位專家所說,Hello World 實際上是一個對抗性程式。“該作者還說道,‘你的計算機系統能不能工作並不是一目瞭然,除非我能看到它至少能打印一行文字,否則我不會在上面浪費太多時間。’” Win-Vector 博主 John Mount 說。

但是這個兩詞短語在計算機科學領域有著重大的影響。以 Hello World 為基礎,新手程式員可以輕鬆的理解計算機科學原理或元素,而擁有多年編碼經驗的程式員可以用它來學習編程語言的工作原理,特別是在結構與語法方面。這樣的一個小程式,在任何難度的應用程式和幾乎所有語言中都有著悠久的歷史。

用途

以上概括了 Hello World 程式的主要用途:這是新手程式員熟悉新語言的一種方式。然而,這些程式不僅僅是對編碼世界的介紹。例如,Hello World 可以作為測試,以確保語言的組件(編譯器、開發和運行環境)安裝正確。因為配置完整的編程工具鏈的過程複雜而漫長,所以像 Hello World 這樣簡單的程式通常用作新工具鏈的首次運行測試。

根據 Cunningham & Cunningham(C2)的編程顧問所說,在系統設計人員並不預期可以執行代碼的地方,黑客經常使用 Hello World 程式作為一個可以通過漏洞執行任意代碼的概念驗證(POC)。事實上,它是在設備上使用自製內容或者“自釀”的第一步,當有經驗的編碼人員[4]正在配置環境或在學習新事物時,他們會通過 Hello World 來驗證其行為是否正確。

它也作為除錯過程的一部分,允許程式員檢查他們是否正確地編輯了可在運行時修改的程式並重新加載。

Hello World 的一個更常用的用途是作為基礎比較。根據 C2 的 wiki 所講,程式員可以“比較語言生成的可執行檔案的大小,以及程式背後必須存在多少支持的基礎設施才能執行。”

開端

雖然 Hello World 的起源還有些不太明瞭,不過人們普遍認為它作為測試用語,最早出現在 Brian Kernigham 在 1972 年發佈的《B 語言簡介教程A Tutorial Introduction to the Language B》中。在此文中,該程式的第一個已知版本用於說明外部變數。因為該教程中的前一個例子在終端上打印了 “hi!”,而需要更多的字符常量來表達相對複雜的 “hello,world!”,這是學習過程的下一步。

在那以後,它還被用於 1974 年的貝爾實驗室備忘錄,以及 1987 年的《C 語言程式設計The C Programming Language》。這兩篇著名的文字是讓 Hello World 聞名於世的主要原因。在書中的一個例子(第一個,也是最著名的例子)打印了沒有大寫字母和感嘆號的 “hello,world”。此時的 Hello World 幾乎只是用於說明語言的一些功能,而不是測試系統是否正常運行。

在 Kernigham 的關於 B 語言和 C 語言的開創性文章之前,沒有真正意義上的第一個程式,甚至直到 1974 年,它也沒被廣泛使用。著名的 BASIC 教程 “我的電腦喜歡我用 BASIC 跟它講話My Computer Likes Me,When I Speak BASIC”,從一個寫一行文本的簡單程式開始,不過那句話是 “MY HUMAN UNDERSTANDS ME”,跟如今程式員侃侃而談的這個雙詞問候語差的有點遠。不過,當 Hello World 被髮明後,它就迅速傳播,併在 20 世紀 70 年代後變成了眾所周知。直到今天它也依然受歡迎。

一個宣告,多種語言

以下是目前正在被使用的一些流行的編程語言中的 Hello World 代碼。

Java

  1. class HelloWorld {
  2.    public static void main(String[] args) {
  3.        System.out.println("Hello, world!");
  4.    }
  5. }

C#

  1. using System;
  2. class Program
  3. {
  4.    public static void Main(string[] args)
  5.    {
  6.        Console.WriteLine("Hello, world!");
  7.    }
  8. }

Python

  1. print("Hello, world!")

Ruby

  1. puts "Hello, world!"

Scala

  1. object HelloWorld extends App {
  2.    println("Hello, world!")
  3. }

ASP.NET

  1. Response.Write("Hello World!");

Lisp

  1. (princ "Hello, world!")

Haskell

  1. main = putStrLn "Hello, world!"

Malbolge

  1. ('&%:9]!~}|z2Vxwv-,POqponl$Hjig%[email protected]@>}=<9wv6wsu2t/>
  2. `CB]V?Tx

Go

  1. package main
  2. import "fmt"
  3. func main() {
  4.    fmt.Println("Hello, world!")
  5. }

如今的 Hello world:各種形式下的標準實踐

在現在的編程語言中,Hello World 有著不同的複雜程度。例如,Go 語言中引入一個多語言版的 Hello World 程式,XL 則會提供一個具有圖形、可旋轉的 3D 版本。一些編程語言,像 Ruby、Python,僅僅需要一個陳述句去打印“Hello World”,但是低級彙編語言則需要幾個命令才能做到這樣。現在的編程語言還引入對標點符號和大小寫的變化,包括是否有逗號或者感嘆號,以及兩個詞的大寫形式。舉個例子,當系統只支持大寫字母,會呈現像“HELLO WORLD”的短語。值得紀念的第一個 Malbolge 程式打印出了“HEllO WORld”(LCTT 譯註:Malbolge 是最難的編程語言之一。事實上,在它誕生後,花了 2 年時間才完成第一個 Malbolge 程式)。它的變體跨越了原本的字面意思。像 Lisp、Haskell 這樣函式語言,用階乘程式替代了 Hello World,從而註重遞迴技術。這與原來的示例不同,後者更強調 I/O 以及產生的副作用。

隨著現在的編程語言越來越複雜,Hello World 比以往顯得更加重要。作為測試和教學工具,它已經成為程式員測試配置的編程環境的標準方法。沒有人能確切說出為什麼 Hello World 能在快速創新著稱的行業中經受住時間的考驗,但是它又確實留下來了。


via: https://www.thesoftwareguild.com/blog/the-history-of-hello-world/

作者:thussong[6] 選題:lujun9972 譯者:zzzzzzmj 校對:wxy

赞(0)

分享創造快樂