Smalltalk 7つの神話
Smalltalk をやっていると色々な誤解を感じることがあります。ちょっとまとめてみてそれぞれ実際のところどうなのかを書いてみます。
神話1: Smalltalk は古臭くて化石のような言語だ
C言語と同時期に Smalltalk-72 が開発されたので歴史が長いといえば長いほうの言語といえるでしょう。しかし、Smalltalk は古臭いというイメージはおそらく、古い言語仕様のままだという誤った認識からきているのだろうと思います。
現在の Smalltalk システムの多くは言語仕様としては Smalltalk-80 をベースにしていますが、現在も言語仕様が拡張されています。有名どころでは、Traitsがあります。Traitsを世に送り出したのは、Nathanael Scharli他による論文 Traits: Composable Units of Behaviour?ですが、そこにあるように、Traits は Smalltalk で初めて実装された概念です。他にも Slot や pragma など、新しい仕組みが生まれています。
もし Smalltalk の言語仕様に不満があれば、自分でコンパイラを改造して言語拡張することもできます。ほとんどの Smalltalk の実装は、Compiler をユーザプログラムと同様に開発することができます。また、さきほど例に出した Slot は、言語仕様にはない新しい「変数のモデル」をユーザプログラマが定義するための仕組みです。Smalltalkの言語仕様は固定されていません。SmalltalkはSmalltalk自身で改造できる。それがSmalltalkです。
また、言語仕様だけでは Smalltalk の 1/3 しか語ったことになりません。Smalltalk は言語に加えてライブラリと環境を理解してはじめてその真価がわかります。
ライブラリと環境の更新の活発さは、Smalltalk のオープンソースな実装である Pharo の1週間分の更新を見ればわかるでしょう。
もちろん、Smalltalk 用の豊富な 3rd party のライブラリも活発に開発されています。
Smalltalk は古い?化石?とんでもない!
神話2: Smalltalk は遅い
比較対象によりますね。凄腕のプログラマが本気出して脳汁を噴き出しながら C で書いたコードには勝てません。が、最近の Smalltalk VM はどんどん速くなっていっています。最近では Java VM とそれほど遜色ないぐらいになってきています。これは、Smalltalk の柔軟性(つまり逆に言えば最適化のしにくさ、VMのチューニングのしにくさ)を考えれば驚異的なことです。
また、多くの Smalltalk 処理系では強力なデバッガやプロファイラが提供されています。ちょっと頑張れば元の80倍速くなったとか、よくある話です。ミクロなベンチマークでは確かに最速とはいきません。まあ遅い方でしょう。しかし、マクロレベルでは、プログラマの工夫でパフォーマンス改善しやすい言語でもあります。
実際のところ、制御系っぽいある程度のパフォーマンスが求められるような Smalltalk アプリケーションもあるのです。Smalltalkで触覚デバイスの制御をしたとか、ある言語からSmalltalkへのトランスレータを書いたら同じ言語からC++へのトランスレータにパフォーマンスで楽勝(処理時間の桁が違うぐらい)だったとか、まあ、よくある話だったりします。
神話3: Smalltalk は処理系が高い
Squeak、Pharoなど、オープンソースの処理系があります。必要なら有償サポートもあります。以上。
神話4: Smalltalk のような変な構文の言語を使えるのは極一部の変な人だけだ
Smalltalkの構文は、書いてみると中学レベルの英語のような文面になります。逆に言うと、中学レベルの英語、例えば This is a pen. みたいな英語が書ける人がSmalltalkを書けるようになれない理由がわかりません。
神話5: Smalltalk は型安全じゃないからすぐに異常終了する
Smalltalk 環境で動かしている場合、異常終了するのは VM が落ちた場合です。普通に使っていれば、そんなことはあまりありません。
ほとんどのアプリケーションプログラマが見るのは、捕捉されなかった例外があったことを報告する Notifier です。Notifier が出たからといって、「もうだめだ、異常終了してしまった」と諦める必要はありません。実はプログラムはまだ動き続けています。その Notifier の中で。
Notifier には Debug ボタンがついています。そのボタンを押すと、デバッガが立ち上がります。デバッガは 捕捉されなかった例外の標準の動作として Notifier を立ち上げた状態のプログラムのコンテキストをつかまえて、さあ、これをどうしましょう、と訊いてきます。その時に、終了させるか、プログラムを直して実行を続行するか、1ステップごと実行するか、プログラマが選ぶことができます。
Smalltalk プログラムは、プログラマかもしくはプログラム自身が明示的に終了させないかぎり、途中で異常終了することはありません。
神話6: Smalltalk では長期にわたって開発するような大きなシステムを構築できない
逆に考えましょう。Smalltalk で書くと、小さく書けてしまうのです。小さく書けるから、早く書けるのです。まじめな話、ほんとそうなんです。
神話7: Smalltalk の t を大文字で書くと恐い人に叱られる
そんなことはありません。「SmallTalkはどーたらだからダメ」みたいな神話を広めているのを見かけると、「正当な批判してくれるならありがたいことだけど、せめて SmallTalk ではなく Smalltalk と書ける程度には使ってみてから批判してくださいよ」という気持ちになる、そんな親切心の表れなんだと思います。
Smalltalk はあまり類似した言語/環境が少ないので、実際に Smalltalk を「体験」してみないとその良さがわからない、という事情があります。JavaとC#なら言語仕様を比べてある程度の違いを理解して、問題点になりそうなところを推測することができるでしょう。しかし Smalltalk を使ったらどうなるかを Java を基準に推測されても、それは金星を見て火星の地表を想像するようなものなのです。Smalltalk に似た言語/環境に Self がありますが、これがまた Smalltalk よりさらに輪をかけてマイnげふんげふん、何でもないです。
というわけで、「SmallTalkじゃない、Smalltalkだ!」とツッコミを入れられたら、ぜひその人を捕まえて Smalltalk の使い方を根掘り葉掘り訊いてみてください。きっと目をキラキラさせて教えてくれます。