[net.unix] Least We Forget: MULTICS

munck@MITRE-BEDFORD.ARPA (07/05/84)

----------------
All,

   In all of the discussions of the virtues and vices of UNIX, comparisons
with VMS and CMS, and arguments about its use with/as a programming support
environment, I think that we should acknowledge occasionally the fact that
it was inspired by and named for MULTICS. Many, if not most, of the highly-
touted features of UNIX were actually developed by the innovative and very
competent people who worked on the MULTICS project at MIT in the Sixties.

   My MULTICS experience is at least a dozen years old, and blurred by the
many file systems and command languages I've collided with since; I can't
begin to describe its rich set of features off the top of my head. However,
given that the UNIX designers essentially "cut down MULTICS to fit"
smaller, more available machines, there may be many valuable concepts that
didn't make it into UNIX and that could be of use to us now.  Anyone have a
dusty old MPM or MSPM lying around?

   It has been suggested that UNIX owes much of its acceptance to the fact
that it was the first and for a long time the only OS that was fairly
machine-independent and for which the source code was available outside the
developing organization.  It's interesting to speculate where we'd be now
if MULTICS had been done on a smaller, less exotic machine; all the C fans
would probably be using PL/I and just as vociferous as they are now.

                 /* Bob Munck, the MITRE Corporation */

SIBLEY@USC-ECLB.ARPA (07/05/84)

Bob,

Although I had a CTSS original in January, I "DELETED" IT VIA THE
CIRCULAR FILE (while collecting my hernias) during an office
move.

However, I don't think we should look back (I can find a copy of
Calvin Moore's Interactive typewriter proposal which precedes the
pair, but would it help?).

No, I fear the good ideas of the pre and post Project MAC are
lost in infinity (Has anyone any idea of where Teager went?).

Least is MULTICS, lest we feel it was a small thing?  (or wasn't
it a great pun but just misspelling).

Regards,

Edgar

WMM@ACC.ARPA (07/06/84)

From:  Waiming Mok <WMM@ACC.ARPA>

Re:	Least We Forget:  MULTICS
Cc:	INFO-UNIX@BRL-VGR

Granted many features of UNIX derived from MULTICS,
one thing most likely did not.
That is its structural conciseness.
This conciseness contributes to the large number of degrees
of freedom in terms of UNIX's flexibility.

If one would draw the analogy of PL/1 to MULTICS as
C is to UNIX, I would choose C/UNIX anytime.

Waiming Mok @ ACC
------

Eachus@HI-MULTICS.ARPA (07/07/84)

From:   "Robert I. Eachus" <Eachus@HI-MULTICS.ARPA>

    I've  been  waiting  for  someone to drop this shoe, but you seem to
have forgotten that Multics is not dead, but alive and well, and still a
much  better  development  environment  than  Unix.  In spite of all the
people  who  think  that Ada was designed with Unix in mind, most of the
development  work  was  done  on  Multics.  I feel that many of the best
features  of  the  program  library  concept in Ada would not be present
without the Multics background of the designers.

                                        R. I. Eachus

emjej@uokvax.UUCP (07/09/84)

#R:sri-arpa:-160800:uokvax:6100035:000:1145
uokvax!emjej    Jul  8 16:51:00 1984

/***** uokvax:net.unix / sri-arpa!ARPA /  1:41 pm  Jul  6, 1984 */
...there may be many valuable concepts that
didn't make it into UNIX and that could be of use to us now.  Anyone have a
dusty old MPM or MSPM lying around?
/* ---------- */

No (and I wish I did have more info on Multics, too), but I would like to
point out a facility of OS-9 that reminds me greatly of Multics segments,
namely the OS-9 memory module.

Said beast is a position-independent (by fiat), usually re-entrant hunk of
program (or data) with surrounding descriptor and checksum. Perhaps it's a
product of "salvation through suffering" (i.e. wishing to provide a multi-
tasking Unix-like OS on 6809 boxes that didn't necessarily have memory
management, so that they couldn't start out putting things at absolute
addresses in initial versions and then move up to machines with virtual
memory or memory management hardware so they could perpetuate the charade
of absolute addresses), but in any case it allows the sort of dynamic linking
I understand Multics is capable of. It's begging for a language on the order
of Modula-2/CLU/Russell to run on it.

					James Jones

