30 年的 Hello world

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

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

1981 – TI BASIC

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

1984 – Commodore BASIC

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

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

1985 – 6502 机器码

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

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

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”的语法实在是太简单了。

1989 – Pascal

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

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

1990 – C

#include main() { printf(“Hello World”); }

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

看着你手中的戒指,你说,你可以把它取下来吗?

30 年的 Hello world

相关文章:

你感兴趣的文章:

标签云: