30 年的 Hello world 已翻译 100%

oschina 投递于 2013/07/10 22:53 (共 26 段, 翻译完成于 07-13)
阅读 24190
收藏 98
16
加载中

最近我在7月4日这一天所在的那周休假了。休假期间,我利用大把的时间对我时至今日的职业生涯进行了反思。 意识到我现在写代码都写了快30年了,不免让我有些许震惊。因此我决定,要利用这段美好的休闲时光,写篇博文来怀怀旧,探究一下我在过去30年的工作中所用到的所有编程语言。且谨以此篇文章献给我以编写“Hello, World.”开始而学习各种新语言的30年美好时光。

TI BASIC是我所学习的第一门编程语言。它是由微软专为TI 99/4A微型计算机编写的一种特殊类型的BASIC方言。BASIC是Beginner’s All-purpose Symbolic Instruction Code的缩写,意思是初学者的通用符号指令代码。对于困在家中又无游戏可玩的7岁孩子来说,BASIC是再好不过的一门编程语言了。该语言采用行号来组织多行代码,要想在屏幕上显示点什么就可以象下面这样把要显示的内容“print出来”:

fbm
fbm
翻译于 2013/07/11 00:18
4

1981 – TI BASIC

ti994abasic

我花了几个月的时间用这种BASIC编写了一些“choose your own adventure(请你来选择你要扮演的角色来进行游戏)”类型的游戏,甚至花了更多的时间听着用来保存和恢复数据的黑色盒式磁带录音机发出的滋滋、啪啪和嘶嘶声。 我人生中最令我激动和最关键的时刻恐怕是多年后我父母把一台Commodore 64带回家的那个时刻。这个机器随机带有Commodore BASIC,或者叫做PET BASIC,而且可开箱即用。这种BASIC也是由微软编写的,它基于6502 Microsoft BASIC,也就是微软专为6520系列芯片而编写的BASIC,而苹果的机器那时所采用的也正好是这个系列的芯片。

fbm
fbm
翻译于 2013/07/11 00:41
3

1984 – Commodore BASIC

c64basic

其中的问号是PRINT命令的简写形式,下面那行中的奇怪字符是RUN命令的一种缩写形式(R SHIFT+U -在Commodore 64的键盘上,SHIFT加字符可以用来输入一些很酷的图形小片段,你可以拿这些图形小片段拼出一些基本看得过去的图片)。

很快我就发现,BASIC语言做不到我想做的所有事情。此时“演示场景(demo scene)”正在兴起,很多人都在编写令人叫绝的程序来挑战机器的能力极限。 他们会做一些类似让视频芯片画一些根本不可能画出来的图形或者把内容或更多数据滚动到屏幕边上“超界”的部分。完成这类壮举需要严格的时间顺序控制,而这种控制除了直接使用机器语言的代码别无它法。因此,我装上了机器监视器(机器监视器是能够让人将机器代码直接输入到内存中的软件的名字),写出了下面这段小程序:

fbm
fbm
翻译于 2013/07/11 01:16
1

1985 – 6502 机器码

c64machine

这段小程序会将一个索引装载到“Y-加法器”中,然后将始于$C100的内存中的字符一个一个的发送给ROM中的一个子程序,从而将这些字符显示出来。这就是for循环(for y = 0; y <= 0x0d, y++)所对应的机器码。RTS命令会从子程序中返回。为了执行这个程序,你还得使用内建的SYS命令呼叫出内存地址(很不幸,为此你不得不将16进制的$C000转换成10进制的49152,但除此之外其它的运行起来那叫一个顺畅)。我将表示“HELLO, WORLD”的PETSCII字符存储在了内存地址$C100处(是的,Commodore 64有它自己特殊的字符页(character page))。程序运行结果如下:

c64machinecall

fbm
fbm
翻译于 2013/07/11 01:27
1

当然,当我从原始的机器码转战到汇编语言时,日子就稍微好过了点。使用汇编语言,我就可以预先规划我的软件,而且还不用死记内存地址了,只需用标签来标记内存地址即可。上面那段机器码对应的完全相同的汇编程序可以如下来编写:

1986 – 6502 汇编语言

* = $C000       ;set the initial memory address
CHROUT = $FFD2  ;set the address for the character out subroutine
         LDY #$00 
