我对“Hello World”30年的爱恨情仇

我对“Hello World”30年的爱恨情仇

  我最近在 7 月 4 日的那一周休了一个假,因此有时间来回顾我的职业生涯。令我震惊的是,我已经写了近 30 年的代码了!于是,我决定好好利用这段额外的休息时间来创作一篇怀旧的帖子,回顾在过去近 30 年时间中我工作过的编程语言。向我从“Hello, World”开始学习新语言的 30 年致敬。

  我学习的第一种编程语言是 TI BASIC,BASIC 专门为微软 TI 99 / 4A microcomputer 而编写的一种语言。BASIC,即 Beginner’s All-purpose Symbolic Instruction Code(初学者通用符号指令代码),是一个 7 岁的、被约束在家里、没有游戏玩的孩子学习的完美语言。该语言用行号组织代码行,并且像这样在屏幕上展示内容:

我对“Hello World”30年的爱恨情仇

  1981 年 – TI BASIC

  我花了几个月的时间使用 TI BASIC 编写了“choose your own adventure”游戏,并且其中更多的时间是花在听黑色的盒式磁带记录器存储和恢复数据时发出的汽笛声,爆裂声,还有嘶嘶声。也许我年轻的生命中最令人激动和关键的时刻就是,几年后我的父母带回家一台 Commodore 64。这台机器提供开箱即用的 Commodore BASIC,或 PET BASIC。这也是微软基于 6502 Microsoft BASIC 而编写的,而 6502 Microsoft BASIC 专门为那个芯片系列而写,恰巧那时此芯片系列也同样可以服务 Apple 机器。

  1984 年 – Commodore BASIC

  问号是 PRINT 命令的简写,而之后奇怪的字符是输入 RUN 命令的省略方式(R SHIFT + U ——在 Commodore 64 键盘上提供出色的小的图形片段,你可以用它来制作基本的图片)。

  我很快发现,BASIC 不会做所有我想要它做的事情。 “demo scene”在那时一枝独秀,并且一群志同道合的人正在制作令人惊叹、将挑衅机器极限的程序。它们会做一些类似诱使 video chip 去绘制图形,去绘制那些原本应该是不可能的或滚动内容的或甚至是移动数据到屏幕“超出范围”边界部分的图形。实现这些特技需要精确的定时,而定时只能通过直接的机器语言代码才能实现。所以,我启动了机器监视器(允许你直接输入机器代码到内存的软件名称),并写了这个小程序:

我对“Hello World”30年的爱恨情仇

  1985 年 – 6502 Machine Code

  这个小 app 通过一个索引加载“Y-累加器”,然后通过始于$ C100 的内存旋转,一次发送一个字符到 ROM 子程序,ROM 子程序会将它们打印到显示器。这等同于机器代码中的一个 for 循环(for y = 0; y <= 0x0d, y++)。该 RTS 从子程序返回。为了执行程序,你必须使用内置的 SYS 命令,调出内存地址(不幸的是,你必须将十六进制值$ C000 转换为十进制 49152,但除此之外,这样的工作很有魅力)。我有用于“HELLO,WORLD”的 PETSCII 字符,保存在内存地址$ C100(是的,Commodore 64 有它自己特殊字符页)。

  下面是结果:

我对“Hello World”30年的爱恨情仇

  当然,生活中的话,当我从原始机器代码转移到程序集更容易。有了程序集,我可以预先计划好我的软件,并使用标签来标记存储区域,而无需记住内存地址。上面显示的相同程序可以这样写:

  1986 年 – 6502 Assembly

* = $C000; set the initial memory addressCHROUT = $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 RTSHELLO ASC 'HELLO, WORLD.' ; PETSCIIHELLOEND DFB 0 ; zero byte to mark the end of the string

  大约在那个时候我才意识到我真的很喜欢编写软件。我在高中学了一些课程,但所有他们教的是愚蠢的小 Pascal 语言,一种旨在使学习如何编程更“容易”的语言。真的?更容易吗?在使用机器监视器手工编码复杂程序之后,Pascal 感觉非常的矫枉过正。当然我不得不承认“Hello, World”的语法真的特别直接。

  1989 年 - Pascal

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fd791be3316fb1117261d7b0c883b975.html