581
魔獸
世界上最讓人抓狂的編程語言:BANCStar
下麵是一段 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公司展示,但我想他們絕對不會相信我們是直接用他們底層的、沒有文檔說明的機器代碼編寫的。
最後更新:2017-04-03 15:21:44