TIBASIC是我所学习的第一门编程语言。它是由微软专为TI99/4A微型计算机编写的一种特殊类型的BASIC方言。BASIC是Beginner’sAll-purposeSymbolicInstructionCode的缩写,意思是初学者的通用符号指令代码。对于困在家中又无游戏可玩的7岁孩子来说,BASIC是再好不过的一门编程语言了。该语言采用行号来组织多行代码,要想在屏幕上显示点什么就可以象下面这样把要显示的内容“print出来”:
1981–TIBASIC
1984–CommodoreBASIC
其中的问号是PRINT命令的简写形式,下面那行中的奇怪字符是RUN命令的一种缩写形式(RSHIFT+U-在Commodore64的键盘上,SHIFT加字符可以用来输入一些很酷的图形小片段,你可以拿这些图形小片段拼出一些基本看得过去的图片)。
这段小程序会将一个索引装载到“Y-加法器”中,然后将始于$C100的内存中的字符一个一个的发送给ROM中的一个子程序,从而将这些字符显示出来。这就是for循环(fory=0;y<=0x0d,y++)所对应的机器码。RTS命令会从子程序中返回。为了执行这个程序,你还得使用内建的SYS命令呼叫出内存地址(很不幸,为此你不得不将16进制的$C000转换成10进制的49152,但除此之外其它的运行起来那叫一个顺畅)。我将表示“HELLO,WORLD”的PETSCII字符存储在了内存地址$C100处(是的,Commodore64有它自己特殊的字符页(characterpage))。程序运行结果如下:
当然,当我从原始的机器码转战到汇编语言时,日子就稍微好过了点。使用汇编语言,我就可以预先规划我的软件,而且还不用死记内存地址了,只需用标签来标记内存地址即可。上面那段机器码对应的完全相同的汇编程序可以如下来编写:
1986–6502汇编语言
*=$C000;settheinitialmemoryaddressCHROUT=$FFD2;settheaddressforthecharacteroutsubroutineLDY#$00LOOPLDAHELLO,YCMP#$00BEQENDJSRCHROUTINYBNELOOPENDRTSHELLOASC'HELLO,WORLD.';PETSCIIHELLOENDDFB0;zerobytetomarktheendofthestring大约也就是这个时候,我意识到我是真的喜欢编写软件了。高中时我参加了一些课程,但他们教的不过是一些很愚蠢的小型Pascal语言,设计这种语言就是为了使学习如何编程变得“轻松一些”。真是轻松了吗?经过使用“机器监视器”徒手编写复杂的程序之后,我感觉Pascal实在是太过于轻松了。我还真是不得不承认,用Pascal编写“Hello,World”的语法实在是太简单了。
1989–Pascal
1990–C
#include
C对我来说学起来真的不算是个挑战,但我很快就搞明白了,耍酷的小子们在做着不同的事情,正在学习一种称为“面向对象编程”的编程范型。机器码和汇编语言可能是和OO距离最远的东西了,从面向过程的编程转向面向对象的编程对我来说是个我乐于接受的挑战。在那时你还无法仅仅通过在线搜索来寻找学习资料(搜是可以搜的,但搜索机制和现在不同而且搜索结果也少之又少),因此我就出去买了一摞C++的书。C++的确支持“对象”这个概念。它甚至还使用对象来表示流和管道,能够以对象的方式来对它们进行操作。面向对象还引入了命名空间的概念,以此来更好的管理代码的划分。说了这么多,这次“Hello,World”变成这样了:
1992–C++
#include
1993–Fortran
PROGRAMHELLOWORLDPRINT*,'Hello,World!'END那时我翘了大部分课程,把晚上的大部分时光花在了计算机房。在那里我使用的是我们大学的大型Unix机。在机房里我发现了Internet,学到了安装软件的“老式”的方法:下载软件源代码,build出可执行程序,查看错误,然后进行相应的调整和修复才能得到一个好用的软件。实话说,我还真不知道不学会那时的编程技术,你怎么才能学会使用Unix。那时我不断地探索和学习使用计算机系统的方式。当时我所做的最常见的一件事就是执行一个能够倒出大量信息的命令之后,再使用一些非常“顺手”的命令行工具对这些信息进行解析。那年我学到的最酷的语言之一就是PERL。虽然用“Hello,World.”这样简陋的例子做演示对PERL来说很不公平,但就先将就一下吧:
1993–PERL
1993–HTML
我真地意识到了,我在间接失去同PC世界的联系。显然那时疯狂的个人计算时代已经结束了,有两种机器渐渐成了接灰的摆设了:一种是对于我们中的大部分人来说的运行Windows的PC,另外一种就是对于设计者而言的Mac机器。PC已经过时了就是我当时的信念。那时我有个室友成天围着Mac转,用Mac来设计各种优惠卷。他有一大堆漂亮的图形设计程序,经常会把一个叫做Quark的软件调出来,然后问我:“你的PC里有这样的软件吗?”我会耸耸肩然后提醒他,我连一个圆或者正方形都不画,我要这样的图形软件有什么用?我喜欢我的PC,因为我懂软件,而且我也会数学,即使我没有画什么图,我肯定能够利用数学在计算机上画出分形图形或者粒子风暴图。当然要做到这些就需要有图形卡,通过TELNET连接到Unix机可干不了这些事,所以我开始学习PC编程了。那时在PC上用来编程的就是Win32和C++了。即使在今天的VisualStudio2012中,你依然能够运行下面我说的这个例子。我不会用我原先在Win32下编写的有150多行代码的“HELLO.C”程序来烦你的。
1994–Win32/C++(这个例子要稍稍新一些)
打开一个命令行窗口然后运行这个程序后会得到这样的结果:
1995–RPG
I'HELLO,WORLD'CHELOCHELODSPLYCSETONLR请注意每行的第一个字符表明的是各行的代码类型(实际上它还应该多占几列,但我故意省略了其中的一些空白处)。第一行定义了一个常量,然后第二号将该常量显示到屏幕上,最后第三行是一个让程序结束执行的指示符。
1995–COBOL
IDENTIFICATIONDIVISION.PROGRAM-ID.HELLO.ENVIRONMENTDIVISION.DATADIVISION.WORKING-STORAGESECTION.01WELCOME-MESSAGEPICX(12).PROCEDUREDIVISION.PROGRAM-BEGIN.MOVE"HelloWorld"TOWELCOME-MESSAGE.DISPLAYWELCOME-MESSAGE.PROGRAM-DONE.STOPRUN.没过多久,顶尖的RPG专家就来到我们公司,给我们上了3天的课程,这是因为最酷的事情发生在AS/400的世界中。不仅仅是AS/400正在转向64位(大家都知道位数加倍后就会比原先好上一倍,对吧?),而且RPG语言也正在得到巨大的改进,版本IV比以为更多了融合了面向过程的特性以及一些面向对象的原则。这得多酷啊?我们扎入培训中后心里乐开了花,因为睁大所有的老式RPG开发者都在为努力学习这种“新的编程风格”而挠头时,我心里的石头终于落地了,终于能够回到我用C和C++时更为熟悉的面向过程的编程风格了,再也无需使用过去的那种刻板而受局限的基于指示符和列的RPG语言了。
很多开发者可能会因为某个特性而感到高兴,这些特性也的确让人刮目相看。语言要求指令开始于一个确定的列,输入在指令之前。这里局限性很大,你只有加载少量的常量字符,或者你不得不把它指明为常量或者数据结构,并把它们读入。新语言则把关键字列移动到右边,就有更大的空间给”factorone“。这意味着我们现在可以用几行代码来写“Hello,World”了。这种语言也是程序化的,所以你可以通过返回而不是在指示器中设置来中止一个程序。(尽管我记得正确的话,在主程序中返回就是设置封装的指示器)
1996–RPG/ILE
1998–SQL
Quake的可定制化程度也极高。虽然我在美工方面不怎么地,从来没弄明白怎么创建自己的模型或地图,但我直接扎近了编程来对它进行定制。Quake提供了一种基于C的编程语言,名为QuakeC。这种语言能够编译为跨平台的字节码,而这种字节码可以在能够运行Quake的所有目标平台之上。很快我就编写了一些改造性的程序,能够做到让玩家着火、让铁钉从墙上逼真地反弹回来等等类似的事情。在一个聊天室里,有个人说了一个点子让我编程实现一下,后来就因为我编写的这个叫做“MidnightCTF”的功能而为大家所知。其实就是直接在现有的任何地图上将所有的等都关闭,但为每个玩家配备一个手电。Quake是第一个支持真正的3D音效的游戏,这为游戏增添了一种有趣的可玩性。
1996–QuakeC
bprint("HelloWorld\n");此时我意识到了Internet真地要发展起来了。1993年我还在上大学时发现了这一点,但我非常沮丧,因为根本没有人真正明白我在说什么,但仅仅在几年之后,每个人都在为了抢着进入Internet领域而乱作一团(有些公司,比如AOL和微软的MSN,都想打造属于每个公司自己的互联网。。。但最终都无功而返,接入了我们现在所说的这个大的Internet)。我发现我在大型机上的工作马上就会过时,或者最好的情况下我只能成为一个藏在后面的某个角落中,鼓捣“那些个老系统”的开发人员。我想接触这些新东西。
后来我转到了一个在工作中使用这些新东西的部门——用VB6(COM+)和ASP编写一个应用,把几个不同的系统连接起来,从而可以让所有供应商都能看到其中的数据。
1998–VB6(COM)和ASP
JavaScript可是个折磨我们的东西,因为那时我们还要找出如何处理不同的浏览器的办法。是啊,一说到JavaScript和跨浏览器的兼容性,就不得不说,这个相同的问题15年前就出现了,直到现在还依然存在。幸运的是,所有的浏览器在向用户弹出对话框时采用的方法还是一致的。
1998–JavaScript
1998–XML/XSLTtoHTML
2002–PHP
2004–Java
publicclassHello{publicstaticvoidmain(String[]args){System.out.println("Hello,World");}}在语言当中我对Java并不感冒,但是我们要用到的特殊东西涉及到微软将要放弃的JVM,而且一个定制的服务器并不需要扩展。当把平台迁移到了.Net平台,我很惊讶的发现IIS服务器比其他几个专用的Java服务器能处理更多的请求。我说的“迁移”,其实是重新构建了一个新平台。我们寻求一种把J++代码转换为c#代码,但发现那确实不实用。幸运的是C#与Java非常是接近,大多数团队都能通过现存系统的“规则”轻松的将其翻译成能在Windows运行的系统,且把MySQL迁移到SQLServer2005。注意Java的"Hello,World"和C#是多么的接近。
2005–C#
2008–Silverlight(C#和XAML)
然而,我们所喜欢的Silverlight中的那部分特性在Windows8.1下的XAML和C#中存活了下来。为了好玩,下面给出采用酷小子们惯常使用的模型-视图-视图模型(MVVM)模式编写的“Hello,World”。
2011–WinRT/C#
采用TypeScript是个轻松的决定。尽管它还处于beta测试阶段,但它产生的代码100%可以直接用在产品中,所以如果我们发现它产生的代码有什么问题的话,我们完全可以跳过TypeScript,直接在JavaScript中进行修补。最后证明,TypeScript可用性相当高——我们的团队中有几个人对JavaScript有纯正癖,痛恨对“修改JavaScript这种语言”的所有企图都恨之入骨,即使他们几个人刚开始持有怀疑的态度,最后也一致认为,TypeScript为我们提供了更高一层的控制力度,用它还能够进行重构,它也支持并行开发,对我们能够发布高质量的基于Web的代码有着极大的促进作用。