Re: Write once, run anywhere?
"JT" <jtlinux1@oohay.ca> wrote in message
news:467dcf27$0$4303$9a566e8b@news.aliant.net...
Mark Space wrote:
JT wrote:
Isn't it true that the JVM has a limited amount of what it can do based
on the commonality of all the different platforms. If someone is
writing a program, don't they have to know all the places it's going to
be running so that they can avoid coding things that just won't work?
But this is true of any programming language or machine language. What
do you want, magic? Writing a C program for BSD on both Macintosh and
FreeBSD, you have to take into account the different drivers and .so
libraries which run on each system. There ain't no other way.
The JVM is a finite machine with finite resources. At some point, you
are going to go beyond it's capabilities, whether that's opening a CD bay
door or opening the space shuttle bay door. Some things are just
specific to their environment.
Yes, and I agree with you 100%. When I installed the Sun jdk1.6, it
installed both the SDK and JRE. It's the JRE which allows Java programs
to run, so this would be the JVM. As such, a JRE for Windows or Mac OS
won't work on Linux. The JRE (or JVM) is platform specific. Is this
correct?
Yes. When you install Java on a particular platform, you get the JVM that
was designed for it. Sun (or other JVM provider) does the platform-specific
adaptations for you (actually for all Java developers in one fell swoop), so
you don't have to.
If so, how does a developer know all the platforms that his or her code
will one day be running on?
Sun publishes a list of supported platforms. You don't know which platforms
it will run on. It shouldn't matter (very much) as long as you stick to the
standard language features and libraries.
It almost seems to me that you have to avoid anything that might be
remotely platform (or even PC) specific or else your code could break.
Yup. I've written complex commercial client and server applications in Java
for over 10 years, and with very few notable application-specific
exceptions, this has been a very minor problem in practice.
But here's another idea. What if your code was written in such a way that
before it actually makes a call to an OS level system or command that
isn't there, that it would check first?
You have to go outside the standard JVM and Java class libraries to do this.
You usually invoke JNI, which calls routines that you write yourself, or
that you buy from third-party vendors. Done right, these components would
support a variety of platforms, but you (or they) assume the responsibility
of continued compatibility with all supported platforms and versions.
Do Java (and this is a Java forum so I am asking a question specifically
to Java programmers) programmers do this as a matter of principle? And if
so, how do they accomplish it.
public boolean isCDDriveOpen {
if ( can_the_CD_drive_be_opened ) {
if ( CD_drive_is_open ) {
return true;
} else
return false;
}
or would it be better handled using a try...catch construct?
I think the latter is more common. And as one responder suggested, the
default behavior might be to pop up a dialog asking the user to open the CD
drive door and click OK if there is no platform support. The application
would be none the wiser. Abstraction is where it's at, man. ;-)