I used to think Java was the one of the best languages going, which is to say, it's the marginally acceptable one among the set of complete loser languages that we have to work with out here in the real world. Java was far more pleasant to work with than C++ or Perl or even COBOL and Assembler. When I started using Java back in 1996, it felt like an old friend, like finally I was back using a real object oriented system. However recently, as I started coding in it again, I found a lot of things about Java that irritate me. The fact is that there are four completely different things that go by the name "Java"; * A language. * An enormous class library. * A virtual machine. * A security model. Oracle/Sun would like you to believe that these are all the same thing, and that the name "Java" implies all of them, but this is marketing fiction. Worse than that, the fact that they has tried so hard to push this idea has done grievous damage to the acceptance of Java. Java, the language is, overall, a very good thing, and works well. Java, the class library is mostly passable. Java, the Virtual Machine is an interesting research project, a nice proof of concept, and is basically usable for a certain class of problems (those problems where speed isn't all that important: basically, those tasks where you could get away with using Perl instead of C.) Java, the security model is another interesting research project, but it only barely works right now. The whole "write once run anywhere" idea (which is to say, the virtual machine) is a wonderful idea, and I wish it the best of luck. But it's still not true yet. It might be someday: in the meantime, I'd like to write programs in Java today, the way I can write programs in C today. So I have to recompile for every architecture on which I want to run. Ok, I wish I didn't, but that's what I have to do today anyway, but I have to do it in C instead of Java. Virtual machines are cool. Security models that allow network-distributed code are cool. Serialization and agent-like behavior is also cool. But these are not what I'm most interested in. There are a lot of people who are most interested in those things, but me, I just want to write a program that will run on some suitable number of hardware architectures. Sure, I am happy distributing binaries for each architecture to do that. Sure, having one binary that ran on everything would be nice, but you know, it's just not a hard requirement.