views:

5359

answers:

6

I have already read various accounts of Clojure vs. Scala and while I realize that both have their place. There are a few considerations that I haven't acquired a complete explanation on when it comes to comparing both Clojure with Scala:

1.) Which of the two languages is generally faster? I realize that this will vary from one language feature to another but an general assessment of performance would be helpful. For example: I know that Python dictionaries are really fast. But as a whole, it is a much slower language than Java. I don't want to go with Clojure and run into this problem down the road.

2.) How is interoperability with Java? All I have read so far is that Scala has native collections types that make it a bit clumsy to integrate with a large Java code-base, whereas Clojure follows a simple Iterable/Iterator-centric way to inter-operate with Java classes. Any more thoughts/details on this?

Ultimately, if it is a close enough draw between clojure and scala, I might try them both. One thing about Clojure is the language seems very simple. But then again, Scala has a very flexible type system. But, I know that Scala is fast (based on multiple personal accounts). So, if Clojure is significantly slower: I'd like to know sooner rather than later.

+23  A: 

I think either language will be fast enough for you. When comparing Python and Java, it seems a bit unreasonable to blame the language for the speed difference. Java is compiled JIT (except on mobile devices) whereas Python is interpreted. Just because both use a bytecode does not mean the implementations will have even remotely comparable performance. But both Scala and Clojure are JVM languages so they should have similar performance.

Scala has a few implementation advantages over Clojure and I would expect somewhat higher performance. Although Scala's static typing would normally translate into a speed advantage over Clojure's duck typing, Clojure does support type hinting which can speed up code considerably. Possibly, ordinary Scala is faster than ordinary Clojure, but you only need to optimize the bottlenecks. Most of a program's run time is generated by a small amount of the actual code.

Regarding interop w/ Java, Scala is closer to Java but I'm sure both languages interoperate well. In Programming Clojure Stuart Halloway writes: "[you can access] anything you could reach from Java code.".

And since Scala author Martin Odersky wrote Sun's Java compiler, I kinda think no balls have been dropped on the Scala side, either. :-)

You would be hard-pressed to pick two better languages, though I like Ruby also. Why are you worried about which one to try? Why not try them both? Scala is more likely to be "the next Java", while it's hard to imagine that Lisp will finally take off after not doing so for over 50 years. But it's clear that Lisp is on its own unique level of abstraction, and Clojure is fairly simple, so Scala + Clojure won't be that much harder than just (the rather complex) Scala and I'm sure you will be glad you did it.

And for that matter they interoperate...

DigitalRoss
Huh. Well, thanks for all of the insights. At first, I was in the mode where I wanted to just pick one and run with it. But for some reason, it didn't occur to me that I could just use both and have them inter-operate. So, perhaps I'll pick both and do a fast-walk with them :-)
Ryan Delucchi
And I'd like to add that I do have a bit of a "soft spot" for LISP so the fact that Clojure suffers from parethesitis isn't enough to scare me away.
Ryan Delucchi
It's not always true that a language written in the JVM will perform at top speed. The original JRuby had abysmal performance because it was an interpreter that was compiled to the JVM, not the source code. The language, also, can be to blame. Statically typed languages are often easier to optimize than dynamic languages, etc.
Bill K
+8  A: 

The stats produced by the "Computer Language Benchmark Game" are about the best you're probably going to find.

They are in-depth and you can compare many languages. The problem is that they don't cover Clojure :(

That said, it's pretty easy to submit anything--it's all open source.

The stats do say that Scala is pretty damn quick.

Bill K
fyi http://shootout.alioth.debian.org/u32q/compare.php?lang=clojure
igouy
There you go. 2-25x slower than Java, 2-30x more memory and code size is generally larger than Java. Looks like it's comparable to Python where Scala is very close to Java. I'd say Scala is a pretty clear winner and Clojure is significantly slower--unless the Clojure test was poorly written.
Bill K
It seems that the benchmark does covers Clojure now (OP's remark is one year old). And the results are not encouraging. Scala is the way to go.
Martin
+12  A: 

With the present JVM Scala has an advantage on the account of being statically typed, as JVM support for dynamic typing -- reflection -- is slow. In fact, one Scala feature which must be implemented through the same techniques, structural types, is often warned against for this very reason.

Also, Scala accepts mutable objects just fine, and some algorithms are just faster to implement with mutability.

As both Scala and Java are essentially class-based languages, they interoperate more easily. Or, perhaps, more seamlessly. A Java class is a class to Scala, and a Scala class is a class to Java. Problems might arise when it comes to Scala's singletons or Java's static members, particularly when there's a framework involved expecting things to work in a certain way.

So I'd go with Scala on both these accounts. Clojure is, in many ways, a better language, and it certainly has very interesting features not present (so far) on Scala, but you reap such benefits by going fully functional. If you intend to do that, then Clojure is very likely better. If you don't, then you should probably stay with Scala.

Daniel
The functional programming features of clojure are the most compelling reason why I am considering this language. I'm reaching the point where: if I'm not coding something in a functional fashion - why am I bothering with a scripting language embedded in Java anyway? I already have Python at my side for doing quick-and-dirty tasks.
Ryan Delucchi
Then go with Clojure.
Daniel
+9  A: 

Note that Clojure and Scala are two totally different types of programming languages - Clojure is a functional Lisp-like language, it is not object oriented. Scala is an object oriented language which has functional programming features.

In my opinion, the features and concepts of a language (functional, OO, ...) are much more important criteria for choosing a language than the performance (of a particular implementation of that language) - altough I understand that you don't want to get trapped into a language for which there is no well-performing implementation available.

I'd go for Scala, because it is object oriented but also allows you to learn functional programming (if you're interested in that). On the other hand, if you don't care about OO and you want to learn "pure" functional programming, try Clojure.

Jesper
Clearly you haven't used Clojure. Clojure is about as Object-Oriented as Scala is Functional. You can implement an interface, extend a class, declare private and static functions, etc. (http://clojure.org/java_interop).
Richard Clayton
Those things exist in Clojure for interoperability with Java, but classes and objects are clearly not main features of Clojure. You don't create classes and design your project in an OO way if you're going to program in Clojure.
Jesper
+3  A: 

On interoperability, I can't speak for Clojure, but I would expect it to be in a similar situation as Scala.

It is trivially easy to call Java from Scala.

It is easy to call Scala from Java as long as you conform your external API to the common points between Scala and Java. For example, a Scala object is used in some ways like static methods in Java, but it's not the same thing. Scala classes may compile to a number of classes with names that look funny in Java.

You will not want to mix and match much. Building component in Scala or Clojure that uses lots of Java libraries is very feasible. You can of course call into this component from Java, but what you are not going to want to do is try to consume a Scala API intended for use by Scala programs from Java.

SVN claims to be "CVS done right". In my view, Scala is Java done right.

Kevin Peterson
A: 

It's now (as of May 2010) worth loking at the latest 1.2 branch of Clojure - this includes a lot of additional support for primitive types and static typing (through various type hints and protocols).

My understanding is that you can use these features when you need it to get speed equivalent to writing exactly the same code in pure Java.

mikera
And at the same time, the `@specialized` technique in the upcoming Scala 2.8 is bringing an analogous improvement to the Scala libraries. And as a language facility, it's available to all code, not just the standard library.
Randall Schulz