01.28 Hello World 的由來

Hello World 的由來

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

-- Thussong

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

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

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

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

用途

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

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

class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello, world!");

}

}

C#

using System;

class Program

{

public static void Main(string[] args)

{

Console.WriteLine("Hello, world!");

}

}

Python

print("Hello, world!")

Ruby

puts "Hello, world!"

Scala

object HelloWorld extends App {

println("Hello, world!")

}

ASP.NET

Response.Write("Hello World!");

Lisp

(princ "Hello, world!")

Haskell

main = putStrLn "Hello, world!"

Malbolge

('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<9wv6wsu2t>

`CB]V?Tx<uvtt>

/<9wv6wsu2t>

Go

package main

import "fmt"

func main() {

fmt.Println("Hello, world!")

}

如今的 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 選題: lujun9972 譯者: zzzzzzmj 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出



分享到:


相關文章: