Static and Dynamic Typing: Fight!
It’s rare that I find a good, balanced article on the (dis)advantages of static vs dynamic typing, mostly because people on each side are too religious (or perhaps just stubborn) to see the benefits of the other. Stevey’s blog rant comparing static vs dynamic typing is one of the most balanced ones that I’ve seen, even if I think half his other blog posts are on crack.
I lean toward pretty far toward the static typing
end of the spectrum, but I also think that dynamic
typing not only has its uses, but is absolutely
required in some applications. One of my favourite
programming languages is Objective-C, which seems to
be quite unique in its approach: the runtime system
is dynamically typed, but you get a reasonable amount
of static checking at compile-time by using type
annotations on variables. (Survey question: do you
know of any Objective-C programmers who simply use
id types everywhere, rather than the more
specific types such as NSWindow* and
NSArray*? Yeah, I didn’t think so.) Note
that I think Objective-C could do with a more a
powerful type system: some sort of parameterised type
system similar in syntax to C++ templates/Java
generics/C# generics would be really useful
just for the purposes of compile-time
checking, even though it’s all dynamically typed at
runtime.
One common thread in both Stevey’s rant and what I’ve personally experienced is that dynamic typing is the way to go when your program really needs to be extensible: if you have any sort of plugin architecture or long-lived servers with network protocols that evolve (hello Erlang), it’s really a lot more productive to use a dynamic typing system. However, I get annoyed every time I do some coding in Python or Erlang: it seems that 50% of the errors I make are type errors. While I certainly don’t believe that static type systems guarantee that “if it compiles, it works”, it’s foolish to say that they don’t help catch a large class of errors (especially if your type system’s as powerful as Haskell’s or Ocaml’s), and it’s also foolish to say that unit tests are a replacement for a type system.
So, the question I want to ask is: why
are programming languages today so polarised into
either the static and dynamic camp? The only
languages I know of that strive to accommodate for
the benefits of both are Objective-C, Perl (though
I’d say that writing Perl without use
strict is an exercise in pain, since its only
three types are scalars, arrays and hashes), and
(gasp)
Visual Basic. Programming languages and
programming language research should’ve
looked at integrating static and dynamic typing a
long time ago. C’mon guys, it’s obvious to
me that both approaches have good things to
offer, and I ain’t that smart. I think a big reason
they haven’t is largely for religious reasons,
because people on both sides are too blinded to even
attempt to see each other’s point of view. How many
academic papers have there been that address this
question?
I hope that in five years, we’ll at least have one mainstream programming language that we can write production desktop and server applications in, that offer the benefits of both static and dynamic typing. (Somebody shoot me, now I’m actually agreeing with Erik Meijer.) Perhaps a good start is for the current generation of programmers to actually admit that both approaches have their merit, rather than simply get defensive whenever one system is critiqued. It was proved a long time ago that dynamic typing is simply staged type inference and can be subsumed as part of a good-enough static type system: point to static typing. However, dynamic typing is also essential for distributed programming and extensibility. Point to dynamic typing. Get over it, type zealots.
P.S. Google Fight reckons that dynamic typing beats static typing. C’mon Haskell and C++ guys, unite! You’re on the same side! Down with those Pythonistas and Rubymongers! And, uhh, down with Smalltalk and LISP too, even though they rule! (Now I’m just confusing myself.)