Let us quickly look into compiled and interpreted languages and also where Java fits.
High level language vs. Machine Language
Computer platform understands a low level language called machine language, which is usually difficult for humans to learn and use. Here platform is a combination of your operating system and processor.
Humans prefer to use high level languages like Java, C, C++ etc. as they form an abstraction over the platform and are closer to their speaking language like English.
Compilers and interpreters are software that can convert a high level language like Java, C, C++ to a low level platform specific machine language before executing them.
Compiled vs. Interpreted Languages
In the case of compiled languages, the original source code is read over compile time, checked for syntax and type errors and converted to a platform specific binary executable. This executable is then executed again and again in its target platform. There will be a different executable for every platform combinations like Windows 64 bit, Windows 32 bit, Linux, Mac etc.
In the case of interpreted languages, source program is translated into machine code and executed line by line, directly at target machine. Here source program is directly executed on the target platform by an interpreter; so the same executable is shipped to every platform, and hence is portable. There will be only one version of the executable for every platform.
Examples of compiled languages include C++ and Fortran, and examples for interpreted languages include PHP and perl. Where does Java fit in? We will see it in some time.
Pros for compiled and interpreted languages
Pros for compiled are the cons for the other, and vice versa.
Pros for compiled languages:
Speed – Since the source code is already converted into native platform specific code, the code can be executed directly without anymore translation.
Type checking – Since compilation work in phases and has access to whole code and types declared, it can do syntax checks and type checking, and this avoiding any possible runtime errors due to type mismatch. If you have a variable of type int, and if you assign it any other type and then if you use an int operation, your code might throw a runtime exception. This is avoided by type checking of the compiler.
Pros for interpreted languages
Interpreted languages also have a very important property, which is:
Portability – Since the source code itself or a platform independent executable is shipped to the target machine, the executable is platform independent and hence it is portable across platforms. However, note that there should be a platform specific interpreter installed in the target machine, that can convert this platform independent executable to that particular platform specific machine code and execute it.
Java is compiled and interpreted
In Java, source code is saved in files with .java extensions. This source code is then compiled into a intermediate platform independent byte code, and this form has a .class extension. This .class file is then executed by Java’s JVM. Java compiler in windows is the javac.exe file and is part of the Java Development Kit or JDK. JVM is the java.exe file and is part of the Java Runtime Environment or JRE.
Java thus combines most of the advantages of compiled languages like type checking and even code optimization and also Portability from interpreted languages.
Even though the code you write using Java is platform independent, JVM itself is platform dependent as there needs to be a JVM for each platform that know how to convert source code into that platform.
Also, note that Java language implementation itself is created using compiled languages such as C, C++. That is why you see a different executable for each platform in the Java SE downloads page.
Compiled Interpreted Languages
Python is another compiled and interpreted language. It also uses a combination of compiler and interpreter; the compiler output an intermediate bytecode (Python's .pyc files), which is then executed by a bytecode interpreter (Python virtual machine).