The Coming War Over the Future of Java
snydeq writes "Fatal Exception's Neil McAllister writes about what could be the end of the Java Community Process as we know it. With the Apache Software Foundation declaring war on Oracle over Java, the next likely step would be a vote of no confidence in the JCP, which, if the ASF can convince enough members to follow suit, 'could effectively unravel the Java community as a whole,' McAllister writes, with educators, academics, and researchers having little incentive to remain loyal to an Oracle-controlled platform. 'Independent developers could face the toughest decisions of all. Even if the JCP dissolves, many developers will be left with few alternatives,' with .Net offering little advantage, and Perl, Python, and Ruby unable to match Java's performance. The dark horse? Google Go — a language Google might just fast-track in light of its patent suit with Oracle over Android."
Reader Revorm adds related news that Oracle and Apple have announced the OpenJDK project for OS X.
They are the one and only company that can pull this thing straight. They have the money, they have proven their commitment to OSS, so I sincerely hope they step in and fix this. It's too important to let Oracle mess everything up.
You know, this is very puzzling. Why hasn't FOSS come up its own managed runtime+language stack?
It's certainly not for a lack of engineering talent.
Procrastination? Lack of vision? Or is open source just too tribal and fragmented to coordinate on something so big and cross-disciplinary?
Maybe I'm being naive, but right now C# looks fairly tempting. MS aren't pulling strange "premium VM" tricks, Mono is well developed and generally works as expected, and it's not a huge leap in terms of language. Many libraries in Java have C# equivalents (Bouncy Castle, iText, etc.). If we were going to leap from Java, C# would definitely be top of my likely destinations.
But no, obviously we're more likely to jump to a language I've never heard of before, with none of the libraries we use, and no experience base to pull from...
Really? As competition to Java it is fairly comparable. It has some features that, used improperly will lead to slower code (though, they are nice as a convenience), it is missing some features, has some features that Java is missing, and the free version of Visual Studios, at least in my opinion, is a nicer IDE than Eclipse, Netbeans or Anjuta. And it's not being used in a bunch of lawsuits by it's owner.
As a point of reference as to where I'm coming from with this post - Sysadmin + Java programmer at work, C/C#/Python Programmer at home.
Self proclaimed typo king, and inventor of the bear destroying coffee table (patent not pending).
It's too bad that some of the most promising new languages (Scala, Clojure) are JDK based. What we need is a modern lingua-de-franca, a language that's structured enough, with modern features, a good standard library, and that doesnt take 10 years to master. Go is still proprietary shite that will bite you after Google turns evil (and you know they will). Havent looked at D yet. Erlang maybe?
Is there any high-level, easy language today that's not threathened somewhow by f%^&%ng patents from the big guys?
-- Home is where you eat your heart out.
Not to mention that C# already has a ton of useful features that are, at best, planned for Java 7 and 8 (or later).
I've done significant cross-platform .Net/mono development and 99% of the stuff "just works". I'd argue that Mono is actually a better cross-platform development environment than Java *right now*. Java often requires tweaks because different builtins work differently on different platforms, even though they're not supposed to.
Google is trying to force the legal issue and end this with a court battle.
Apache is trying to end it using the JCP
IBM is trying to be all chummy and get Oracle to support OpenJDK
If Google wins then Java is Free, if Apache wins then Java is Free, if IBM wins then Java is theirs.
That's what the lawsuit is about, isn't it?
That only deals with copyright problems. It's irrelevant to patents (And Google claims to have already effectively done it).
Warning: this article may contain humor, sarcasm, parody, and perhaps even irony. Read at your own risk.
If Perl, Python, and Ruby are unable to match Java's performance, I'll take their portability, ease of development, lack of overhead and succinctness over Java any day.
Rich And Stupid is not so bad as Working For Rich And Stupid.
Perl, Python, and Ruby unable to match Java's performance
I don't know about Ruby, but Perl has damn good performance, such that it still runs a number of major web sites, including this one. The ONLY reason Java is as popular is because Corporate America loves a corporate solution and Java was being sold as a solution by major vendors(think IBM, Sun and for a while Microsoft).
You cannot really sell Perl, or Python, or Ruby as a corporate solution because they cannot hijack a version, edit it and claim it is special. Hell, Perl runs on EVERYTHING what more can IBM add to it? This is really why good open source languages are neglected by large companies, they cannot charge anything for it.
Apple will contribute [to OpenJDK] most of the key components, tools and technology required for a Java SE 7 implementation on Mac OS X, including a 32-bit and 64-bit HotSpot-based Java virtual machine, class libraries, a networking stack and the foundation for a new graphical client. OpenJDK will make Apple's Java technology available to open source developers so they can access and contribute to the effort.
Dear lord, I hope it's not Apache. Any organization that allows new versions of its libraries to target Java 1.4 when 1.5 has been out for over half a decade does NOT deserve to be put in charge of the entire language. Particularly when said library deals with Collections.
There are some things .NET does better than Java. This includes: Generics, Properties, GUI, Web Services (although JWS is a marked improvement over Axis 1/2, and brings this more in line with .NET's WCF). This does not include: Database access (although the .NET Entity Framework may address much of this; from what I've seen it's a lot like JPA), Concurrent collections
Granted, that list is just things I can think of off the top of my head.
GLaDOS for President 2016! "Well here we are again. It's always such a pleasure." -- GLaDOS, 2011
I agree with MOST of your post, but your statement that "Java is interpreted" is misleading. Java (at least modern Java) is a compiled language, it's just that it's compiled in two stages; once when the java compiler converts the source code to byte code and then when the JVM converts the bytecode to native code during runtime (JIT). To state that Java is interpreted leaves the impression that it results in inferior performance as compared to a traditional source-to-native code compilation process. This is a persistent that myth has been shot down time and time again in real-world benchmarks.
I'm just sayin'
As far as something replacing Java - who knows, but I don't see it in anyone's interest (including Oracle's) to throw out the baby with the bathwater. Oracle was already heavily dependent on Java long before they acquired Sun.
There are already alternatives to the Sun/Oracle Java distribution (the Delvek VM itself might be a good candidate to replace the JVM) and it really boils down to software patents and how far the courts and the broken patent system allows corporations to claim IP over generally accepted concepts. It may just be a matter of forking OpenJDK and calling it "Coffee" to remove it from Oracle's greedy hands (just like OpenOffice being forked as Libre Office). I have a feeling Oracle won't let this happen with Java however because it has too much interest in it. IMHO the best outcome of this would be for Google to prevail, and take down Oracle's patents along with it. Not only would this teach Oracle a (much needed) lesson in how to deal with the OSS world, but it would also remove current obstacles to the acceptance of Java out of fear of Oracle's legal team.
Sometimes the light at the end of the tunnel is the headlight of an oncoming train.
Understanding that the entire toolchain and widespread adoption is the most important part of getting it. We all (at least, if we were there for it) know how Java happened - the short version is that Sun positioned it as an alternative to the MS Borganism that many companies were rightly afraid of back then.
I still think Java pretty much sucks. But it has the tools, and perhaps more importantly, a huge number of able bodied code monkeys who can write it.
Enter Oracle. The entire strategy that they've pursued forever is not much different than what Microsoft tried - build or buy essential parts of the stack, and then march up and down it to dominate your category, then extract as much rent as possible. It works better in the enterprise space and is bloodier because there are fewer players. (Microsoft's ecology was too varied with too many players to really dominate like Oracle can.)
So, Oracle's strategy is obvious. They own Java, and thus indirectly can manipulate the terms of output of thousands of developers. They don't care about people liking them, and inertia means they can extract rent for a long time (Even if a second Sun/Java moment happened - say, Parrot v. Java, ramp-up for Parrot to fill the niches, get solid, debugged libraries for everything, get widely deployed, and get thousands of developers up to speed takes how long?)
They don't give a shit about Apache, or developer goodwill. The for-profit players like IBM have different strategies, but keep in mind that their goals are profit maximization, too.
So there are some potentially interesting strategic plays to be made between the various players, but anyone with a bit of experience with the business side of the industry has seen this show before.
I forget what 8 was for.
I'm sick of reading slashdot stories and comments that compare dissimilar languages with Java. What makes Java interesting, useful, and modern is the JVM; these comparisons between language features alone are ridiculous. Most of the languages suggested as alternatives in Java-related posts in the last month are merely interpreted. Python, ruby, perl, etc. are all modernish, high-level languages with dynamic typing. They all run (primarily) on their slow, crippled interpreters. This has numerous drawbacks including problematic multithreading (c.f. the arguments about python's GIL and workarounds over the years), if it's even attempted (in perl, separate processes are the only reliable way to do concurrent programming).
And now Slashdot compares Go to Java. Go is certainly interesting, but it's not in the same space as Java. Java is a portable, networked, object-oriented *application* language. It removes a lot of hassles not necessary to tinker with when writing applications. It has useful, established APIs (servlets, EJBs) for building large-scale enterprise applications. Go compiles to machine code and is therefore not portable. Go doesn't allow inheritance. Go is a language that tries to solve a different problem than Java has solved. Go is no replacement.
Java is by no means the end of all languages and runtimes, but it has set the bar pretty high. It would be wonderful for other projects to adopt Java's features and improve and extend them. It'd be awesome if such an efforts weren't completely nullified by having Microsoft as its boss.
For the naive (and the dude who argues that python is a suitable replacement for Java), below is a list of features Java provides:
Java's JVM does true multithreading. The memory model is tight, efficient, and predictable. The language includes useful mechanisms for writing for concurrency (everything from traditional locking mechanisms to concurrent data structures and the convenient "synchronized" keyword). Productive, predictable concurrency is possible in Java and not in many other languages.
The JVM offers other benefits, including security. The class verifier can sort out malicious code before it's executed. The class loader can check roles granted to a piece of code and a cryptographic signature and decide not to run code on that basis. Even if a piece of code gets loaded and executed, it's sandboxed. Talking about these features is usually relegated to discussions about java applets, but their relevance to other applications is noteworthy.
Java includes a lot of well-organized, stable libraries for doing everything from handling HTTP requests and crafting responses to doing cryptography. Its collections API has many data structures that just aren't present in other languages without looking to a third party.
Finally, the JVM makes naive code fast. One can write reasonably expressive, straightforward code and expect that the hotspot compiler will optimize it. It's a boon for getting maintainable, quality code out-the-door quickly.
I too am bothered by Oracle's litigiousness, but running away from Java isn't a solution. We need alternatives, that's for sure, but the availability of such is a lot more limited than the average slashdotter seems to think.
C++ is every bit as portable as assembly. All you need to know is what parts fail on which platforms, compile 15 different ways, and pray it all works after someone upgrades something.
You do not have a moral or legal right to do absolutely anything you want.
Objective C is associated with Apple but it's not an apple exclusive. It has the late binding attraction of Java, but the speed of C. It simplifies objects and is easier to write than C++.
Outside of assembly is there anything that isn't easier to write in than C++? Real question.
grape - the GNU free, open source rape
--> Java (at least modern Java) is a compiled language, it's just that it's compiled in two stages; once when the java compiler converts the source code to byte code and then when the JVM converts the bytecode to native code during runtime (JIT).
Your description points out that it is not compiled by saying that it is compiled twice? So using your description, Java is a language that has to be compiled by the writer and again by the user. I say compiling scripts so the outcome can be compiled every time they are used is just annoying. I think the only reason for it was because some Java programmers wanted the contents of their code hidden. Everyone knows that if you don't want someone reading your code you write it in Erlang and Perl.
Having to work for a living is the root of all evil.
I'm a big Objective-C fan, but running against you are the fact that most of the modern features that give it some parity with Java -- like the GC and the functional programming features -- are only supported by one extremely mercurial vendor that has a nasty tendency of making no 5-year roadmaps. Also the framework and libraries just don't offer the same coverage as Java. A lot of people at the turn of the century bet on WebObjects, which was a serious platform at that time, and now it's abandonware. Nobody wants to get burned like that again.
What was I saying about abandonware?
Don't blame me, I voted for Baltar.
C++ has an astonishingly complicated grammar, which means that compilation takes forever and other tools don't work as well as they do for languages with simpler grammars, like C or Java.
C++ doesn't really have compile-time encapsulation: if you add a private member to a class, you need to recompile everything that uses that class even though the class's public interface didn't change. That woudn't be so bad in and of itself except that C++, again, takes forever to compile.
C++ also doesn't have run-time encapsulation or really any serious run-time error checking that you don't do yourself. Yes, it's for performance reasons, but some people are working on problems that aren't performance-critical and would prefer a language that doesn't pound nails through our dicks. (if it doesn't have encapsulation, why do they call it "object oriented?")
C++'s exception support is hilariously broken. 1) If you've allocated some memory for an object, and then you throw an exception, you don't have that pointer anymore, and because C++ doesn't have garbage collection you've just leaked memory. The only way around this is to implement garbage collection yourself; C++ weenies call this "RAII" and if they're really far down the rabbit hole they sometimes don't even realize that it's just them implementing shitty reference-counting garbage collection. 2) You can't throw exceptions in destructors. Well, you can, but when an exception is raised, all the destructor for objects on the stack are called, and if one of them throws an exception while you're already handling an exception the program terminates. Seriously, that's what the standard says, I'm not making this up. So you can't throw exceptions in destructors, or call any function that might throw an exception. 3) In every major compiler I've used, exception handling support is implemented in such a way that it slows down every function call you make. Yes, it's only slightly, but it means if you really care about performance, you can't use exceptions, and if you don't care about performance why the hell are you using C++? And even if you want to use them they're almost worthless; I mean you can't even get a goddamn stack trace out of them. You can throw arbitrary objects, but the catcher can't figure out what the hell the object is because of C++'s lack of reflection. Etc.
C++, in an effort to be sort-of compatible with C (except where it's not compatible with C, which makes you wonder why they bothered in the first place) keeps all of C's features while creating duplicate features with their own new, horrifying problems. So you have C++ templates, but you still need to deal with C macros. You have std::vectors, but you still need to deal with arrays. You have std::string and char*, and neither is particularly good. Making things even funnier, C++ doesn't like to use its new features and prefers the C stuff: a string literal is a char*, not a std::string, the arguments to main() are int argc, char** argv, rather than something sensible like std::vector args, iostream does not take std::string for its filename arguments, etc.
While we're on the subject, the standard iostream is pants-on-head retarded. The streams are stateful, which means that std::cout foo; depends not only on the values of cout, foo, and the overloaded left bit shift operator, but also on whatever's been sent to cout in the past. You send values like std::hex or std::setw(int) to set parameters, so when you grab a stream you don't really know what the fuck will happen. This is supposed to be an improvement over printf? They're verbose as hell, too: say you're printing some hex numbers. In C, you'd use "printf("0x%08xn", x);" for int x. In C++, you use "std::cout std::hex std::setfill('0') std::setw(8) x std::dec std::endl;" It's absurd.
The standard library is completely anemic. I'm not even talking about GUI stuff, here: there's no platform-independent way to do some really basic stuff like pausing for a length of time, or starting a new thread. You can use so
I've upped my standards, so up yours.
C++ has an astonishingly complicated grammar, which means that compilation takes forever and other tools don't work as well as they do for languages with simpler grammars, like C or Java.
Modern c++ compilers are extremely fast; not as fast as Java compilers, but considering they do much more many things (templates for example), then they are quite fast. They are so fast that compiling large code bases with them is extremely viable, and it's a task done everyday by millions of developers.
C++ doesn't really have compile-time encapsulation: if you add a private member to a class, you need to recompile everything that uses that class even though the class's public interface didn't change. That woudn't be so bad in and of itself except that C++, again, takes forever to compile.
How is that a big problem? you make it sound like it's a colossal problem, but in reality, it's not. Unless your class is used by every other class or function, the recompilation is minimal. The benefit of this is that you can use value classes in c++, whereas in Java you can't, every class is by reference, which is stupid.
C++ also doesn't have run-time encapsulation or really any serious run-time error checking that you don't do yourself. Yes, it's for performance reasons, but some people are working on problems that aren't performance-critical and would prefer a language that doesn't pound nails through our dicks. (if it doesn't have encapsulation, why do they call it "object oriented?")
If you refer to arrays, vector::at() is your friend. If you are not disciplined enough to use it, then you don't belong in programming. You can even use smart pointer classes that throw a null pointer exception, if you really want it. In any case, it's not anything like you say it is.
1) If you've allocated some memory for an object, and then you throw an exception, you don't have that pointer anymore, and because C++ doesn't have garbage collection you've just leaked memory. The only way around this is to implement garbage collection yourself; C++ weenies call this "RAII" and if they're really far down the rabbit hole they sometimes don't even realize that it's just them implementing shitty reference-counting garbage collection.
RAII is actually superior to Java's garbage collection. It's much more critical for big applications to release as much memory as possible upfront.
2) You can't throw exceptions in destructors. Well, you can, but when an exception is raised, all the destructor for objects on the stack are called, and if one of them throws an exception while you're already handling an exception the program terminates. Seriously, that's what the standard says, I'm not making this up. So you can't throw exceptions in destructors, or call any function that might throw an exception.
How is that even a problem? Java's unpredictable finalization order is way more of a problem.
3) In every major compiler I've used, exception handling support is implemented in such a way that it slows down every function call you make. Yes, it's only slightly, but it means if you really care about performance, you can't use exceptions, and if you don't care about performance why the hell are you using C++?
Read this first: http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf Exception handling has a cost only if there are non-trivial destructors to execute. Since C++ allocates most objects statically, the performance cost is factored into the program as if no exception was thrown. On the other hand, in Java, you pay the price in garbage collection.
And even if you want to use them they're almost worthless; I mean you can't even get a goddamn stack trace out of them.
True, but you can have other meaningful information, such as the file