“Hello, World!“ 历史由来

布莱恩·W.克尼汉(Brian W. Kernighan)------ Unix 和 C 语言背后的巨人

布莱恩·W.克尼汉在 1942 年出生在加拿大多伦多,他在普林斯顿大学取得了电气工程的博士学位,2000 年之后取得普林斯顿大学计算机科学的教授教职。

1973 年,他与 Shen Lin 合作共同完成了两个知名的 NP-complete 优化问题的解决方案:图划分问题和旅行推销员问题。

Graph partition 图形分区

在数学中,图分区是通过将图的节点集划分为互斥的组来将图简化为较小的图。在组之间交叉的原始图的边将在分区图中产生边。如果生成的边的数量与原始图相比较小,则分区图可能比原始图更适合分析和解决问题。

通常,图分区问题属于NP难题的范畴。这些问题的解决方案通常使用启发式和近似算法得出。然而,均匀图分区或平衡图分区问题可以证明在任何有限因子内都是 NP 完备的。

S. Lin and B. W. Kernighan.1970

An Efficient Heuristic Procedure for Partitioning Graphs
http://eda.ee.ucla.edu/EE201A-04Spring/kl.pdf
旅行推销员问题(Travelling Salesman Problem, 又称为旅行商问题)

TSP 问题是一个多局部最优的最优化问题:有 n 个城市,一个推销员要从其中某一个城市出发,唯一走遍所有的城市,再回到他出发的城市,求最短的路线。

S. Lin and B. W. Kernighan.1973

An Effective Heuristic Algorithm for the Traveling-Salesman Problem
https://www.cs.princeton.edu/~bwk/btl.mirror/tsp.pdf

布莱恩·W.克尼汉不仅是著名的 K&R(Kernighan and Ritchie)中的 K,是 AWK(Alfred Aho、Peter Weinberger 和 Brian Kernighan)中的 K,也是 AMLP(A Mathematical Programming Language,数学编程语言)的创造者之一。

在编译器 Ratfor、文档编制预处理器 Pic、Grap 和数学排版语言 Eqn 等这些重要研究成果背后都有布莱恩·W.克尼汉参与的身影。

1974 年,他写的第一本书,是和比尔・普劳格合著的《The Elements of Programming Style》,在这本书中出现了一个以他名字命名的定律 ------Kernighan's Law

Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?

-- Brian Kernighan, 1974

Kernighan's Law每个人都知道,调试在一开始就比编写程序困难一倍。那么,如果您在编写它时尽可能地巧妙,又如何来调试它?

1976 年,他和比尔・普劳格合著《Software Tools》,意在向非 UNIX 系统上编写 Fortran 的程序员传播 UNIX 工具理念。

软件工具

所谓 "软件工具" 就是计算机用户为了设计和实现其所要求的实用程序而运用的一整套方法和措施。

作者选用 Raton (Rational Fortran) 这种结构语言以试图广泛地阐述设计和实现较为理想的各种程序设计方法。

了解 Fortran,PL/1,Cobol,Algol,Pascal 等一类语言的读者很快就会掌握 Ratfor 这种结构语言程序。并以这种程序为基础,去理解掌握和设计书写具有广泛使用价值的好程序;去使用现有的一些方法或者改进一些原有的方法编写出高效而可靠的应用程序。

1978 年,他与 C 语言之父丹尼斯・里奇合著了《The C Programming Language》,该书广为人知,被 C 语言开发者们尊称为 "K&R 手册" 和 "C 语言圣经",多年来被当作 C 语言的 K&R C 非正式的标准说明。作为 编程语言入门的示范传奇程序 "Hello, World!"------ 计算机行业人踏上代码征程的初始徽章,也源于本书

布莱恩·W.克尼还撰写了《The Unix Programming Environment》,本书对 UNIX 操作系统的编程环境做了详细而深入的讨论和指导。

