2013-09-02

最悪のプログラミング言語、BANCStar

BANCStar/README.md at master · jloughry/BANCStar · GitHub

「世界最悪のプログラミング環境?」と題して、アメリカのメジャーな銀行(First Interstate Bank of Washington)で、1991年に実際に使われていたらしい、BANCStarというプログラミング言語が紹介されている。BANCStarの存在自体は1997年、Joe Loughryが公開しているのだが、この度Githubにページが作られたので、注目を集めている。

BANCStar (joe.loughry@gmail.com)

世界最悪のプログラミング環境?

これが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年1月の筆者だ。7人のプログラマーによる部署が、このようなコードのファイルを数百個も、実務のために保守していたのだ(我々が作り出したのではない。我々はどうしても保守しなければならなかったのだ。)

歴史的興味のために、当時筆者が苦労しながら作成したドキュメントの一部を紹介しよう。これはコードを前にしてもがき苦しむ前任者のプログラマーの意図を、できる限り正確に再現しようと試みたものである。

コード例

このファイル(最初の1ページのみ)、['C16LNAPP.SCN']は、1991年にワシントンのFirst Interstate Bankで実務に使われていたコードの一部だ。もう使われていないし、また歴史的興味のために、許可を得てここで公開している。

銀行でのサイドプロジェクトとして、筆者はLISTと名付けた洗練されたフォーマッターを書いた。その出力は、[PDF注意] ここでみることができる。シンタックスハイライトとフロー記法の他に、LISTはプログラマーが必要としていた関連情報を表示できた。相互参照だとか集計だとかドキュメントの画像だとかだ。時間があれば残りを上げる。

Wikipediaページ

BANCStarプログラミング言語にはWikipediaのページがある。

筆者の1997年の記事

筆者の以下の記事を1997年に書いた。Brian ConnorsによってTuring Tarpitから公開されて、2000年に更新された。BANCStarのソースコードの別の例でもある。

思うに、世界にとうとうBANCStarを紹介できるようになった。

以下の実際のBANCStarのソースコードは、実務システムからのものだ。筆者はこれにより機密情報を漏らす心配をあまりしていない。この世界にこのコードを読める人間は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個ほどあったはずだ。ほとんどのファイルは数百行ほどの長さだが、中には千行以上ものファイルもあった。このシステムは1990年代初めにメジャーな商業銀行で使われていた。

BANCStarの興味深い特徴

BANCStarプログラムにおける合法な文字種は、0から9までの数字と,コンマ、マイナス記号、キャリッジリターンだけである。空行は許されていなかった。もし、ファイル内に"."があるならば、コンパイラーはクラッシュする。

コメントは厳格に禁止されていた。

提供されているコントロール構造は、3000("conditional")、3001("block conditional")、3101("reverse block conditional")、また、8500("GOTO")、8550("combination GOTO")

システム全体で、変数と定数の総数は2000という制約があった。画面に表示するものから印刷するものまですべては、定数として定義されなければならず、貴重なスペースを消費した。結果として、ほとんどの計算は二十個ほどの「ワーキングストレージ」変数で行われた。これは常に再利用される。システムのあらゆるものはグローバルであった。新しいプロジェクトは必ず、必要な計算の間だけ「借りる」ことのできて、後から元の値に戻しても、本来の所有者が気がつくことなく問題なく動く、ワーキングストレージ番号を探すことから始まった。

コード中のラベルは絶対番地であった。そのため、新しいページが追加されるか削除されるかした場合、以降のGOTOは必ず再調整されなければならなかった。

その他覚えているいくつかのこと

BANCStarは、実のところ、「スクリーンジェネレーター」が付属していて、アプリケーションを構築する際には、それが使われるはずだった。しかし、バージョン5.1cのジェネレーターはとても制約が激しく、経験あるプログラマーはすぐに見切りをつけて、ランタイムモジュールが実際に実行する内部コードを直接いじり始めた。

筆者が1990年の初頭にシアトルにやってきたとき、筆者はBancSTARマシン言語を日常的に直接書き、スクリーンジェネレーターを完全に無視する7人のプログラマーの部署に入社した。彼らが初めて筆者に言語を見せた時、筆者は冗談であると思った。しかし、数週間もすれば、筆者はコードを読み書きしていた。助けとなるのはBancSTARプログラマーのお気に入りのツール:ドットマトリックスプリンター、たくさんのたくさんの別の色の蛍光ペン、プロンプトファイルという名前の三リングタイプのバインダー。システムの何十種類者テーブルを印刷した紙束、そして、なにか変更した場合は、宗教的盲信をもって常にすべてをアップデートした(先にストレージの再利用と書いたのは冗談ではない。もし、整数定数1000を使いたい場合で、誰か他人がかつて一度でもその変数を使っていた場合は、コードをリンクして、何も変化がないことを祈ったのだ。)

我々はBancSTARで巨大なアプリケーションをプログラミングするための内製のツールもいくつか開発した。また、Broadway & Seymourに宣伝しに行ったこともある。しかし、どうも彼らは、我々が内部的な、低級な、ドキュメント化されていないマシン語を直接書いていることを、信じなかったようだ。

BANCStarは、まあ確かにひどいコードだが、本来人間が直接使うことを想定しているのではなかった。実際には、Broadway & Seymourとかいう会社によって売られていたプロプライエタリなコンピューターのシステムの一部だ。「スクリーンジェネレーター」とかいうGUIのツールがあり、プログラミングはそのツールを使って行い、ツールが内部表現としてこのようなコードを生成するというものだった。この内部表現は、おそらくコンピューターに実装されたVMかなにかで実行されていたのだろう。

まあ、よくあることだが、そのような高級ツールの出来が良くないと、人間は高級層を無視して低級層を直接叩くようになるということだ。

ただまあ、こんなクソな環境を保守するにも、結構な労力が必要であり、たとえこのような環境だとしても、内部表現を生成するより高級な言語を開発するべきだと思うのだが、なぜかそうはならないで、人間が低級なコードを手書きするようになるとは、悲惨だ。おそらく、長期的な視野がなく、その日その日の目標を達成することだけが評価されるような環境だからこそ起こる悲劇なのだろう。

それにしても、銀行系とか医療系のソフトウェアでは、この手の悲惨な話をよく聞く。一体何がこのようなクソプログラミング環境を作り出すのだろうか。閉鎖的だからだろうか。まだコンピューターの黎明期から積極的にコンピューターを導入しようとした歴史があるからだろうか。

The Worst Programming Environment in the World? | Hacker News

Hacker Newsでは、他にも医療系がひどいという話が挙げられている。

特に、MUMPSというデータベース用のクソ言語が話題となっているようだ。Wikipediaにあるコード例では、それほどクソには見えないが、実際のコードは非常に一文字変数のため、非常にクソだという。

MUMPS - Wikipedia, the free encyclopedia

1 comment: