Overflow from JavaIsDead -- TomStambaugh
I think the participants in this discussion would do well to explore the history of Smalltalk, especially as regards performance, its relationship to graphics, its image model, and the questions of portability and adaptability. We learned many lessons the hard way, and made huge, stupid, and glaring mistakes along the way. It pains me to see another generation of smart and hard-working developers making the same mistakes -- those who do not know history are destined to repeat it. -- TomStambaugh
I'm not sure I understand. How am I ignoring my experience in SmallTalk and other VM-based OO languages? -- RobertDiFalco
My view is that it was the effort of the Smalltalk and Lisp community to fulfill these claims -- most especially the claims of binary portability -- that killed the commercial success of those communities. Smalltalk, especially ParcPlace Smalltalk, had a well-deserved reputation for being both a dog and a pig, especially on PCs and Macs. This was because ParcPlace insisted on preserving the "purity" of the image -- the graphics were emulated, to preserve the look and feel, and the VM was compromised to preserve the binary portability. Now, twenty years later, I see the Java community being torn by the same issues. Sun insists on protecting the "purity" of AWT, and resists efforts to wire it directly to the Windows Toolbox. The VM is compromized so that it can run on a huge variety of platforms (and I'll resist the temptation to start the argument about the Java type system, and whether it has helped or harmed overall performance). I believe that the Java community has given up huge advances in tools, architecture, and flexibility (in comparison with Smalltalk ... not C++) because of its resistance to incorporating the learnings of the Smalltalk and Lisp communities that came before it. This, in my view, is an avoidable tragedy. -- TomStambaugh
Tom, I think you are looking for simple, consistent answers that are not there. While there are many similarities with SmallTalk, there are many differences too. One is that what you propose hurt SmallTalk, binary independence, is the very thing that made Java so initially popular. How would you propose supporting distributed web-based applications with something that doesn't have a VM? You talk like Java and SmallTalk users are two different generations. You should be aware that many SmallTalk users are Java users! And most of us are aware of these issues. Are you actually proposing that giving up the VM would make Java more successful? Come one, things are more complicated than that. There are many issues at play. If we believe your point of view, Java would have never even made a blip on the map. The fact is that many interpreted languages fail and many compiled languages fail. What conclusion do you draw from that? See, maybe I see a different lesson. That a language like Java shouldn't attempt to be a general purpose language. There are some things it is good at, and other applications it is not good for. For me, attempting to blur this line would be making the mistakes of the past. It sounds like you want Java to be C++, but they are different languages with different uses. I don't think things are as black and white as you would like to believe. There are definitely a lot of things wrong about Java like its type-system or resistence to formalized standardization. These problems are, in fact, very much un-like the problems of LISP or SmallTalk. -- RobertDiFalco
TomStambaugh comments: Robert, I've never argued against the Java VM -- my point is that having a VirtualMachine does NOT imply binary portability, nor is binary portability a particularly important objective. In my view, every VM needs to have some sort of foreign function/primitive capability -- JNI in Java. Each platform has platform-specific libraries that are required by the Java application -- the most obvious example being the UI classes. Mostly, I think the Java experience has confirmed the correctness of most of the Smalltalk design decisions -- especially the big ones (like strong typing). Now we just have to be patient while the Java language and community catches up to where Smalltalk was in, say, 1990.
Tom, could you please give us the bulleted summary, for us ignoramuses (ignorami)?
Well, I think the original argument was that somehow we weren't learning from the mistakes of SmallTalk because Java had a VM, used P-code, and was going for some amount of binary portability. If you look at the bullet it says that no one cares about binary portability. So, Python or LISP, in this case, is the same as using Java. It's a language with a VM.
Where in this exchange have I ever said anything about Java being good for every use. You can't simply turn my own arguments on me and claim this was your point of view from the beginning. You started off with a general comment that Java was bad and that one could do the same with CeePlusPlus easier. I responded that Java is a fine solution depending on the problem, for example MultiAgentSystems. Now, you are saying that Java is one of many answers. If you agree that Java is a good solution for some situations and a horrible solution for others then we agree and there is not reason to continue going around in circles like this.
OK, now things make sense -- I didn't claim that Java was "bad", just that binary portability wasn't all that I would have hoped. I think you're confusing me with another one of the anonymous authors. Easy enough...
TomStambaugh comments: I don't have a horse in this particular race. My observation was, and is, that the Java community could learn more from the experience of the Smalltalk community that came before it. Period.
Thanks Tom.
As far as I can tell, the killer problem for Java is very simple: It is massively overengineered. This has led to:
Smalltalk is an entirely different story: It was killed by poor marketing, poor response to customer demand and overal crappy business practices.
I'll agree that there is a large difference between SmallTalk and Java. I think it is naive not to recognize that. However, I almost think Java was under engineered rather than over. I think of continued engineering almost as widdling down a piece of wood. There seems to be little widdling down in Java. It is inching ever closer to an AmorphousBlobOfHumanInsensitivity. There is little consistency between the runtime libaries, the type-system is seriously schizophrenic. Naming conventions and idioms for classes, methods, and packages are different from package to package. Too often, class designers go for C++ like designs such as using ExternalIterators in the Collection classes which would have performed much better as InternalIterators with closures. In fact, performance tests show a dramatic increase in efficiency after replacing the Java Collection Classes with a more object-oriented collection hierarchy. I think the problem can be summed up with consistency and coordination. I think the teams do not coordinate their efforts so multiple solutions are provided. Consider J2EE and Jini. Why is there no shared design or implementation? Consider JSSE, JAAS, java.security, and now RMI Security. All of which chose different solutions for those areas where their problem-spaces overlap. They really need to work towards coordinating their efforts and reject every addition that decreases consistency. This is very different from SmallTalk which took consistency and common metaphors to an extreme. -- RobertDiFalco
I suppose if they had reengineered (read: fixed) some of the early design problems, for example, the type system or the requirement to decalare exceptions on every method (without providing an "all" keyword), they might not have had to overengineer the libraries to work around them. --AnthonyLander
TomStambaugh comments: My view is that Java is well-intentioned but naive. Smalltalk, in 1980, already reflected the combined experience of TWELVE years of work by some of the most talented developers our industry has produced. Early (pre-1980) Smalltalk environments showed some of the bloat, unreliability, and inconsistency of today's Java. For example, the Java approach to class objects is precisely the model used in Smalltalk-78 -- every class is an instance of class "Class". There was a *reason* why the Smalltalk-80 double-rail metaclass hierarchy was introduced! Had the Java community taken the time to understand those reasons, we might be much further along today.
RobertDiFalco comments: Actually, Java reflection is much different from metaclasses in SmallTalk. They are not instances of true classes but instead an instance of a weird factory object that cannot be extended or whose instance members become class members to a non-metaclass. I assume they did this to deal with the performance problems associated with a real metaclass system. However, I would have preferred a real metaclass that has instance data added than the cheap static substitution provided by Java.
TomStambaugh comments: Well, I was trying to be gentle and tolerant with the Java community. You're absolutely correct, of course. They aren't classes *at all* (just try doing anything interesting with static methods). I think it's possible to build and wire in a Smalltalk-style metastructure, I just haven't tried it. I've heard assertions that EJB's are effectively that.
Java is an excellent language for some problem domains which has been pushed as the "perfect language" for all problems.
This has generated some annoyance from those who are tired of having to explain why Java isn't the perfect language for a given problem...
Amen! It's awfully frustrating the black & white point of view most people have -- Either its bad for everything or its good for everything!! Yeesh.
The deep irony here is the same person who wrote this is the same person you claim not to be able to have a discussion with above. :-) Oh well, I've enjoyed the discussion -- hope it's not upsetting you too much.
Actually, it's not that ironic since I knew it was the same person. I just thought I'd meet your annoyance with my frustration! ;)
Oi, this page was flame bait from the moment the link was created. Hmm. Maybe we should start a discussion over whether the whole discussion is irrelevant with the advent of native code Java compilers? Perhaps standardization vs. innovation? Maybe it's time for "CeeSharpIsDead?"?
Many people supported Java for reasons other than technical excellence. Some jumped on a bandwagon. They thought there was safety in the herd. These people can be fickle. Many of them switched away from C++ and if a C# bandwagon emerges, or gives the appearance of emerging, they may switch again.
Some followed Java for ideological reasons. One group saw Java as a possible escape from the dominance of Microsoft. They will continue to favour Java over C# until they are convinced Microsoft has become trustworthy. Another group tends to follow the Microsoft party line. These may adopt C# when they wouldn't other languages, because they think if you want to play on Microsoft's platform you should follow Microsoft's rules.
Either way, technical excellence will not be the deciding factor for many people. -- AnonymousDonor [See WorseIsBetter -- rad]
(I edited the above to make it less pithy, full of "some" and "many". I wouldn't have wanted the previous, extreme form to be the only viewpoint offered, but I had felt it balanced by the rest of the page. The watered-down version is less offensive but also almost vacuous. Anyway, you may want to update or delete your criticisms below. -- AnonymousDonor)
AD says technical excellence won't be the deciding factor, and RDF hears "Java users don't care about technical excellence". How does that work?
--
Actually, the quote from AD that is being countered is "Java supporters are, almost by definition, fickle. If they cared about technical excellence the would be using [other languages]." While it's split up into three sections it is all a single post from AD. I haven't studied logic for a long time, but this clearly indicates that if you have decided to use Java instead of language x, y, or z then you don't care about technical excellence. Seems pretty straight forward to me.
It's obviously a StrawMan argument. But that's an honest mistake (I hope).
Ignoring for the moment the issue of what a particular technology delivers versus promises to deliver, versus is capable of delivering, the telling difference for me between DotNet and Java is the multiple language support.
However, there is nothing that I know that prevents OtherLanguagesCompiledAsJavaByteCodes?, in fact I'm pretty sure that this capability is already availiable for Ada.
So its my hope that the DotNet 'threat' will encourage Sun and others to put together some sort of uniform support for compiling other languages to JVM bytecodes. Has anyone know of any other efforts in this area? -- MikeKrajnak
JPython does this. See http://www.jpython.org/docs/whatis.html for more...
Go to http://grunge.cs.tu-berlin.de/~tolk/vmlanguages.html for a whole raft of languages that emit Java byte codes. I've used Kawa (a Scheme implemented for the VM) to good effect.
There's also Jasmin perl-to-java bytecodes http://www.ebb.org/perljvm/
Other language support was possible with the JVM, but not very easy, especially if you wanted reasonable efficiency. For me this is the single biggest improvement Microsoft have (allegedly) made. Eg I believe ISE had tried an Eiffel-to-JVM project but gave up. Ditto for Smalltalk. Both these languages have been seduced by CommonLanguageRuntime. This is where Sun has really screwed up.
GNU-Eiffel can compile to Java byte code. The main reason that ISE didn't follow it up is because the separate class files in Java limit how much global optimisation can be done and its one of ISE's key tactics for getting decent dperformance out of Eiffel (Its also one reason we TowerJ ended up so fast).
The Java versus C# issue is much less interesting than the JVM versus CLR one. -- DaveHarris
Q: Is the CLR based on Simonyi's work in the IntentionalProgramming group?
A:
Well, if you've done CeePlusPlus and Java, played on MSFT platforms and know COM, played with JVMs, I guess that it is not that difficult to move to CeeSharp, basically they added what's was left out of Java. For the DotNet, it seems okay to work with that. Why wouldn't Java be able to support DotNet interoperability ? It's just a matter of another (perhaps bloated) API. When we look at XML, Java is pretty usable, so why not with SOAP and all which are not very transcendental ideas after all. If anyone has done some CORBA, it is a piece of cake. The main problem here is that LifesTooShort to learn them all. As always, the real goal is to tackle the problem at hand, not to prove that something is better than something else. And it all depends on the PoliticalContext.
So, Java is not dead as the concepts contained in the language have spread some interesting designs into the head of the common developer. Just for that, it was worth existing.