[net.lang.mod2] One-pass Modula-2??

draves@endor.harvard.edu (Richard Draves) (07/27/86)

I don't believe a (reasonable) one-pass compiler for Modula-2
is possible.  The reason is that identifiers used in statements
may be declared anywhere in the containing scopes, above or below.
In particular, forward declarations are no longer necessary because
you can use a procedure before declaring it.  The problems this causes
for calling sequences can be overcome with difficulty.  However,
it does get worse.  Consider:

    MODULE test;

      TYPE
	type = INTEGER;

      PROCEDURE outer();

	PROCEDURE inner();

	  VAR
	    var: type;
	
	BEGIN
	  var := type(0)	(* this is incorrect!! *)
	END inner;

	TYPE
	  type = REAL;
	
      BEGIN
      END outer;

    BEGIN
    END test.

References to non-local variables also can't be trusted.
What I find particularly despicable about this "feature"
is that PROCEDURE inner looks perfectly correct if one
doesn't examine its surrounding context.  I think this
violates the spirit of static scoping in a big way.

Rich

	"a picture in the head is a gory murder in an art gallery"

					-- Stephen Kosslyn

polish@lexington.columbia.edu (Nathaniel Polish) (07/28/86)

In fact the one pass modula-2 compiler is by Wirth himself.  I read an
early manuscript of a paper  that he wrote  on the compiler.   He grew
frustrated  with slow compilers and  just sat down and   wrote a small
clean compiler which  is available from  Springer.  Besides,  you  can
always (I think) make a single pass compiler given enough memory.

Nat Polish@cs.columbia.edu