TranslateProject/translated/tech/20150717 The History of Hello World.md

7.4 KiB
Raw Blame History

Hello World 的由来

资深软件开发人员都知道Hello world程序,一个能被输出多种"Hello, World!"的程序是学习编程的第一步。这个编程中只涉及到一些最基本语法的程序可以被大多数语言输出在显示器上。事实上路易斯安纳理工学院计算机协会ACM在最近统计发现这个项目至少有204个版本。

传统意义上Hello World程序是用于说明编码过程是如何工作的以及确保语言或系统能正常运行。它们经常是新手程序员学习的第一个程序因为即使是经验很少或者没有经验的人也能轻松正确的执行Hello World。

首先Hello World 简单这就是为什么它经常被用做程序执行成功的晴雨表。如果Hello World在框架中无法有效执行那么在其他更复杂的程序中也可能会失败。正如Win-Vector的一位专家所说,"Hello World实际上是一个对抗性程序"。该作者还说道,"你的计算机系统没有工作并不起眼,所有我们不会花很多时间在上面,不过我要看到它至少能打印一行文字"。

但是 这个两词短语在计算机科学领域有着重大的影响。以Hello World为基础新手程序员可以轻松的去理解计算机科学原理而拥有多年编码经验的程序员可以用它来学习编程语言的工作原理特别是在结构与语言方面。这样的一个小程序在任何难度和几乎所有的语言的应用程序中都有着悠久的历史。

用途

上文中一句话概括Hello World程序的主要用途这是新手程序员熟悉新语言的一种方式。然而这些程序不仅仅是对编码世界的介绍。例如Hello World 可以作为测试以确保语言的组件编译器开发和运行环境安装正确。因为配置完整的编程工具链的过程复杂而漫长所以像Hello World这样简单的程序通常用作新工具的首次运行测试。

根据Cunningham & Cunningham C2的编程顾问所说 黑客经常使用Hello World程序 来证明猜想因为任何代码都可以通过漏洞执行而系统设计人员并不允许执行代码。事实上它是在设备上使用自制内容或者“home brew”的第一步有经验的编码人员正在配置环境或在学习新事物时他们会Hello World 来验证动作是否正确。

它也是作为调试的一部分,允许程序员在程序运行时检查他么编辑修改了的地方是否正确,然后重新加载。

Hello World的一个更常用的用途是作为基础的比较。根据C2的wiki所讲程序员可以比较语言生成的可执行文件的大小以及程序背后必须存在多少支持基础结构才能执行。

开端

虽然Hello World 的起源还有些不太明了不过人们普遍认为它是作为测试用语最早出现在Brian Kernigham 在1972年发布的B语言教程简介中。在此文中该程序的第一个已知版本用于说明外部变量。因为教程中的前一个例子在终端上打印了“hi!”而需要更多字符常量来表达相对复杂的“hello,world!”,是学习过程的下一步。

在那以后它还被用于1974年的贝尔实验室备忘录以及1987年的C语言程序设计。这两篇著名的文章是让Hello World闻名于世的主要原因。在书中的一个例子第一个也是最著名的例子打印了没有大写字母和感叹号的“hello,world”此时的Hello World几乎只是用于说明语言的一些功能而不是测试系统是否正常运行。

在Kernigham的关于B语言和C语言的开创性文章之前没有真正意义上的第一个程序甚至直到1974年它也没被广泛使用。著名的BASIC教程“My Computer Likes MeWhen 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@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>

Go

package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}

如今的 Hello world: 各种形式下的标准实践

在现在的编程语言中Hello world有着不同的复杂程度。例如Go语言中引入一个多语言的Hello World程序XL则会提供一个具有图形、可旋转的3D版本。一些编程语言像RubyPython仅仅需要一个声明去打印"Hello World",但是低级汇编语言则需要几个命令才能做到这样。现在的编程语言还引入对标点符号的支持,包括逗号或者感叹号是否存在,以及两个词的大写。举个例子,当系统只支持大写字母,会呈现像"HELLO WORLD"的短语。第一个不平凡的Malbolge程序打印出了"HEllO WORld"跨域了原本的字面意思。功能语言像Lisp、Haskell阶乘程序替代了Hello World从而注重递归技术。这与原来的示例不同后者更强调I/O以及产生的副作用。

随着现在的编程语言越来越复杂Hello World 比以往显得更加重要。同样作为测试和教学工具它已经成为程序员测试配置的编程环境的标准方法。没有人能确切说出为什么Hello World能在快速创新著称的行业中经受住时间的考验但是它又确实留下来了。


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

作者:thussong 选题:lujun9972 译者:zzzzzzmj 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出