Nov
17
2008
I often find myself longing to be able to use Clojure, a very enticing lispy language that runs on the JVM.
I could possibly be using it right now in my dissertation research. It has the promise of dynamic languages, functional programming, almost-as-cool-as-Erlang concurrency, JVM performance, and Java library soup. It could be so awesome. A few months ago I started briefly down this road, unaware that…
Clojure sucks. Not generally, but it sucks for DSP. More specifically, Java and therefore Clojure has no real support for complex numbers. In order to do serious DSP, you need native syntactic, semantic, and performance support for complex numbers. Java has none of the above. Older versions of C didn’t have syntactic or semantic support, but the performance of using arrays was plenty fast. Not so in Java, at least not to the extent necessary to override the lack of syntactic and semantic.
So someday, when I’m writing general purpose code again and not high performance DSP code, I will have an opportunity to use Clojure, and I think that will make me very happy. By then the book will be out of beta. The community will be in full swing. There will be awesome libraries. Children will play in pristine parks with formerly-ravenous ravens.
In the meantime, if anyone sees the scene change, do let me know.
3 comments | tags: audio, clojure, concurrency, cs, dsp, dynamic, erlang, java, jvm, phd, ruby
Jul
8
2006
Ever since I discovered ruby I’ve loved dynamic typing. I never paid much heed
to people who got their knickers in a knot over how dynamic typing is “unsafe”.
While working on Ardour this
summer, I’ve literally been wrestling with C++,
all because it is statically typed. The code I’ve been writing over the past
month could have been done in one week with half my brain tied behind my back
(which is the usual situation, by the way), if only C++ were dynamically typed.
In other ways static typing hasn’t exactly got in my way, it just causes me to
jump through hoops that seem silly, unnecessary, and inelegant. A simple
concrete example will help. I’m doing undo serialization, and of course Ardour
already serializes other things in order to save sessions. In C++ this means
lots and lots of otherwise unrelated things all inherit from a common
serializable base class. This is why multiple inheritance is necessary in C++.
In Java you can use interfaces, which is better than multiple inheritance but
not by much. In dynamic languages, you don’t even have to give it a second
thought. You just make sure everything that needs to be serialized responds to
a serialize method, et voilá!
So as I’ve been wrestling I’ve had this nagging feeling that it’s *me* that’s
broken, not C++. Have I become so spoiled by dynamic languages that I can’t
program efficiently in a static language anymore? Are the static people right
and one day my whole world will come crashing in and all my ducks will keel
over? Feelings of self doubt are part of being human, and these were some of
mine this summer. Then I read a blog post by Bruce Eckel on Strong Typing vs.
Strong Testing and my mind was put at
ease. The thrust is, dynamic typing is good, and testing is necessary. I think
this quote about Robert Martin (a C++ guru) sums things up nicely:
Robert came to more or less the same conclusion I have, but he did so by
becoming “test infected” first, then realizing that the compiler was just one
(incomplete) form of testing, then understanding that a weakly-typed language
could be much more productive but create programs that are just as robust as
those written in strongly-typed languages, by providing adequate testing.
I have a thought along these lines. Let’s say you’ve got duck typing in full
swing as in his examples. Now in the real world it sometimes happens that you
choose a common ambiguous word for the duck method, like “run” perhaps, but
more often than not you have methods that are named fairly specifically, like
“speak” or “jump”. The static argument is that you might accidentally call the
method on something that won’t do what you anticipate because it’s not of the
right type. But really now, how many of your objects that implement “jump” are
going to be the wrong kind of objects in your application? Often the answer is
none. So you jump through hoops for no reason.
Do read the article, it’s fun and well-written. Even if you come out still
clinging to your beliefs that static typing is Good and Wholesome, at least
you’ll see that us dynamic people aren’t necessarily lazy, stupid heathens.
2 comments | tags: C, cs, dynamic, java, python, ruby, static