POBERNDORF@USC-ECLB.ARPA (07/09/84)

Bob,

     We have at least one potential source for such information right on the 
KITIA - Honeywell is one of the KITIA members. Let's bring this up again at
the Toronto meeting.

         Tricia

mmt@dciem.UUCP (Martin Taylor) (07/10/84)

"Least" seems appropriate, in view of the comment that had Multics
been done for smaller machines, people might now be raving about
PL/1 rather than C.  I remember the first time I saw the Multics
system, people were having a party. They had just managed to get
the resident portion of the monitor (on a 256K machine) down to
300K.  Not bad for a "least" system!  How big was the first UNIX
written in C?
-- 

Martin Taylor
{allegra,linus,ihnp4,uw-beaver,floyd,ubc-vision}!utzoo!dciem!mmt

barmar@mit-eddie.UUCP (Barry Margolin) (07/10/84)

Hey, stop talking like Multics* is dead!  There are some of us who still
believe in it.  Me, I work for Honeywell doing Multics systems
programming.  It was the first *real* computer I had ever used; I
learned computing on a PDP-8 in HS, and then hung around the Radio Shack
playing with Trash-80's for a while.  When I came to MIT I learned what
a computer is supposed to do.

I might consider Multics dead when everyone's desktop Unix(tm) has
demand-paging, a tera-word per process segmented virtual memory
file-system, dynamic linking, and hardware support for three orthogonal
access control mechanisms.  Yes, Unix has a number of important features
that Multics lacks.  You might be interested to know that I don't
consider pipes to be one of them; pipes are a kludge to get around the
fact that dynamic linking was hard to implement, so instead of making it
easy to call lots of subroutines, you start up a process and read its
output.

--------------------
*Multics is a registered trademark of Honeywell Information Systems.
-- 
    Barry Margolin
    ARPA: barmar@MIT-Multics
    UUCP: ..!genrad!mit-eddie!barmar

trb@masscomp.UUCP (07/10/84)

mit-eddie!barmar:
> You might be interested to know that I don't consider pipes to be one
> of them; pipes are a kludge to get around the fact that dynamic linking
> was hard to implement, so instead of making it easy to call lots of
> subroutines, you start up a process and read its output.

Dynamic linking doesn't give you the toolkit versatility that the pipe
system call (and its use in interactive shell pipes) gives you.  My
favorite simple example is the rhyming dictionary (I don't remember
where I first saw this example).  Given the v7 programs:

sort:	sort lines lexically
rev:	reverse order of characters in each line

Then

% rev < input-dictionary | sort | rev > rhyming-dictionary

produces a (lexical) rhyming dictionary.

Another simple example would be a spelling checker, using the v7 tools
tr, uniq, and comm, along with a dictionary of correctly spelled
words.

I don't see how pipes are a kludge, they seem pretty elegant to me.
The pipe system call and the shell pipe interface seems like an ideal
way to provide a co-routine interface to naive users.  How could
dynamic links do this better (more simply)?

(Oh no, I envision all the object oriented purists coming through the
windows.)

	Andy Tannenbaum   Masscomp Inc  Westford MA   (617) 692-6200 x274

dan@haddock.UUCP (07/11/84)

#R:sri-arpa:-160800:haddock:16700026:000:2967
haddock!dan    Jul  9 20:09:00 1984

Multics was indeed responsible for many of UNIX's best features.
The innovation of UNIX was the notion of pipes, filters, and small
programs which could be quickly and easily coupled together to do
useful work.  Also, UNIX was once much simpler than Multics, but I
don't think it's true any longer; compare either System V.2 or
Berkeley 4.2BSD to Multics, and I think you'll find it's a tie.

The things that Multics has (present tense--you can still buy one,
you know) that I miss on UNIX are consistency and dynamic linking.  In more
detail:

* Consistency.	Multics has a set of closely followed guidelines for
writing commands, which means that command names, arguments, and error
messages are very consistent.  Command names and arguments have both long
descriptive names and short, easy-to-type names (e.g., create_dir and cd).
They are slightly more verbose than names and arguments in UNIX, but
they were much more consistent and much easier to remember as a result.

Error messages on Multics were always of the form
    progname: System error message.  Program-supplied error message.