LOOP     LDA HELLO, Y 
         CMP #$00          BEQ END 
         JSR CHROUT 
         INY 
         BNE LOOP 
END      RTS
HELLO    ASC 'HELLO, WORLD.' ; PETSCII
HELLOEND DFB 0 ; zero byte to mark the end of the string 

大约也就是这个时候,我意识到我是真的喜欢编写软件了。高中时我参加了一些课程,但他们教的不过是一些很愚蠢的小型Pascal语言,设计这种语言就是为了使学习如何编程变得“轻松一些”。真是轻松了吗?经过使用“机器监视器”徒手编写复杂的程序之后,我感觉Pascal实在是太过于轻松了。我还真是不得不承认,用Pascal编写“Hello, World”的语法实在是太简单了。

fbm
fbm
翻译于 2013/07/11 01:36
1

1989 – Pascal

program HelloWorld;
begin
  writeln('Hello, World.');
end

我想,在这时候,很时尚的小子们都在用C编程序呢。C是一种非常灵活的语言,它感觉就象是汇编语言之上的一些功能性的宏,而不像是一门新语言。因此我额外自学了C,但C我却只用了不长的一段时间。

1990 – C

#include <stdio.h>
main()
{
  printf("Hello World");
}

这段小程序包含了一个处理标准输入/输出的库,然后就在屏幕上输出了一段文字。C中的库使得C可以开发跨平台的应用 —— 不管是在Windows还是在Linux中调用的都是同一个函数,但库本身实现了能够运行于目标机的所有底层子程序。上面这段代码也是我多年后在Linux机器上首选摆弄的代码。如果那时你还没有入计算机这个行当,有些情况是我光用语言很难说明白的,那时要是你不弄个Linux自定义安装版,大家就觉得你不是个真正的程序员。我所说的“弄个自定义安装版”,意思是梳理Linux的源代码,将其按照你自己独特的硬件对Linux进行定制。其中最有意思的要数对显卡的处理了,要掌握监视器的“点时钟”情况,其中还需要施展各种奇巧淫技才能让主板很好的配合图形芯片一起工作。好吧,我跑题了。

fbm
fbm
翻译于 2013/07/11 01:55
1

C对我来说学起来真的不算是个挑战,但我很快就搞明白了,耍酷的小子们在做着不同的事情,正在学习一种称为“面向对象编程”的编程范型。机器码和汇编语言可能是和OO距离最远的东西了,从面向过程的编程转向面向对象的编程对我来说是个我乐于接受的挑战。在那时你还无法仅仅通过在线搜索来寻找学习资料(搜是可以搜的,但搜索机制和现在不同而且搜索结果也少之又少),因此我就出去买了一摞C++的书。 C++的确支持“对象”这个概念。它甚至还使用对象来表示流和管道,能够以对象的方式来对它们进行操作。面向对象还引入了命名空间的概念,以此来更好的管理代码的划分。说了这么多,这次“Hello, World”变成这样了:

1992 – C++

#include <iostream>
using namespace std;
int main()
{
  cout << "Hello World";
  return 0;
}

我一猛子扎进了大学,但令我失望的是,我的大学里并没有开设教授我所感兴趣的象C和C++这样的现代语言的课程。相反,我不得不应付差事的课程却是让我在一个叫做“Cypher”的大型机上用一种叫做Fortran的很有趣的语言来写作业。Fortran这种语言竟然很在意你把代码放到哪一栏中!没错,那时这种语言规定第1栏用来写注释,第1到5栏写语句的标签,第6栏用于续行字符,只有从第7栏你才能开始写真正的代码,我学到了足够多的Fortran,使我认识到我以后再也不想用这种语言编程了。

fbm
fbm
翻译于 2013/07/11 02:17
2

1993 – Fortran

       PROGRAM HELLOWORLD
       PRINT *, 'Hello, World!'
       END

那时我翘了大部分课程,把晚上的大部分时光花在了计算机房。在那里我使用的是我们大学的大型Unix机。在机房里我发现了Internet,学到了安装软件的“老式”的方法:下载软件源代码,build出可执行程序,查看错误,然后进行相应的调整和修复才能得到一个好用的软件。实话说,我还真不知道不学会那时的编程技术,你怎么才能学会使用Unix。那时我不断地探索和学习使用计算机系统的方式。当时我所做的最常见的一件事就是执行一个能够倒出大量信息的命令之后,再使用一些非常“顺手”的命令行工具对这些信息进行解析。那年我学到的最酷的语言之一就是PERL。虽然用“Hello, World.”这样简陋的例子做演示对PERL来说很不公平,但就先将就一下吧:

