Lambda the Ultimate

inactiveTopic Multics Software Features
started 1/30/2002; 12:31:41 AM - last post 2/1/2002; 11:05:28 AM
Ehud Lamm - Multics Software Features  blueArrow
1/30/2002; 12:31:41 AM (reads: 1992, responses: 3)
Multics Software Features
Contains a lot of interesting information (and quite a lot of trivia as well). The languages section talks about the likes of PL/I, COBOL, Fortran, APL and MACLISP. Algol68 is there too, in case you wondered.

(via LtU's discussion group).


Posted to history by Ehud Lamm on 1/30/02; 12:33:19 AM

Oleg - Unix Design Philosophy  blueArrow
1/31/2002; 2:15:46 PM (reads: 1012, responses: 1)
Multics is a good background for (modern) Unix philosophy.

Let me mention similarities first. I knew that Unix borrowed quite a lot from Multics: hierarchical file system, virtual memory, dynamic linking, memory-mapped files and i/o. Unix is still borrowing: logical volume management with on-line reconfiguration, and access control lists are the recent additions to Unix from Multics. What I didn't know that the concept of a shell with output redirection and backquote substitution, as well as the names of popular commands such as 'ls', 'cp', 'pwd', 'mv' were borrowed from Multics as well. BTW, Multics used characters '[' and ']' rather than backticks for command result substitution -- just like Tcl does. I also didn't know that Multics has been running well into mid 80s.

Two quotations from a web page http://www.multicians.org/unix.html illustrate fundamental differences between Multics and Unix:

"I [Tom Van Vleck, a major Multics developer] was working for MIT in those days, and one thing I did was to organize an MIT PDP-11 users' group and encourage them to look into Unix. The idea of a free, non-vendor-supported operating system was new to them."

Although this sounds like writings of OpenSource proponents, the described event took place in 1973.

"We went to lunch afterward, and I remarked to Dennis [Ritchie] that easily half the code I was writing in Multics was error recovery code. He said, "We left all that stuff out. If there's an error, we have this routine called panic, and when it is called, the machine crashes, and you holler down the hall, 'Hey, reboot it.'"

It appears (e.g., from his recent projects such as Plan9 and Inferno) that Dennis Ritchie no longer thinks that way. Nevertheless, I have not heard of a modern Unix/Linux developer taking such serious approach to design as described in http://www.multicians.org/andre.html

Thank you for posting the Multics references!

Ehud Lamm - Re: Unix Design Philosophy  blueArrow
1/31/2002; 2:27:19 PM (reads: 973, responses: 0)
And I thought the Unix philosophy is all about little languages, utilities and the pipeline...

Oleg - Re: Multics Software Features  blueArrow
2/1/2002; 11:05:28 AM (reads: 889, responses: 0)
It appears that the idea of little languages and programming by combination of existing tools worked better in Multics. As I understand, a shell command was a (compiled) PL/1 procedure -- and any PL/1 procedure that takes string arguments can be a shell command.

If we want to invoke a UNIX system command 'cp' to copy one file into the other, we have to write something like the following

	char * from_name = "foo.txt";
	char * bar_name = "bar.txt";

pid_t pid; if( pid = fork() ) { /* in the parent process */ if( pid == (pid_t)(-1) ) perror("fork failed"), failure(); for(;;) { if( waitpid(pid,0,0) == (pid_t)(-1) && errno == EINTR ) continue; else break; } } else execlp("cp", "cp", from_name, bar_name, (char*)0), perror("exec failed"), _exit(127);

We could use a 'system' function but then we need to take care to form the command line and to quote all potentially troublesome or dangerous characters in from_name and bar_name.

As I understand, in Multics we could simply write something like

	DCL cp entry(char (*),char(*));
	CALL cp(from_name,to_name);
We could invoke system or other commands as regular PL/1 procedures.

I was especially impressed with dynamic linking capabilities of Multics. You can write a procedure 'foo' that calls another procedure (say, 'bar'), compile 'foo' and invoke right away. No need to do any linking. If 'foo' eventually tries to invoke 'bar', the system will search for it. If found, the code of 'bar' will be mapped into the 'foo' process, and the execution continued as if 'bar' were a local procedure. If 'bar' cannot be located, foo is suspended and the user is notified. The user may choose to write procedure 'bar', compile it, and continue the execution of foo. Multics also offers static linking (called bundling).