guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Bug free programs


From: Ian Grant
Subject: Bug free programs
Date: Mon, 15 Sep 2014 18:38:41 -0400

I'm posting this because it explains beautifully why we don't need to
expend any great effort on getting GDB or other debuggers working with
Guile. If some code needs a debugger, then it invariably needs
re-writing much more than it needs the debugger. And _programmers_ who
need the debugger are invariably much more in need of training.

This is (a tiny) part of the Computer Security History Project
interview with Roger Schell:

   http://conservancy.umn.edu/bitstream/133439/1/oh405rrs.pdf

========================================================================

Yost: And Edsger Djikstra was a visiting faculty member when you were
there. Can you talk about any interaction you had with him?

Schell: Yes, he was one of a couple of people that probably had a
major influence on my perspective on computer science. You know my
background was FORTRAN. I mean, that’s what we used. The military
programs were either assembly language or FORTRAN, or JOVIAL. JOVIAL was a military program language—sort of like FORTRAN. When I joined Project MAC; well, one of the things that you do with graduate
students is they’re free labor for various things that have to be
done. And one of the projects I had was what we called the Bootstrap
Project in Multics, which brought it from essentially the bare iron up
to the point where it could begin to run. It had been written an
assembly language. And in Multics, the whole story was to write things
in a higher [level] language. That makes them inspectable and viewable,
and that’s what I was working on, looking at that problem. Okay, rewrite
the Bootstrap in PL/1, from assembler language.

About that time Djikstra came to campus and he taught a class. And I
took his class and his claims, of course, seemed to me pretty
outlandish claims in terms of the ability to know that essentially you
had, call it, bug-free programs. And I, of course, had read the
T.H.E. paper that he had written about that and I was largely a
skeptic. Well, it turned out his office was about three doors down
from mine. By that time I had gotten an office in Project MAC; they
had a cluster of graduate students that I was with. Down at the other
end was Djikstra; they’d found a place for him. And so I’d go down
periodically and sort of challenge his claims. Well, he was not a
particularly patient person, and obviously, I had a lot of respect for
him so you wouldn’t debate him as you would another graduate student;
but still try and learn where he was coming from. So I sort of threw
out to him; because his examples; although the T.H.E. was about an
operating system, when he taught his classes they were about
algorithms that were essentially applications. And I said well, I’m
not sure that I am persuaded that I can get this approach really to
work; he described it as putting beads on a necklace and you put them
together, and that sort of thing. I said I’m not convinced. So he said
to me, what are you working on? I said I’m supposed to rewrite this
assembly language thing in PL/1. And he says well, you understand what
I do? Well, I think so. Well, you try it. And so, I said okay, fine,
I’ll do that. I’ll modularize it that way; I’ll introduce those sort
of layering constructs; and when I had questions and such—it isn’t
hard, and not a science as to how to construct that. And occasionally
I’d say I don’t see how to do this, so I’d go down and talk to him and
say well, okay, I don’t see; you know, it doesn’t seem to me like this
goes; and he’d patiently, or impatiently, put me on the right
track.

And so I did that and produced that program in that way, and of
course, with a Bootstrap program, you can’t do much more than a desk
check and then go run it. And so you’d have to construct a new boot
tape and it booted from tapes. You’d create all these files, then you
put them out, and they had this process of creating these tapes, and
that was the job. And I was familiar with that process; I had worked
in Multics; I had learned how to boot things up. I had written at that
low a level. So when the system would come up, if it incurred a flaw
early on in the process, it would type that the operating system was
dead; this bombed; this is not here; you’d get some sort of very
cryptic message that the operator console—which was a typewriter—would
type out.

And so I put my PL/1 version of the bootstrap program, built the tape,
and so I’m going to run my first test, and well, it’s where it’s going
to crash first, right? I mean, the usual kind of question, is can I
know what happened? So I start the tape running and went to the
operating console and waited for the message to type out. And I
waited; and I waited. And I said oh boy, I’m in trouble.  The thing;
it isn’t even able to give me an error message or anything. Nothing
happens.  I’m really in trouble! And I turned around and looked back
at the processor. Well, when the system’s fully up and running, the
background thing will flash the lights and a pattern on the console
lights. And I looked back, and it was running. And, I said, what’d I
do?  Run the wrong tape? So I looked down and made sure I had my
tape. I booted it again.  What? And it came up!

Well, you know, from my FORTRAN experience I’d never written a
thousand-line program (which this was) that ran the first time, right?
It doesn’t happen. And so that was one that definitely changed my
perspective from a software engineering point of view, in terms of
Djikstra’s impact, which is your question. Yes, it had a definite
impact on the way I view software engineering; I became obviously very
much of an advocate of that way of thinking about the problem.

======================================================================

Anyone who has used Standard ML functors knows this feeling, but more
so: when the code _compiles,_ you just know it's going to work. The
way a Standard ML functor works is it composes ML code together. It
allows you to implement an interface, and then totally replace the
underlying implementation by plugging in a different one. And the type
checking catches almost all the mistakes that people commonly
make. And if your ML compiler can assemble lightning code, you can do
this with assembler. The functor will snap assembler modules together,
and the resulting assembler, although quite complicated, _just works._
No debuggers necessary.

One may ask what has this to do with scheme? Well, Standard ML can
compose scheme or C code just as easily as it can compose assembler
code. So a Standard ML functor can define a typed template that will
allow one to exchange underling scheme implementations of functional
interfaces as easily as it does ML. This is why I want to get Moscow
ML working under Guile. Moscow ML is really light-weight when compared
with Guile. My machine takes 42 minutes (no, really, I timed it!)  to
byte-compile just ice9-pp.go. By comparison, the whole Moscow ML
autoconf/build cycle takes less than 50s. This includes the runtime,
the Standard ML basis library, and the lexer and parser generators and
the compiler and toplevel REPL. And there's a fair bit of junk we
could trip out, and we could make it a lot faster once we JIT compile
the bytecode instead of interpreting it, and when that JIT compiled
bytecode uses native Guile SCM objects to representall its data, then
there will no penalty whatsoever in a Guile program just switching to
Standard ML when it seems like a good idea.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]