本物のプログラマーは Fortran で書きます。
ライト ビール、手計算機、「ユーザー フレンドリー」なソフトウェアのこの退廃的な時代では、おそらく彼らはそうしているかもしれませんが、「ソフトウェア」という言葉がおかしく聞こえ、リアル コンピューターがドラムと真空管で作られていた古き良き時代にさかのぼります。本物のプログラマーは機械語で書きました。Fortran ではありません。RATFORではありません。アセンブリ言語でさえありません。マシンコード。生の、飾り気のない、不可解な 16 進数。直接。
まったく新しい世代のプログラマーがこの輝かしい過去を知らずに成長しないように、ジェネレーション ギャップを乗り越えて、本物のプログラマーがどのようにコードを書いたかをできる限り説明する義務があると感じています。それが彼の名前だったので、私は彼をメルと呼びます。
私が初めてメルに会ったのは、タイプライター会社の現在は消滅した子会社であるロイヤル マクビー コンピューター コーポレーションで働いていたときでした。同社は、小型で安価な (当時の標準からすれば) ドラム メモリー コンピューターである LGP-30 を製造し、さらに改良された、より大きく、より優れた、より高速な RPC-4000 の製造を開始したばかりでした。メモリーコンピューター。とにかく、コアはコストがかかりすぎて、とどまることはありませんでした。(そのため、会社やコンピューターのことを聞いたことがありません。)
私はこの新しい驚異のための Fortran コンパイラーを書くために雇われ、Mel はその驚異へのガイドでした。Mel はコンパイラを承認しませんでした。
「プログラムが独自のコードを書き直すことができない場合、それは何の役に立つのですか?」と彼は尋ねました。
メルは、会社が所有する最も人気のあるコンピューター プログラムを 16 進数で作成していました。それは LGP-30 上で動作し、コンピュータ ショーで見込み客とブラックジャックをしました。その効果は常に劇的でした。LGP-30 のブースはどのショーも満員で、IBM のセールスマンが立ったまま立ち話をしていました。これが実際にコンピューターを販売したかどうかは、私たちが議論したことのない問題でした.
Mel の仕事は、RPC-4000 用のブラックジャック プログラムを書き直すことでした。(ポート? それはどういう意味ですか?) 新しいコンピューターには 1 プラス 1 のアドレッシング スキームがあり、各マシン命令には、オペレーション コードと必要なオペランドのアドレスに加えて、次の場所を示す 2 番目のアドレスがありました。回転ドラムには、次の指示がありました。現代の用語では、すべての命令の後に GO TO! が続きます。それをパスカルのパイプに入れて燻します。
Mel が RPC-4000 を気に入ったのは、自分のコードを最適化できるからです。つまり、ドラム上の命令を見つけて、1 つのジョブが完了すると、次の命令が「読み取りヘッド」に到着し、すぐに実行できるようにすることができました。その仕事をするプログラム、「最適化アセンブラ」がありましたが、メルはそれを使用することを拒否しました.
「どこに物を置くかは決してわかりません」と彼は説明しました。「そのため、別の定数を使用する必要があります」.
私がその発言を理解するまでには長い時間がかかりました。メルはすべての操作コードの数値を知っており、独自のドラムアドレスを割り当てていたので、彼が書いたすべての命令も数値定数と見なすことができました。彼は、以前の「加算」命令を取り上げて、正しい数値を持っていれば、それを乗算することができました。彼のコードは、他の誰かが変更するのは容易ではありませんでした。
Mel の手で最適化されたプログラムと、最適化アセンブラー プログラムによって処理された同じコードを比較したところ、Mel の方が常に高速に実行されました。それは、プログラム設計の「トップダウン」手法がまだ発明されておらず、メルがとにかくそれを使用しなかったためです. 彼はプログラムループの最も内側の部分を最初に書いたので、ドラムの最適なアドレス位置の最初の選択肢が得られました。最適化アセンブラは、そのようにするほど賢くありませんでした。
Mel は時間遅延ループも書きませんでした。
彼はドラム上の指示を見つけたので、必要なときに、連続する指示が読み取りヘッドをちょうど過ぎたところにありました。次の命令を見つけるために、ドラムはもう 1 回転しなければなりませんでした。彼は、この手順に対して忘れられない用語を作り出しました。「最適」は「ユニーク」と同様に絶対的な用語ですが、「最適ではない」、「あまり最適ではない」、または「あまり最適ではない」というように相対的なものにすることが口頭で一般的に行われるようになりました。Mel は、最大の時間遅延の場所を「最も悲観的な」場所と呼びました。
彼がブラックジャック プログラムを完成させて実行した後 (「イニシャライザも最適化されています」と彼は誇らしげに言いました)、営業部門から変更要求を受け取りました。このプログラムは、洗練された (最適化された) 乱数ジェネレーターを使用して「カード」をシャッフルし、「デッキ」からディールしました。彼らは、メルにプログラムを修正してもらい、コンソールのセンス スイッチの設定でオッズを変更し、顧客が勝つようにしたいと考えていました。
メルはうなずいた。彼は、これは明らかに不誠実であり、プログラマーとしての彼の個人的な誠実さに影響を与えると感じたので、それを拒否しました。ヘッド セールスマンはメルと話し、ビッグ ボスも話しました。上司の勧めで数人のフェロー プログラマーも話しました。メルはついに屈服してコードを書いたが、彼はテストを逆手に取り、センススイッチがオンになるとプログラムはチートし、毎回勝った。メルはこれに満足し、彼の潜在意識は手に負えないほど倫理的であると主張し、それを修正することを断固として拒否した.
メルがより環境に優しいパ$ture$のために会社を辞めた後、ビッグボスは私にコードを見て、テストを見つけてそれを元に戻すことができるかどうかを確認するように頼んだ. 少ししぶしぶ、私は見ることに同意しました。Mel のコードを追跡することは、まさに冒険でした。
私はしばしば、プログラミングは芸術形式であり、その真の価値は、同じ難解な芸術に精通した別の人によってのみ評価できると感じてきました。プロセスの性質上、時には永遠に、人間の目や賞賛から隠されている素敵な宝石と素晴らしいクーデターがあります。たとえ 16 進数であっても、彼のコードを読むだけで、その個人について多くを学ぶことができます。メルは縁の下の力持ちだったと思います。
おそらく、私の最大のショックは、テストのない無実のループを見つけたときでした。テストなし。なし。常識では、プログラムが永遠に無限に循環する閉ループでなければならないと言われました。ただし、プログラム制御はそれを通過し、安全に反対側に出ました。それを理解するのに2週間かかりました。
RPC-4000 コンピュータには、インデックス レジスタと呼ばれる最新の機能がありました。これにより、プログラマーは、インデックス付き命令を内部で使用するプログラム ループを作成できました。毎回、インデックス レジスタ内の数値がその命令のアドレスに追加されるため、一連の次のデータを参照します。毎回インデックス レジスタをインクリメントするだけで済みました。メルは一度も使っていません。
代わりに、彼は命令をマシン レジスタに取り込み、そのアドレスに 1 を追加して、元に戻します。次に、変更された命令をレジスタから直接実行します。ループは、この追加の実行時間を考慮して作成されました。この命令が終了すると、次の命令がドラムの読み取りヘッドの真下にあり、準備が整いました。しかし、ループにはテストがありませんでした。
重要な手がかりは、インデックス レジスタ ビット (命令ワード内のアドレスとオペレーション コードの間にあるビット) がオンになっていることに気付いたときに得られました。ライトが点灯すると、ほとんど目がくらみました。
彼は、作業中のデータをメモリの最上部近く (命令がアドレス指定できる最大の場所) に配置していたので、最後のデータが処理された後、命令アドレスをインクリメントするとオーバーフローが発生しました。キャリーはオペレーション コードに 1 を追加し、命令セット内の次のコードであるジャンプ命令に変更します。案の定、次のプログラム命令はアドレス位置 0 にあり、プログラムは順調に進みました。
私は Mel と連絡を取り合っていないので、彼が過去の時代からプログラミング技術を洗い流してきた変化の洪水に屈したかどうかはわかりません. 私は彼がしなかったと思うのが好きです。いずれにせよ、私は十分に感銘を受け、問題のあるテストを探すのをやめ、Big Boss に見つからないことを伝えました. 彼は驚いていないようだった。
私が会社を辞めたとき、正しいセンススイッチをオンにすると、ブラックジャックプログラムはまだチートをしていました。本物のプログラマーのコードをハックするのは気が進まなかった.