274 lines
9.0 KiB
Prolog
274 lines
9.0 KiB
Prolog
Article 4295 of comp.misc:
|
||
Path: santra!tut!draken!kth!mcvax!uunet!yale!bunker!wtm
|
||
From: wtm@bunker.UUCP (Bill McGarry)
|
||
Newsgroups: comp.misc
|
||
Subject: Real Programmers
|
||
Message-ID: <4653@bunker.UUCP>
|
||
Date: 16 Feb 89 17:12:44 GMT
|
||
Reply-To: wtm@bunker.UUCP (Bill McGarry)
|
||
Organization: Bunker Ramo, an Olivetti Company, Shelton, CT
|
||
Lines: 260
|
||
|
||
|
||
In <1180@argon.siesoft>, David Allsopp (daa@siesoft) writes:
|
||
|
||
>BTW, anyone else remember (and could re-post) the story about the Real
|
||
>Programmer, working on a machine with drum memory, who wrote a program
|
||
>with an infinite loop that nevertheless terminated?
|
||
|
||
I don't know the original author of this but here it is anyway.
|
||
|
||
Bill McGarry
|
||
Bunker Ramo, Shelton, CT
|
||
(203) 337-1518
|
||
|
||
PATH: {oliveb, philabs, decvax, fortune, yale}!bunker!wtm
|
||
wtm@bunker.uucp
|
||
|
||
|
||
|
||
|
||
Real Programmers write in Fortran
|
||
|
||
|
||
Maybe they do now,
|
||
in this decadent era of
|
||
Lite beer, hand calculators and "user-friendly" software
|
||
but back in the Good Old Days,
|
||
when the term "software" sounded funny
|
||
and Real Computers were made out of drums and vacuum tubes,
|
||
Real Programmers wrote in machine code.
|
||
Not Fortran, not RATFOR. Not, even, assembly language.
|
||
Machine Code.
|
||
Raw, unadorned, inscrutable hexadecimal numbers.
|
||
Directly.
|
||
|
||
Lest a whole new generation of programmers
|
||
grow up in ignoreance of this glorious past,
|
||
I feel duty-bound to describe,
|
||
as best I can through the generation gap,
|
||
how a Real Programmer wrote code.
|
||
I'll call him Mel,
|
||
because that was his name.
|
||
|
||
I first met Mel when I work to work for Royal McBee Computer Corp.,
|
||
a now-defunct subsidiary of the typewriter company.
|
||
The firm manufactured the LGP-30,
|
||
a small, cheap (by the standards of the day)
|
||
drum-memory computer,
|
||
and had just started to manufacture
|
||
the RPC-4000, a much-improved,
|
||
bigger, better, faster -- drum-memory computer.
|
||
Cores cost too much,
|
||
and weren't here to stay, anyway.
|
||
(That's why you haven't heard of the computer, or the computer.)
|
||
|
||
I had been hired to write a Fortran compiler
|
||
for this new marvel and Mel was my guide to its wonders.
|
||
Mel didn't approve of compilers.
|
||
|
||
"If a program can't rewrite its own code,"
|
||
he asked, "what good is it?"
|
||
|
||
Mel had written,
|
||
in hexadecimal,
|
||
the most popular computer program the company owned.
|
||
It ran on the LGP-30
|
||
and played blackjack with potential customers
|
||
at computer shows.
|
||
Its effect was always dramatic.
|
||
The LGP-30 booth was packed at every show,
|
||
and the IBM salesman stood around
|
||
talking to each other.
|
||
Whether or not this actually sold computers
|
||
was a question we never discussed.
|
||
|
||
Mel's job was to re-write
|
||
the blackjack program for the RPC-4000.
|
||
(Port? What does that mean?)
|
||
The new computer had a one-plus-one
|
||
addressing scheme,
|
||
in which each machine instruction,
|
||
in addition to the operation code
|
||
and the address of the needed operand,
|
||
had a second address that indicated where, on the revolving drum,
|
||
the next instruction was located.
|
||
In modern parlance,
|
||
every single instruction was followed by a GO TO!
|
||
Put *that* in Pascal's pipe and smoke it.
|
||
|
||
Mel loved the RPC-4000
|
||
because he could optimize his code:
|
||
that is, locate instructions on the drum
|
||
so that just as one finished its job,
|
||
the next would be jsut arriving at the "read head"
|
||
and available for immediate execution.
|
||
There was a program to do that job,
|
||
an "optimizing assembler",
|
||
but Mel refused to use it.
|
||
|
||
"You never know where it's going to put things",
|
||
he explained, "so you'd have to use separate constants".
|
||
|
||
It was a long time before I understood that remark.
|
||
Since Mel knew the numerical value
|
||
of every operation code,
|
||
and assigned his own drum addresses,
|
||
every instruction he wrote could also be considered
|
||
a numerical constant.
|
||
He could pick up an earlier "add" instruction, say,
|
||
and multiply by it,
|
||
if it had the right numeric value.
|
||
His code was not easy for someone else to modify.
|
||
|
||
I compared Mel's hand-optimized programs
|
||
with the same code massaged by the optimizing assembler program,
|
||
and Mel's always ran faster.
|
||
That was because the "top-down" method of program design
|
||
hadn't been invented yet,
|
||
and Mel wouldn't have used it anyway.
|
||
He wrote the innermost parts of his program loops first,
|
||
so that they would get first choice
|
||
of the optimum address locations on the drum.
|
||
The optimizing assembler wasn't smart enough to do it that way.
|
||
|
||
Mel never wrote time-delay loops, either,
|
||
even when the balky Flexowriter
|
||
required a delay between output characters to work right.
|
||
He just located instructions on the drum
|
||
so each successive one was just *past* the read head
|
||
when it was needed;
|
||
the drum had to execute another complete revolution
|
||
to find the next instruction.
|
||
He coined an unforgettable term for this procedure.
|
||
Although "optimum" is an absolute term,
|
||
like "unique", it became common verbal practice
|
||
to make it relative:
|
||
"not quite optimum" or "less optimum"
|
||
or "not very optimum".
|
||
Mel called the maximum time-delay locations
|
||
the "most pessimum".
|
||
|
||
After he finished the blackjack program
|
||
and got it to run,
|
||
("Even the initializer is optimized",
|
||
he said proudly)
|
||
he got a Change Request from the sales department.
|
||
The program used an elegant (optimized)
|
||
random number generator
|
||
to shuffle the "cards" and deal from the "deck",
|
||
and some of the salesmen felt it was too fair,
|
||
since sometimes the customers lost.
|
||
They wanted Mel to modify the program
|
||
so, at the setting of a sense switch on the console,
|
||
they could change the odds and let the customer win.
|
||
|
||
Mel balked.
|
||
He felt this was patently dishonest,
|
||
which it was,
|
||
and that it impinged on his personal integrity as a programmer,
|
||
which it did,
|
||
so he refused to do it.
|
||
The Head Salesman talked to Mel,
|
||
as did the Big Boss and, at the boss's urging,
|
||
a few Fellow Programmers.
|
||
Mel finally gave in and wrote the code,
|
||
but he got the test backwards,
|
||
and, when the sense switch was turned on,
|
||
the program would cheat, winning every time.
|
||
Mel was delighted with this,
|
||
claiming his subconscious was uncontrollably ethical,
|
||
and adamantly refused to fix it.
|
||
|
||
After Mel had left the company for greener pa$ture$,
|
||
the Big Boss asked me to look at the code
|
||
and see if I could find the test and reverse it.
|
||
Somewhat reluctantly, I agreed to look.
|
||
Tracking Mel's code was a real adventure.
|
||
|
||
I have often felt that programming is an art form,
|
||
whose real value can only be appreciated
|
||
by another versed in the same arcane art;
|
||
there are lovely gems and brilliant coups
|
||
hidden from human view and admiration, sometimes forever,
|
||
by the very nature of the process.
|
||
You can learn a lot about an individual
|
||
just by reading through his code,
|
||
even in hexadecimal.
|
||
Mel was, I think, an unsung genius.
|
||
|
||
Perhaps my greatest shock came
|
||
when I found an innocent loop that had no test in it.
|
||
No test. *None*.
|
||
Common sense said it had to be a closed loop,
|
||
where the program would circle, forever, endlessly.
|
||
Program control passed right through it, however,
|
||
and safely out the other side.
|
||
It took me two weeks to figure it out.
|
||
|
||
The RPC-4000 computer had a really modern facility
|
||
called an index register.
|
||
It allowed the programmer to write a program loop
|
||
that used an indexed instruction inside;
|
||
each time through,
|
||
the number in the index register
|
||
was added to the address of that instruction,
|
||
so it would refer to the next datum in a series.
|
||
He had only to increment the index register
|
||
each time through.
|
||
Mel never used it.
|
||
|
||
Instead, he would pull the instruction into a machine register,
|
||
add one to its address,
|
||
and store it back.
|
||
He would then execute the modified instruction
|
||
right from the register.
|
||
The loop was written so this additional execution time
|
||
was taken into account --
|
||
just as this instruction finished,
|
||
the next one was right under the drum's read head,
|
||
ready to go.
|
||
But the loop had no test in it.
|
||
|
||
The vital clue came when I noticed
|
||
the index register bit,
|
||
the bit that lay between the address
|
||
and the operation code in the instruction word,
|
||
was turned on --
|
||
yet Mel never used the index register,
|
||
leaving it zero all the time.
|
||
When the light went on it nearly blinded me.
|
||
|
||
He had located the data he was working on
|
||
near the top of memory --
|
||
the largest locations the instructions could address --
|
||
so, after the last datum was handled,
|
||
incrementing the instruction address
|
||
woudl make it overflow.
|
||
The carry would add one to the
|
||
operation code changing it to the next one in the instruction set:
|
||
a jump instruction.
|
||
Sure enought the next program instruction was
|
||
in address location zero,
|
||
and the program went happily on its way.
|
||
|
||
I haven't kept in touch with Mel,
|
||
so I don't know if he ever gave in to the flood of
|
||
change that has washed over programming techniques
|
||
since those long-gone days.
|
||
I like to think he didn't.
|
||
In any event,
|
||
I was impressed enough that I quit looking for the
|
||
offending test,
|
||
telling the Big Boss I couldn't find it.
|
||
He didn't seem suprised.
|
||
|
||
When I left the company,
|
||
the blackjack program would still cheat
|
||
if you turned on the right sense switch,
|
||
and I think that's how it sould be.
|
||
I didn't feel comfortable
|
||
hacking up the code of a Real Programmer.
|
||
|
||
|
||
|