The key that allows Java
to solve both the security and the portability problems just described is that
the output of a Java compiler is not executable code. Rather, it is bytecode.
Bytecode is a highly optimized set of instructions designed to be executed by
the Java run-time system, which is called the Java Virtual Machine (JVM). That
is, in its standard form, the JVM is an interpreter for bytecode. This may come
as a bit of a surprise. As you know, C++ is compiled to executable code. In
fact, most modern languages are designed to be compiled, not interpreted—mostly
because of performance concerns. However, the fact that a Java program is
executed by the JVM helps solve the major problems associated with downloading
programs over the Internet. Here is why.
Translating a Java
program into bytecode helps makes it much easier to run a program in a wide
variety of environments. The reason is straightforward: only the JVM needs to
be implemented for each platform. Once the run-time package exists for a given
system, any Java program can run on it. Remember, although the details of the
JVM will differ from platform to platform, all interpret the same Java
bytecode. If a Java program were compiled to native code, then different versions
of the same program would have to exist for each type of CPU connected to the
Internet. This is, of course, not a feasible solution. Thus, the interpretation
of bytecode is the easiest way to create truly portable programs.
The fact that a Java
program is interpreted also helps to make it secure. Because the execution of
every Java program is under the control of the JVM, the JVM can contain the
program and prevent it from generating side effects outside of the system. As
you will see, safety is also enhanced by certain restrictions that exist in the
Java language. When a program is interpreted, it generally runs substantially
slower than it would run if compiled to executable code. However, with Java,
the differential between the two is not so great. The use of bytecode enables
the Java run-time system to execute programs much faster than you might expect.
Although Java was
designed for interpretation, there is technically nothing about Java that
prevents on-the-fly compilation of bytecode into native code. Along these lines,
Sun supplies its Just In Time (JIT) compiler for bytecode, which is included in
the Java 2 release. When the JIT compiler is part of the JVM, it compiles
bytecode into executable code in real time, on a piece-by-piece, demand basis. It
is important to understand that it is not possible to compile an entire Java
program into executable code all at once, because Java performs various run-time
checks that can be done only at run time. Instead, the JIT compiles code as it
is needed, during execution. However, the just-in-time approach still yields a
significant performance boost. Even when dynamic compilation is applied to
bytecode, the portability and safety features still apply, because the run-time
system (which performs the compilation) still is in charge of the execution
environment. Whether your Java program is actually interpreted in the traditional
way or compiled on-the-fly, its functionality is the same.
Post a Comment