Java’s first decade has proven it to be remarkably adaptable. Originally conceived as an embedded language for consumer devices,
Java emerged from Sun Microsystems in 1995 as the programming language for Web browsers. It then morphed into the leading
tool for business computing and serious application development -- in many ways the successor to both Cobol and C++.
Today, Java is the de facto platform for enterprise-scale applications, owing to its proven scalability and the extraordinary
range of services it provides. In addition, the Java language has numerous properties that appeal to developers, such as object
orientation, an expressive syntax similar to C and C++, few unsafe constructs, and built-in garbage collection. As a result,
Java -- as both a language and an execution environment -- is likely to remain the platform of choice for enterprise business
applications for many years.
To attain this central position in the enterprise, Java underwent extensive transformation. To remain at the center, it will
need to continue adapting to new technologies and responding to serious challenges, both from within and without the Java
community.
Fast enough?
One key advantage Java offers developers is that it eliminates many practices common to C and C++ that can lead to inadvertent
errors. The Java run time takes care of memory management and reduces the need to manipulate data items at low levels, but
it does so at the cost of some performance.
Programs written with early releases of Java were significantly slower than their C and C++ counterparts. Because many Java
programs of that period were applets designed to run in browsers, however, this limitation was more annoying than critical.
Still, as Java moved into enterprise environments, the performance question became more serious.
This issue has been addressed in two ways. Moore’s Law is one; with processor performance doubling roughly every 18 to 24
months, the delay caused by Java’s semi-interpreted code has quickly become much less visible. The other speed boost came
from improvements in just-in-time compiler technology. Early JITs generated code of middling performance quality, but JIT
enhancements driven by academic research, investments from IBM and Sun, and the work of Swedish wunderkinder at Appeal Virtual Machines (acquired by BEA in 2002) resulted in better optimization and zippy execution environments.
Today, benchmarks show that Java has closed most of the gap between itself and its C and C++ forebears. Garbage collection
-- the process of reclaiming unused memory -- remains one of the key factors working against parity in performance. The benefits
of this feature, however -- notably, more reliable code -- are great enough that most shops are willing to accept this small
penalty.
Write once, then what?
When it was first released, Java’s mantra of portability was, “Write once, run everywhere.” The more common experience that
developers encountered, though, led to an alternative version: “Write once, debug everywhere.”
In truth, Java’s reputation for portability problems was merited only in the area of client-facing software, which indeed
left much to be desired. Today, even these problems have been largely addressed, owing to a succession of GUI frameworks that
have done much to put client-side Java applications on a par with native implementations (see Client-Facing Java Perks Up).