Interesting comment about Google Go
David Brown
kplug at davidb.org
Sun Nov 15 00:05:20 PST 2009
On Sat, Nov 14, 2009 at 11:36:55PM -0800, chris at seberino.org wrote:
>On Sat, Nov 14, 2009 at 09:10:05PM -0800, David Brown wrote:
>>> At this point, I will no longer create anything large in Python
>>> anymore. I would eat the learning curve and switch to Clojure.
>>
>> I'm going to second this recommendation.
>
>Why is Clojure suddenly the best language for large apps for you?
>What happened to Scheme, Common Lisp, Haskell, Go and Ruby?
Don't forget, I learn languages, constantly. To do that, I have to
use them enough to write something significant in them.
I'll go through your list:
- Scheme. Basically, the language definition is too small. I found
that all of them implementations had various drawbacks and pieces
missing. There are also some aspects of scheme that seem to be
done out of "purity" rather than practicality. For example,
call-cc can make reliably cleaning up things like file-descriptors
quite difficult.
Scheme also has too small of a community that there's not enough
other code to use. It's also a problem that anything beyond
very carefully written code isn't going to work on more than a
single implementation.
- Common Lisp. I like Common Lisp, but it has a lot of baggage. A
lot of the language design was decided when things like compiling
an entire file were slow. Common lisp also wants too much to be a
platform, which was probably fine 15-20 years ago, but I need
programs that work _with_ the other programs on my computer, not
live in their own little world.
- Haskell. Haskell is brilliant. Haskell is also one of the most
difficult languages I've successfully learned. It doesn't really
get easier, either. There's also some serious problems that even
GHC people realize are problems, but they just can't figure out
how to address. For example, there's no portable way to create a
global that is associated with IO. The standard library has a
bunch, since they're kind of necessary. It ends up becoming this
cumbersome mess to pass state around, and when that gets too hard,
wrap it in a Monad that is fragile when the design changes
slightly.
Basically, Haskell is too hard to program practically in, and the
resulting code too difficult to practically refactor. Also, the
type system kind of falls on the severely-strict end of the
static/dynamic spectrum, which isn't necessarily pragmatic.
- Go. I've not actually really been interested in Go. I'm sure
it'll go on and be as wonderfully successfully as Plan 9 has been.
- Ruby, see below. Definitely still my favorite scripting language.
But, I also use Python, especially at work, since there are more
people that know it.
- You missed Scala. I think Scala is good, but I like Clojure
better. Scala avoids the dynamic side of programming (it's type
system is almost as strict as Haskell's), which makes it more
cumbersome to prototype and do quick things on. Clojure also has
a better interactive environment (Scala's strong type system hurts
iterative development, mostly because the compiler is about an
order of magnitude slower).
>Last I heard you liked Ruby especially.
I do like ruby. I get the sense you're still thinking you're going to
fine the one perfect langauge that will be appropriate for all
problems.
Keep in mind I've only been programming in Clojure for about a month,
but so far, it seems to strike a surprisingly good balance of language
features.
- A good pragmatic balance of a type system. It doesn't hide from
the JVM's type model, e.g., it's Strings are Java Strings,
although it does have it's own Map/Set/Vector types that are
immutable, the present interfaces so they interact well with Java.
I can start writing code using keyword-indexed hash maps. Later,
when this starts to get difficult to track, I can create actual
structs/types, and use them in almost exactly the same way (use is
the same, creation differs slightly). The improvements Rich is
making actually make 'deftypes' directly map to JVM classes with
final fields.
- A good understanding of what aspects of OO are the good parts, and
which parts are making things worse. OO tends to conflate
multiple langauge problems into one messy solution. Inheritance
is invaluable for polymorphic types. But a lot of my code doesn't
fit this kind of picture. Namespace management, encapsulation,
and even method inheritance have better ways of handling them than
through class inheritance. Clojure brings a lot of this together
in a clear and quite simply way.
- The language is simple. When I first looked at the spec I wasn't
even convince that it was sufficiently finished to do practical
programming. By having so many consistent interfaces, the library
of functions/macros to learn is much smaller. This is one of the
hardest parts of Common Lisp.
- The people working on it really seem to know what they are doing.
- It runs on the JVM. Just having such a large amount of code that
mostly just works is valuable.
David
More information about the KPLUG-List
mailing list