1993 – PERL

$welcome = "Hello World";
print "$welcome\n";

与此同时我很快发现了大量的World Wide Web(是的,那时我们就是这么称呼Internet的。Internet中运行的就是GopherArchie这类好玩的程序,World Wide Web只是Internet之上的一写文档而已)。HTML对我来说又是令一个飞跃,它使我第一次接触到了描述性UI。不用装入变量或字面量并使用一些关键字或子程序,我就能够将内容组织到一个页面之中。你可能会惊奇,直到20年后的今天,HTML页面的基本语法实际上根本都没怎么变。

fbm
fbm
翻译于 2013/07/11 02:39
1

1993 – HTML 

<html>
<head><title>Hello, World</title></head>
<body><h1>Hello, World</h1></body>
</html>

对我来说这是一段很有意思的时光。我从个人计算机(TI-99/4A和Commodore 64,还在很短的一段时间中用过Amiga)转向的大型机, 忽然之间我的PC真的只是变成了用来连接到Unix大型机的终端而已。我还在PC上运行了一个Linux操作系统,这是因为Linux是连接到Internet和网络的最快最方便的方式 —— Linux内置了TCP/IP协议栈,无需想老版本的Windows那样在操作系统之上再安装这个协议栈了(还有人记得NETCOM吗?)我的大部分工作是在大型机上完成的。

我真地意识到了,我在间接失去同PC世界的联系。显然那时疯狂的个人计算时代已经结束了,有两种机器渐渐成了接灰的摆设了:一种是对于我们中的大部分人来说的运行Windows的PC,另外一种就是对于设计者而言的Mac机器。PC已经过时了就是我当时的信念。那时我有个室友成天围着Mac转,用Mac来设计各种优惠卷。他有一大堆漂亮的图形设计程序,经常会把一个叫做Quark的软件调出来,然后问我:“你的PC里有这样的软件吗?”我会耸耸肩然后提醒他,我连一个圆或者正方形都不画,我要这样的图形软件有什么用?我喜欢我的PC,因为我懂软件,而且我也会数学,即使我没有画什么图,我肯定能够利用数学在计算机上画出分形图形或者粒子风暴图。当然要做到这些就需要有图形卡,通过TELNET连接到Unix机可干不了这些事,所以我开始学习PC编程了。那时在PC上用来编程的就是Win32和C++了。即使在今天的Visual Studio 2012中,你依然能够运行下面我说的这个例子。我不会用我原先在Win32下编写的有150多行代码的“HELLO.C”程序来烦你的。

fbm
fbm
翻译于 2013/07/11 17:06
3

1994 – Win32 / C++ (这个例子要稍稍新一些)

win32

打开一个命令行窗口然后运行这个程序后会得到这样的结果:

win32output

我的粒子流程序和曼德布洛特集合程序肯定在找工作方面帮不上什么忙,所以我必须再找另外的办法。令人啼笑皆非的是,我的职业在开始时同计算机竟然没有丝毫的关系。刚开始我为一家保险公司工作,工作内容是处理来自西班牙的电话索赔事务。情况就是这么个情况。在为一个薪水较低的工作接受面试时,我准备安心用这份微薄的薪水来户口,晚上再熬夜搞PC编程,我偶然提到我会说西班牙语。他们叫来他们的双语业务代表来面试我,我通过了测试。就在一周之内我得到了一个薪水更高的职位,因为我在短短的几个电话中学到了比我在整个高中几年里学到的还有多的西班牙语。

fbm
fbm
翻译于 2013/07/11 17:20
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(135)

彭添
彭添
Hello World !
TigerSub
TigerSub
Hello World
CodeChen
CodeChen
export LOGIN="hello world!"
echo $LOGIN

盔甲鱼
盔甲鱼
着实感慨了一把 外国比中国先进这么多 早就有的技术我大学时才接触
盔甲鱼
盔甲鱼
System.out.println("Hello world!");
n009ww
n009ww
we are the world
扣子
扣子
Hello World!
i
ivwwg
越来越复杂
TONE94
TONE94
碉堡了
umgsai
umgsai
World Hello!~
返回顶部
顶部