下面是一段 BANCStar 语言的程序代码:
- 2999,,,
- 8600,,,1
- 3000,829,6,30089
- 10829,2446,22245,22012
- 11585,15855,22002,22002
- 11586,15865,22002,22002
- 11587,15875,22002,22002
- 11588,15885,22002,22002
- 11596,15965,22002,22002
- 11597,15975,22002,22002
- 11598,15985,22002,22002
- 11599,15995,22002,22002
- 11600,16005,22002,22002
- 11601,16015,22002,22002
- 11602,16025,22002,22002
- 11603,16035,22002,22002
- 11604,16045,22002,22002
- 11605,16055,22002,22002
- 11606,16065,22002,22002
- 11607,16075,22002,22002
- 11608,16085,22002,22002
- 11609,16095,22002,22002
- 11610,16105,22002,22002
- 11611,16115,22002,22002
- 11612,16125,22002,22002
- 11613,16135,22002,22002
- 11614,16145,22002,22002
- 11615,16155,22002,22002
- 11616,16165,22002,22002
- 11617,16175,22002,22002
- 11618,16185,22002,22002
- 11619,16195,22002,22002
- 11620,16205,22002,22002
- 11621,16215,22002,22002
- 11622,16225,22002,22002
- 11623,16235,22002,22002
- 11624,16245,22002,22002
- 11625,16255,22002,22002
- 11626,16265,22002,22002
- 11627,16275,22002,22002
- 11628,16285,22002,22002
- 11629,16295,22002,22002
- 11630,16305,22002,22002
- 11631,16315,22002,22002
- 11632,16325,22002,22002
- 11638,16385,22002,22002
- 11639,16395,22002,22002
- 11677,22002,22002,22002
- 11678,22002,22002,22002
- 11679,22002,22002,22002
- 11680,22002,22002,22002
- 11691,22002,22002,22002
- 11693,22002,22002,22002
- 11707,22002,22002,22002
- 11749,22002,22002,22002
- 3001,351,2,
- 10190,3512,22002,22002
- 10191,3522,22002,22002
- 10192,3522,22002,22002
- 10193,3522,22002,22002
- 3000,192,1,
- 10193,1902,1912,1922
- 10863,3552,22002,22002
- 10864,3562,22002,22002
- 10865,3572,22002,22002
- 10866,3582,22002,22002
- 10867,3592,22002,22002
- 10505,3662,22002,22002
- 10414,3912,22002,22002
- 10415,3922,22002,22002
- 10416,3932,22002,22002
- 10563,4072,22002,22002
- 10562,4082,22002,22002
- 10566,4102,22002,22002,
- 3001,,,
- 31597,10001,716,108
- 31598,10001,785,108
- 31599,10001,717,108
- 31600,10001,710,107
- 31601,10001,786,108
- 31602,10001,715,108
- 31603,10001,787,108
- 31604,10001,714,108
- 31605,10001,713,108
- 31606,10001,712,108
- 31607,10001,711,108
- 31608,10001,765,108
- 31609,10001,766,108
- 31617,10001,767,108
- 31618,10001,768,108
- 31619,10001,769,108
- 31620,10001,770,108
- 31621,10001,771,108
- 31622,10001,772,108
- 31623,10001,776,108
- 31624,10001,777,108
- 31625,10001,778,108
- 31626,10001,779,108
- 31627,10001,780,108
- 31628,10001,781,108
- 31629,10001,782,108
- 31630,10001,797,108
- 31631,10001,763,108
- 31632,10001,764,108
- 8500,,2,
- 1254,2301,1,-2301
想象一下,上班***天就被交给了这样一些程序代码。1990年2月,我就是这样的。一个7人组成的团队维护着一批打印到纸上能有几百页的这样的代码,都是已经发布到生产环境的。并不是我们发明了它们,只是我们不得不要用它们。作为奇闻轶事,我在这里展示一张这些代码残存的文档的图片,这个文档格式是使用我开发的一个工具生成的,它仅可能的模仿了早期我们那些程序员在纸上那笔来研究这些文档的样子。
关于这段代码
纸上的这些代码是C16LNAPP.SCN
里的一段,只是打印出来的***页,它是1990年代美国一家大商业银行——位于华盛顿的***洲际银行(First Interstate Bank)在生产环境里使用的一段代码。如今它已经没有用处理,我征得了当时参与人的同意,出于乐趣,公布在这里。
再来一段
下面的这段代码也是来自生产系统环境。我并不太担心在这里公布这么多具有版权问题的代码信息,因为这世界上大概只有10个人能看懂它们。
- 8607,,,1
- 11547,15475,22002,22002
- 1316,1629,1,1649
- 3001,1316,3,30078
- 11528,22052,22002,22002
- 9301,0,1528,1528
- 31568,10001,800,107
- 8560,,,1568
- 8550,210,,
- 3001,,,
- 3100,1316,3,30089
- 11547,15475,22002,22002
- 3001,1316,3,30089
- 3001,1317,3,10000
- 8400,,,
- 8550,700,801,
- 3001,,,
- 9301,0,522,522
- 3000,1284,3,10001
- 8500,,3,
- 8500,,5,
- 1547,,1,-2301
像这样打印出来的代码文件我估计有1350多张,大部分每张上都有几百行,有些甚至上千行。***洲际银行的银行分部用这些程序来处理业务。
BANCStar语言里一些有趣的特征:
- BANCStar程序里仅有的合法字符就是数字0-9,逗号,减号,和回车符。不允许有空行。文件中的任何地方如果有一个“.”出现,编译器就会崩溃。
- 注释是绝对不允许的。
- 有控制结构,包括3000 (“if”), 3001 (“end if”)和
3101 (“else if”),还有8500 (“GOTO”) 和 8550 (“组合GOTO”). - 有一个硬性规定,在整个系统中变量+常量不能超过2000个。任何需要显示到屏幕上或打印到表单里的东西都要被定义成常量,因此,它们都要占用有限的资源空间。结果,大多数的计算的完成都由使用数十个“临时寄存”变量,而这变量会被系统不断的重复利用。系统中所有的东西都是全局的。开发新模块的程序员的***要做的是在系统中找一些这些临时寄存的数字,“借”过来使用,完成自己的计算,并且要在这些寄存器真正的主人发现他们存放的数字不见了之前,把最初的值恢复回去。
- 代码里的标签(Label)使用的都是绝对行址,于是,一旦有新代码插入,所以插入行之后的代码涉及到GOTO操作的都要重新定位和链接。
我能记得的一些细节
BANCStar 代码实际上是用一个“屏面生成程序(screen generator)”生成的,这个工具最初大概是用来可视化编程的。但5.1c版的这个生成器功能太有限,一些有经验的程序员很快就开始研究它的工作原理,并且开始直接修改它生成的中间代码,这些中间代码就是生产环境实际运行的代码。
我在1990年代初来到西雅图,加入了这个由7个程序员组成的开发小组,这个小组的日常工作就是用BancSTAR机器语言直接编写代码,完全放弃了那个代码生成器。当他们***次向我展示这种语言时,我认为他们在跟我开玩笑。但几个星期后,我也开始学会阅读和编写这种代码了——借助于每个BancSTAR语言程序员最喜爱的工具:一个点阵打印机,一大把各种颜色的用于高亮某段代码的彩笔,以及一种纸带,上面打印满了各种系统提示表格,类似速查手册。在每次系统有任何修改变动后,我们都认真的、小心翼翼的修改相关数据、文档。(关于重复使用的临时寄存器,我可不是在开玩笑;如果你需要用到一个常量整数1000,你就需要到程序去寻找,看看其他人是否在其它地方使用了相同的值,你要把你的程序链接到这个地方,并期望在你使用它的过程中不被其他人修改。)
我们开发了一些内部工具来帮助我们用BancSTAR语言编写大型应用,还曾经将这些应用向这种语言的所有者Broadway & Seymour公司展示,但我想他们绝对不会相信我们是直接用他们底层的、没有文档说明的机器代码编写的。