布莱恩·W.克尼汉在普林斯顿大学为非计算机专业学生开设了一门介绍计算机技术基础的课程,根据课程讲义编写《D is for digital》。书中解释了当今计算和通信领域的工作方式,讨论了新技术带来的社会、政治和法律问题。

2011 - D is for digital -- What a well-informed person should know about computers and communications

2017 - Understanding the Digital World -- What You Need to Know about Computers, theInternet, Privacy, and Security

Hello World

1972 年,在贝尔实验室成员布莱恩·W.克尼汉撰写的内部技术文件《A Tutorial Introduction to the Language B》中首次提到了 "Hello World" 这一字符串。当时,他使用 B 语言撰写了一个用于演示外部变量的示例程序:

B 复制代码
main( ) {
    extern a, b, c;
    putchar(a); putchar(b); putchar(c); putchar('!*n');
}
 
a 'hell';
b 'o, w';
c 'orld';

这个程序将在终端打印出 "hello, world",然后附上一个换行符。之所以这一短语被拆分成多个变量记录,是因为 B 语言中的每个字符常量只能容纳 4 个 ASCII 字符。

1974 年,时值 C 语言取代 B 语言,在贝尔实验室的又一内部备忘录《Programming in C: A Tutorial》中,布莱恩·W.克尼汉用 C 语言再次编写了一个 Hello World 程序作为教学示例。这一程序在他和丹尼斯・里奇于 1978 年出版的《The C Programming Language》中得到继承:

C 复制代码
main( ) {
        printf("hello, world\n");
}

由布莱恩·W.克尼汉撰写的"Hello, world"程序 (1978年)

在上例中,main () 函数定义了程序开始执行的位置。其主体由一条语句组成,即对 printf (print formatted,打印格式化)函数的调用,将使程序输出以参数传递给它的任何内容,在本例中是字符串 hello, world。

自此,Hello World 成为了电脑程序员学习新的编程语言的传统。但是,也有些人认为 hello, world 的字符串早于 1966 年的 BCPL 语言出现的时候已经出现。虽然相关的字词确实在发明者记录的文件出现,但是可以肯定的是,Hello World 在当时确实没有流行。因此,人们公认为布莱恩·W.克尼汉是令该字符串走进公众目光的人。

via : Hello World https://zh.wikipedia.org/wiki/Hello_World

纵观编程历史,"Hello World" 在向初学者介绍编码世界方面发挥了至关重要的作用。

虽然 "Hello World" 看似微不足道,但它不仅是一个初学者进入编程世界第一步的简单程序,也是承载着编码无限可能性之旅的开始。

扩展阅读

  1. "Hello, World"的历史 ------ The History of 'Hello, World' - HackerRank Blog

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

  2. 300 种编程语言的 Hello World 程序列表 ------ List of Hello World Programs in 300 Programming Languages -- MYCPLUS

    https://www.mycplus.com/featured-articles/hello-world-programs-in-300-programming-languages/

相关推荐
帅次9 天前
基于边缘计算的智能门禁系统架构设计分析
软件工程·团队开发·软件构建·需求分析·规格说明书·代码复审·极限编程
冰暮流星1 个月前
极限编程XP例题
笔记·极限编程
码力码力我爱你3 个月前
C++现代教程四
开发语言·c++·算法·极限编程
斐夷所非4 个月前
挑战英伟达的护城河 —— SCALE 源码直译让 CUDA 程序跑上 AMD
极限编程
斐夷所非4 个月前
I18N/L10N 历史 / I18N 指南 / libi18n 模块说明
极限编程
斐夷所非4 个月前
优化页面加载时间
极限编程
斐夷所非4 个月前
Code Page 历史
极限编程
Dreammmming Time5 个月前
JAVA Thread.yield()方法(请求释放CPU)的理解及在ForkJoinPool中的使用
java·多线程·极限编程·时间片
胡斌附体7 个月前
软考之零碎片段记录(三)
低代码·软考·极限编程·并列争球法