Java would be great if not for the JVM
I think Java, as a programming language, is decent. It’s a solid, object-oriented language. There may be some stereotypes around Java programming, mostly due to its use in “Enterprise” environments, but at its core, Java isn’t a bad language. Most of its problems come from the JVM and attempts to make Java a “compile once/run anywhere” language:
- Difficulty working with other languages.
- Slow startup times.
- Needing to install a massive runtime to use any Java program.
- Difficulty adding new features to the language.
- Difficulty enforcing some security features.
- Massive performance problems if JIT doesn’t work for any reason.
- Sometimes-unpredictable behavior, especially when trying to optimize.
- Trouble making native-looking UIs.
For the record, .NET suffers from many of these problems as well, and for the same reasons. A lot of these problems aren’t applicable in many cases, but sometimes they cause serious problems. All of them could be solved if Java simply compiled to a native executable like regular programming languages. GCC actually has a Java frontend that produces native executables. Some will say that compiling to native code causes a problem by making dynamic JIT optimization impossible, but many modern static compilers can accept profiling data in order to do similar optimizations.
In conclusion, Java is a decent language with a runtime that causes a number of problems, and these problems could be solved by simply compiling it to native executables. Unfortunately, Java was never designed for this, so implementations of this concept that do exist are imperfect.