In the early 1990s, Sun Microsystems created a new programming language called Oak as part of a research project to build consumer electronics products that relied heavily on software. The first prototype for Oak was a portable home controller called Star7, a small handheld device with an LCD touchscreen and built-in wireless networking and infrared communications. It could be used as remote control for a television or VCR and as an electronic program guide, and it also had some of the functions that are now associated with PDAs, such as appointment scheduling. Software for this type of device needs to be extremely reliable and must not make excessive demands on memory or require an extremely powerful (and therefore expensive) processor. Oak was developed as a result of the development team's experiences with C++, which, despite having many powerful features, proved to be prone to programmer errors that affected software reliability. Oak was designed to remove or reduce the ability for programmers to create problems for themselves by detecting more errors at compile time and by removing some of the features of the C++ language (such as pointers and programmer-controlled memory management) that seemed to be most closely associated with the reliability problems.
Unfortunately, the market for the type of devices that the new language was intended for did not develop as Sun hoped, and no Oak-based devices were ever sold to consumers. However, at around the same time, the beginnings of public awareness of the Internet created a market for Internet browsing software. In response to this, Sun renamed the Oak programming language Java and used it to build a cross-platform browser called HotJava. It also licensed Java to Netscape, which incorporated it into its own popular browser, at the time the undisputed market leader. Thus, the world was introduced to Java applets.
Within a couple of years, the cross-platform capabilities of the Java programming language and its potential as a development platform for free-standing applications that could be written once and then run on both Windows and Unix-based systems had sparked the interest of commercial end users as a way of reducing software development costs. In order to meet the needs of seasoned Windows and Motif/X-Windows developers working to create applications for sophisticated end users accustomed to using rich user interfaces, Sun rapidly expanded the scope (and size) of the Java platform. This expanded platform included a much more complex set of user interface libraries than those used to build the original applets, together with an array of features for distributed computing and improved security.
By the time Sun released the first customer shipment of the Java 2 platform, it had become necessary to split it into several pieces. The core functionality, regarded as the minimum support required for any Java environment, is packaged as the Java 2 Standard Edition (J2SE).
Several optional packages can be added to J2SE to satisfy specific requirements for particular application domains, such as a secure sockets extension to enable electronic commerce. Sun also responded to an increasing interest in using Java for enterprise-level development and in application server environments with the Java 2 Enterprise Edition (J2EE), which incorporates new technology such as servlets, Enterprise JavaBeans, and JavaServer pages.
As with most software, Java's resource requirements have increased with each release. Although it has its roots in software for consumer electronics products, J2SE requires far too much memory and processor power to be a viable solution in that marketplace. Ironically, while Sun was developing Java for the Internet and commercial programming, demand began to grow for Java on smaller devices and even on smart cards, thus returning Java to its roots. Sun responded by creating several reduced-functionality Java platforms, each tailored to a specific vertical market segment, some of which will be covered briefly at the end of this chapter. These platforms are all based on JDK 1.1, the predecessor of the Java 2 platform, and they take different approaches to the problem of reducing the platform to fit the available resources. In a sense, therefore, each of these reduced-functionality platforms represents an ad-hoc solution to this problem, a solution that has evolved over time to meet the needs of its own particular markets.
J2ME is a platform for small devices that is intended eventually to replace the various JDK 1.1-based products with a more unified solution based on Java 2. Unlike the desktop and server worlds targeted by J2SE and J2EE, the micro-world includes such a wide range of devices with vastly different capabilities that it is not possible to create a single software product to suit all of them. Instead of being a single entity, therefore, J2ME is a collection of specifications that define a set of a platforms, each of which is suitable for a subset of the total collection of consumer devices that that fall within its scope. The subset of the full Java programming environment for a particular device is defined by one or more profiles, which extend the basic capabilities of a configuration. The configuration and profile or profiles that are appropriate for a device depend both on the nature of its hardware and the market to which it is targeted.