The error messages were complete English sentences, which was good for the
novice, and programmers could easily replace them (see below).	(Messages
like "The specified control option is not implemented by this command." did
tend to get tiring after awhile on low-speed terminals, which is of course why
UNIX programs just say "bad flag".)

UNIX has gotten better about this one; pr doesn't say "very funny" anymore,
rmdir doesn't say "Values of B may be greater than dom!", and you're often
told the name of the program that's failing, too!  Now if only you could
learn the kernel error, too!  (USG, are you listening?)

* Dynamic linking (which would fit very smoothly into the UNIX framework,
and would have lots of advantages for program development), and extensive
use of "library" routines for common tasks that anyone could replace (via
dynamic linking).  One of the first things I did when I started using Multics
was to replace the error-message routine with one of my own that gave briefer
messages.  Someone else I know replaced the question-asking routine with one
that would take 'y' or 'n' in addition to the words 'yes' and 'no'.  As
with UNIX, while it wasn't perfect, you could easily fix it--usually more
easily than with UNIX, in fact.

Another application of dynamic linking was the I/O stream facility, which
(among other things) permitted you to insert modules between all programs
and your terminal.  If UNIX had this facility, there wouldn't be periodic
arguments about terminal paging--those who wanted it would just put it
in an I/O module to be inserted in your terminal output stream.  (One creative
person wrote a "German" I/O module--it would give everything written to your
terminal a German accent.)

To quote Sherlock Holmes, "I have written a small monograph on the subject"
of dynamic linking, and I'll send it to anyone who's interested.

dan@haddock.UUCP (07/13/84)

#R:sri-arpa:-160800:haddock:16700029:000:1451
haddock!dan    Jul 11 17:35:00 1984

From barmar at mit-eddie:

> ... pipes are a kludge to get around the fact that dynamic linking was hard
> to implement, so instead of making it easy to call lots of subroutines, you
> start up a process and read its output.

In theory this might be true.  In practice it isn't, because Multics programs
aren't set up to be coupled together the way UNIX programs are, either through
dynamic linking or any other way.  I've had to cascade a series of operations
using different Multics programs, and it just isn't as simple as 'prog1|prog2'.
You can't dynamically link them together because they don't know how to call
each other.  You can redirect user_input and user_output (I/O streams), but you
can't just couple user_output from one program into user_input of the
next--because the next program typically can't be told to read user_input for
its data; it only understands about named files.  To do a UNIX 'prog1 | prog2',
you have to say something like
    file_output temp	(redirect user_output into file "temp")
    prog1 input 	(run prog1; its output is being collected in temp)
    file_output 	(redirect user_output back to the terminal)
    prog2 temp		(so you can see prog2's output)
And that only works if prog1 actually prints its output, rather than modifying
the input file, which many programs do.  I'll take the UNIX 'kludge' any day!
Also, pipes implement coroutine-style linkage rather than call-return, which
is often more useful.

cowan%hare.DEC@DECWRL.ARPA (07/13/84)

From:  Ken Cowan ZKO2-3/L13 381-2198 <cowan%hare.DEC@DECWRL.ARPA>


	I have to agree with Andy Tannenbaum that pipes are a marvelous
feature.  If any of you have read Software Tools, remember that one of
the things they stressed was modularity of the design of your program.
Pipes provide another form of subroutine-type modularity, except you
are no longer sharing the global static storage (which is likely to
be the desired effect).

	Once the user is comfortable with pipes, new ideas in the
area of functional languages become very natural.  Functional languages
tend to extend pipe-like constructs to permit more structured data
flow than just sequential passing of data from one process to another

	It is also likely that pipe-like ideas will be an integral part
of the multi-processor computer architectures being developed.  I'm
sure there are better experts than I on this particular subject, since
I have not been following research in this area.

	Ken Cowan
	{ucbvax, decvax, allegra}!decwrl!dec-rhea!dec-hare!cowan
	cowan%hare.DEC@decwrl.arpa
	HARE::COWAN

guy@rlgvax.UUCP (Guy Harris) (07/19/84)

> Error messages on Multics were always of the form
>     progname: System error message.  Program-supplied error message.
> The error messages were complete English sentences, which was good for the
> novice, and programmers could easily replace them (see below).  (Messages
> like "The specified control option is not implemented by this command." did
> tend to get tiring after awhile on low-speed terminals, which is of course why
> UNIX programs just say "bad flag".)

Wasn't there a command that told the system to print short versions of the
error messages?

> UNIX has gotten better about this one; pr doesn't say "very funny" anymore,
> rmdir doesn't say "Values of B may be greater than dom!", and you're often
> told the name of the program that's failing, too!  Now if only you could
> learn the kernel error, too!  (USG, are you listening?)

Part of the reason for the poor error messages in UNIX programs is the
weak error-message printing routine.  Multics' "com_err" (or whatever it was
called, it's been a while), if I remember correctly, had a way to do
"printf"ing ("ioa_"ing, rather) within the call.  "perror" merely permits
you to stick a string in front of the system error message; if you want
something like:

	frobozz: /etc/passwd: No such file or directory

you either have to construct the "frobozz: /etc/passwd" string yourself
and feed it to "perror", or use the error message tables yourself - I've
gotten into the latter habit, because I've learned from bitter experience
how much of a difference clear and complete error messages can make (namely,
you don't spend 20 minutes sticking in debugging code to find out something
that a better error-message could have told you from the beginning).

> * Dynamic linking (which would fit very smoothly into the UNIX framework,
> and would have lots of advantages for program development), and extensive
> use of "library" routines for common tasks that anyone could replace (via
> dynamic linking).

In effect, it means that the ability to plug in a new kernel and run old
programs (a system call does sort of a dynamic link to a kernel routine) is
made available to code that isn't part of the kernel (Multics also permitted
the non-kernel code to be shared by all programs that used it) - in fact,
a "system call" in Multics was just a (semi-)ordinary subroutine call (through
a "gate" segment containing a transfer vector that meant that your process
ran in a more privileged "ring" while it was executing that subroutine and
the routines it called).  (Amusingly enough, the GE 635 had one "system call"
instruction, but the GE 645 that Multics originally ran on had *four* - *none*
of which were used for system calls under Multics!)

