He is, and his way of thinking, if you watch some of his talks seems to be: sometimes you have this problem, and sometimes that problem. How can we write a compiler that tackles both?
If you listen to Rich Hickey or Joe Armstrong you see something completely different. They ask what the biggest problems facing software developers are, and what philosophy should modern software development adopt in order to face these problems. The features of the languages they've designed directly follow from their philosophy.
I think it is no coincidence that Martin Odersky is a PL researcher (and hence is interested more in sophisticated compilers), while Hickey and Armstrong come "from the field".
1) There is an existing language that has become widely used in a domain (or a variety of domains) with a well-developed ecosystem, and
2) There are well-known limitations of that existing language for the domains in which it has become widely used, and
3) The existing alternative languages that take conceptually pure approaches to addressing the problems with the existing dominant language have problems making use of the ecosystem that has evolved around that dominant language and/or pose a difficult transition for programmers versed in the dominant language, and
4) The "big-tent" language provides an easier transition for people versed in the language than purer alternatives (by way of more directly supporting the idioms of the dominant language) and has better support for leveraging the existing ecosystem that has grown up around the dominant language.
So much of being versed in a language is knowing its libraries, but on the JVM, many of the libraries are shared among languages. I use a lot of my Java and JDK knowledge when I write Clojure, and I'm using Clojure when it makes sense and Java when it makes sense.
There doesn't even need to be a "transition" on the JVM, but a gradual, selective use of languages in certain circumstances.
The JVM is the big tent.
> There doesn't even need to be a "transition" on the JVM, but a gradual, selective use of languages in certain circumstances.
To an extent, that's true on any machine so long as none of the languages interposes its own runtime on top of the machine and the languages use common calling conventions.
But the conceptually pure alternatives to Java pointed out in this thread (like Erlang and Haskell) generally don't run on the JVM. And even when they maybe do (e.g., Erjang exists) they don't provide easy access to the ecosystem.
In fact, I don't even consider it a compromise because for all their strengths, neither Haskell nor Erlang solve all problems. In that respect Scala is right. Scala is wrong, however, to think that each concept's deficiencies need to be addressed in the same language. It could have worked in theory, maybe, but the result in practice turned out an ugly mess.
I believe in combining forces through a few languages that interoperable over one platform, and the JVM achieves this quite well.
> And even when they maybe do (e.g., Erjang exists) they don't provide easy access to the ecosystem.
Sure they do. Erjang (and Frege, for that matter) support straightforward integration with Java.
So, if there being more languages that can be run on the VM is a marker of weakness of the primary language for the VM, ...
Also, C++ is not something that people write not critical software with. The browser that I write this reply is written in C++, or the server that processes this may be written in C++.
Scala is also not something that people write "less serious" code. e.g., Twitter frontend services are written in scala.
Every language has solved some or other problem. It is nothing like someone does less serious stuff with it.
I don't entirely see the value in having these "big-tent" languages, where everyone writes their own dialect but imposes that mental cost on all of the other readers. Odersky is clearly a very smart guy, but I'm not persuaded around his way of thinking.
Scala is more expressive than Java-the-language (it'd be difficult to be less so), but that's not the only metric one should use [1].
[1] PLEASE DO NOT READ THIS AS AN ENDORSEMENT OF JAVA-THE-LANGUAGE.