To: [email protected]
Subject: language comparisons your java white paper
Reply-to: [email protected]
Date: Mon, 21 Aug 95 10:05:27 MDT
Message-ID: <11832.809021127@mox>
From: Tom Christiansen <tchrist@mox>

I've read your white paper (book?) on java written by James Gosling and
Henry McGilton, and I was very impressed by its thoroughness and
professionalism.  I thought therefore you might be interested in having a
couple of areas of potential improvement pointed out.

*  More full-program examples would be nice.

*  Why do you assert that removing functions and forcing
  an o-o class paradigm is simplifying things for programmers?
  Why is supplying both so complicating?  Aren't you forcing
  things into an o-o paradigm that shouldn't be there?
  Aren't you just going to be using static class methods a lot
  for those operations that don't merit a real object?

*  The comparison chart on page 49 has numerous significant
  mistakes in the Perl column, as well as several oversights.
  I'll try to explain them at length:

1. OBJECT-ORIENTED

   You say perl isn't object-oriented.  Are you using the 1990 release
   or perl or the 1994 release?  The 1990 release was not O-O, but the
   1994 is.  See for example

         http://www.metronet.com/1h/perlinfo/perl5/manual/perlobj.html

2. ROBUSTNESS

   The robustness column is very odd.  You give perl a 50%, and
   yet grant tcl and the shells 100%, and C and C++ 0%.  what
   do you mean by robustness?  You talk about compile time checking.
   You are perhaps unaware of perl's ability to require declarations
   at compile time. See

       http://www.metronet.com/1h/perlinfo/perl5/manual/modpods/strict.html

   for details.

   Also, references are not castable in perl.  Attempts to use
   a reference as something it isn't raises a run-time exception.
   For example:

       $ref = \@ARGV;
       print &$ref(3);

   you take a reference to the program's argument list, but then use
   that reference to call a function.  That's a bad pointer usage,
   and will trap this way:

       Not a subroutine reference at - line 2.

   To learn more about references, you might examine:

         http://www.metronet.com/1h/perlinfo/perl5/manual/perlref.html

3. SECURITY

   You equate perl's and shell's security level.  I suspect you aren't
   aware of perl's security features: it was designed with security
   in mind.  If you haven't read about it, a brief overview is
   available in

         http://www.metronet.com/1h/perlinfo/perl5/manual/perlsec.html

   then you should.  Another fascinating notion is in

         ftp:://ftp.ox.ac.uk/pub/perl/README.Safe
         ftp:://ftp.ox.ac.uk/pub/perl/Safe-a2.tar.gz

   which Malcolm Beattie is doing even more interesting work with
   operator masks.  This is to support passing code fragments around
   to untrusted programs, which I believe is what you're trying
   to do with Java.

4. DYNAMIC

   Under dynamic, you give perl 0%, even though you have given shells
   50%.  I don't know what you mean by dynamic.  Certainly the
   fragile superclass problem doesn't not occur due to perl's nature
   of being a byte-code interpreter.
   Its method calls are certainly dynamic -- you can even redefine your class
   inheritance hierarchy on the fly, add new methods during your execution,
   etc.  The autoloading mechanism is quite flexible, and anonymous functions
   with full lexical closure is powerful, allowing interesting dynamic
   operations:

       sub mkcounter {
           my $start = shift;
           return sub { ++$start };
       }
       $func1 = mkcounter(10);
       $func2 = mkcounter(20);
       print &$func1(), &$func2(), &$func1();
       11 21 12

   On the other hand, if you just mean dynamic scoping,
   Perl provides both lexical and dynamic scoping of variables.


5. NEUTRAL

   You assert that if one merely supplied the java run-time system,
   applications written in it will run without porting.  Discounting
   the issue of pathnames oddnesses (filename notation is inconsistent
   across different operating systems), I will grant you this as true.
   However, given that, how do you give java 100%, C and C++ 0%, and
   the rest 50%?  I don't see how java is different from perl in this
   regard.  Once the main code is there, most programs will run, at least
   those not requiring unique ioctl()s to get a PC hardware, etc.

6. PORTABLE

   Again, you give Java and TCL 100% on portable and everything else 50%.
   You explain that Java's data types are defined without respect to
   architecture, and that this helps in this regard.  And yet perl's data
   types (and the others save C and C++) are also that way.  In fact, for
   doing bit access, perl defines a distinct bitlayout, so your application
   doesn't need to know how your hardware works.   Many operations are
   emulated where the O/S or C lib doesn't support them directly, thus
   increasing portability.  Perl ports are available not merely for virtually
   any Unix-like system, but also for  MS-DOS, Mac, Windows-NT, VMS, Amiga,
   OS/2, Atari, LynxOS, MVS, MPE, Xenix, and Netware, just to name a few.
   Applications that aren't system-specific will run automatically.


7. THREADS

   I guess you don't think running multiple tcl interpreters counts.
   Malcolm Beattie <[email protected]> has been working on threads (and
   safe proxy objects and other neat stuff) for perl, but it's not in the
   bundled release yet.  I believe pre-releases of his work are available.

8. EXCEPTIONS

   You give perl a 0%.  Apparently you were unaware of its exception
   mechanism.  It uses a catch/throw paradigm, although there is no
   resume from exception.  See

       http://www.metronet.com/1h/perlinfo/perl5/manual/perlfunc.html#perlfunc_eval_1

   for some explanation of the low-level exception interface.

9. PERFORMANCE

   You characterize the shells, tcl, and perl as all being low in
   performance.  Perl is a byte interpreter like Java, and thus enjoys a
   ten-to-one speedup against simplistic interpreters like tcl.  I would
   certainly call perl's performance medium.



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

I hope some of this will be of use to you.

--tom