Unfortunately, dynamic linking does require you to create pointers that
1) have enough bits in them to efficiently refer to a character string that
contains the name of the routine being linked to while 2) causing a fault when
dereferenced; not all hardware supports this conveniently.  (It could probably
be done on a VAX, though, by mapping out the upper N bytes of the
system address space (N a power of 2) for some N big enough to hold all
the names of the routines and small enough not to be missed from the system
address space.  Or, by adding another level of indirection, it could be done
with a table of pointers to the strings, and N big enough to hold all those
pointers.  All the compilers would have to be changed to reference globals
not directly, but indirectly through one of those "trap pointers" - when
the trap occurs, the linker (in the OS) would map the segment containing
the global reference into your process' address space, and change the trap
pointer to point to the global.)

	Guy Harris
	{seismo,ihnp4,allegra{!rlgvax!guy

	Guy Harris
	{seismo,ihnp4,allegra}!rlgvax!guy

gwyn@BRL-VLD.ARPA (07/28/84)

From:      Doug Gwyn (VLD/VMB) <gwyn@BRL-VLD.ARPA>

The idea of an improved, standardized error message function is
a good one.  Various implementations have appeared on USENIX
tapes in the past.  The problem is not so much in designing
something more generally useful than perror(), but in getting
universal acceptance of it.  I wonder if AT&T will give serious
consideration to suggestions like this now that they are
supposedly more responsive to the marketplace.  Unfortunately
they seem to be getting sucked into targeting new work at the
small system end user rather than at software developers.

henry@utzoo.UUCP (Henry Spencer) (07/30/84)

> The idea of an improved, standardized error message function is
> a good one.  Various implementations have appeared on USENIX
> tapes in the past.  The problem is not so much in designing
> something more generally useful than perror(), but in getting
> universal acceptance of it....

There is one possibility which might become a de facto standard if
enough people use it:  error() from Kernighan&Pike.  We're using it
here for everything new we do, and gradually retrofitting it (and a
non-exiting version called "warning") into old programs.

In general, one could do a lot worse than to open up Kernighan&Pike
and start typing things in.  K&P may be the closest look at Version 8
that we'll ever get...
-- 
				Henry Spencer @ U of Toronto Zoology
				{allegra,ihnp4,linus,decvax}!utzoo!henry