Taurus Java Virtual Machine v1.02a
The following release notes are applicable to the above version of the Taurus
Java Virtual Machive. The copyright notice is applicable to any version of the
VM unless stated otherwise.
Taurus Software hereby grants you a non-exclusive, non-transferable limited
licence (without the right to sub-licence) under Taurus Software's
intellectual property rights. The licence entitles you to freely use, for
personal, non-commercial use only, but not to distribute, the Taurus Java
Virtual Machine. All binaries and code remain exclusively copyright Taurus
The Taurus Java Virtual Machine has been produced, as a "clean room"
implementation, in accordance with Sun Microsystems, Inc.'s (SUN) licence
agreement for "The Java Virtual Machine" specification. In accordance with
this agreement the virtual machine distribution does NOT, to the author's
knowledge, contain ANY material which is copyrighted by SUN. As such the class
files relied upon by the virtual machine must be obtained separately, directly
from SUN. The use of this specifcation does not in any way imply that the
software conforms to it, nor does it imply that it will ever wholey do so. The
Taurus Java Virtual Machine does not, and will not, ever pretend to be
"Java compliant", it will always remain as closer approximation as time and
money will allow. Users of this software do so at their own risk. Developers
of any Java software should NEVER use this as a reference platform.
Taurus Java Virtual Machine is a trademark of Taurus Software. Sun, Sun
Microsystems, the Sun logo, Java, JavaSoft are all trademarks or registered
trademarks of Sun Microsystems, Inc. All other product names mentioned herein
are the trademarks of their respective owners.
THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRIGEMENT. TAURUS
SOFTWARE ACCEPTS NO RESPONSIBILTY FOR ANY DAMANGE, OF ANY KIND, CAUSED BY THE
USE, OR MIS-USE OF THIS SOFTWARE. BY USING THIS SOFTWARE YOU AGREE TO THE
LICENCING TERMS HEREIN.
TAURUS SOFTWARE RESERVES THE RIGHT TO REVOKE THIS LICENCE AT ANY TIME, FOR ANY
REASON. THE "FREE" STATUS OF THIS SOFTWARE IS TEMPORARY, DUE TO THE TIME AND
EFFORT DEVOTED TO THIS PROJECT IT IS LIKELY TO BECOME "SHAREWARE", BUT WILL NOT
BE MADE INTO A COMMERCIAL PRODUCT.
All references to Taurus Software directly refer to the non-profit freeware/shareware
software development unit run from the UK by myself. Any conflict with names of companies
inside or outside of the UK is unintentional and should be disregarded.
The Taurus Java Virtual Machine version 1.02 alpha is provided only as an Intel binary, and
for space reasons is provided without any of the required support libraries. In order to
run this software you must install these libraries yourself (they are likely to be already
installed on most systems). Binaries for other platforms will follow at some later date.
The SIBO binary will be simpler to distribute, as no dynamic libraries are used.
There will also a DOS version of the VM (used to test the SIBO source). This will not
require any additional libraries and will run on <386 based systems.
The alpha release provides an incomplete implementation of the SUN Java Virtual Machine
Specification. The key features of this release are as follows:
- Loading and execution of Java applications - the VM should be able to load and begin
executing any Java application.
- Dynamic loading - classes are loaded as needed, exceptions or errors are reported when
a class cannot be found
- Can interpret most Java virtual instructions - all the common instructions used by
large programs like the Java compiler have been implemented.
- Can read and write files on disk
- Support for exceptions - most exceptions generated by the VM can be caught, all exceptions
generated by user code can be caught. All Java exceptions support the stack trace facility.
- Runs with standard JDK classes - there are no modified class files used by the VM.
- Debug at method, instruction and exception level is supported. Any serious VM problems
(access violations) should generate a Java stack trace.
The main restrictions are as follows:
- Incomplete virtual instruction set implementation - most of the virtual instructions (about
74%) have been implemented, but there are still quite a few that haven't. These mainly fall
into the following categories: manipulation of floats, doubles, longs and shorts, manipulation
of arrays, advanced manipulation of the stack, and wide instructions. See the
instructions page for a complete listing. You may also find
bugs in the implementation of some instructions.
- Non-conformant arithmetic implementation - the VM uses its own internal format (that of C)
to represent numbers on the stack. In particular floating point numbers do no behave 100%
correctly, for example NaN and Inf are not supported. Also beware of bitwise logic on large
numbers, as shifts etc may not be 100% conformant.
- Incomplete native method implementation - only those native methods which have been
encountered in pratice (about 18%) have been implemented. This leaves a lot of unimplemented
native methods, including those native methods which fall outside the core implementation,
namely those found in the "winawt", "net" and "zip" libraries. No attempt has been made to
support the Java Native Interface.
- Single thread of execution - multi-threading may be added in the form of "green" threads
in a later release.
- No AWT - the standard Java AWT classes require far too much native support and are
tied too closely to the host platform for implementation in a "portable" VM. Mechanisms
to implement the AWT may be provided in a later release.
- No Networking - as with the AWT, the standard Java Net classes require a lot of native
support. Mechanisms to implement networking may be provided in a later release.
- No Garbage Collector - due to the complexity of GC, its implementation has been left
until a later release. It is likely to be necessary to adopt a smarter GC technique in order
to allow the Java VM to run on really small platforms.
- No JIT - a performance enhancing JIT may be added later. The development of a JIT is
complex and ties the VM to a host platform. JITs are also a complex technology to develop
and even the commercial Java vendors still haven't got it quite right!
- No refelection interface - reflection is limited to obtaining handles of classes. Support
for interrogating class definitions has been omitted.
- No support for CLASSPATH - only the current directory is checked for class files.
- No support for Applets or sandbox - no inbuilt support as yet.
Support for "Standard Applications"
Below is a table of the "standard Java applications", which come with most JVM's. They are
all written in Java, so should run on any virtual machine. As a simple test of the Taurus
Java VM, here is what happens when they are run with the scripts provided:
|appletviewer||Will not run||Needs native AWT support.|
|jar||Will not run||Needs native Zip support.|
|javac||Runs buggily||Generates spurious error messages for a valid Java
program. Likely to be caused by some logic errors in the execution engine somewhere.|
|javadoc||Will not run||Prints help but dies with a NullPointerException
when asked to do anything useful.|
|javakey||Runs buggily||Always prints the message "could not initialize
|javap||Don't know||I don't have the class files for javap to test it.|
|jdb||Will not run||Needs native network support.|
|native2ascii||Runs||But I don't know what it does!|
|rmic||Runs||Generates correct error messages, don't know what happens
when I give it valid input, but not likely to be of any use with network support.|
|rmiregistry||Will not run||Needs native network support.|
|serialver||Will not run||Requires native method
Unpack the downloaded ZIP file containing the VM into a suitable directory (e.g. C:\JavaVM).
Next install the class files from the JDK 1.1.x - these come packed as a zero compression
Zip file called "classes.zip", approx 8Mb in size. You need to unpack this directly into
your JavaVM directory.
The VM can function in a much smaller environment than provided by the JDK classes. The VM
really only needs the following class and methods to function:
- java.lang.Object - as all classes derive from it, either directly or indirectly.
- java.lang.System - loaded at system startup.
- initializeSystemClass() - called at system startup.
- java.lang.Throwable - for all exceptions and errors.
- java.lang.Error - for all errors.
- java.lang.Exception - for all exceptions.
- java.lang.InternalError - can be generated by any field or method access.
- java.lang.NullPointerException - can be generated by any field or method access.
- java.lang.ArrayIndexOutOfBoundsException - can be generated by any array access
- java.lang.ArithmeticException - divide by zero
- java.lang.ClassCastException - can be generated by any explicit or implicit cast.
- java.lang.ClassNotFoundException - generated by dynamic loading.
It is also advisable to include the following error/exception classes, even though they
cannot yet be raised directly by the VM:
To make your own environment, you need to implement a set of Java classes similar to those
provided by Sun. The main reason for doing this on a small platform is the amount of crap
that gets loaded before any of your classes. I am currently looking at the Personal Java
and Embedded Java specifications for some ideas on how to shrink the VM - System.out loads
an awful lot of classes!
Last updated 26th Apr 1999