Smalltalkの愉快な方言たち

# 概要
いろんな Smalltalk、みんな違って、みんな良い！

# はじめに
プログラミング言語を習得しようとしている初心者にとってよくある難問が、「で、どの処理系、どの開発環境を使えばいいの？」です。Smalltalkも例外ではなく、初心者にとってどれがどうなのかよくわからないという声をときどき聞きます。Smalltalkの場合、言語仕様がコンパクトなために、逆に処理系ごとに独自拡張などのクセがあったりします。そこで、2018年現在まだ動作する処理系を「方言」として、いくつかリストアップして特徴を説明します。

# Pharo
今、Smalltalk初心者からどの方言が良いか聞かれたら、第一選択肢として [Pharo](https://pharo.org) を挙げます。
Pharo は MITライセンスで公開されているオープンソースソフトウェアで、Smalltalkの中では比較的新しい方言になります。Pharoを推す第一の理由として、コミュニティが活発であることが挙げられます。Smalltalkの国際的な技術イベントの1つに [esug](http://www.esug.org/wiki/) がありますが、ここ数年の esug での発表の多くは Pharo に関するものになっています。[pharo-users メーリングリストアーカイブ](http://lists.pharo.org/pipermail/pharo-users_lists.pharo.org/)からもその流量がわかるかと思います。もちろん、[Discord](http://pharo.org/community)などのライブチャットツールも使われています。[書籍や教材](http://books.pharo.org/)も豊富にあります。また、[ビデオ教材](https://mooc.pharo.org/)には、[日本語を含む多言語字幕](https://github.com/SquareBracketAssociates/PharoMooc/tree/master/Subtitles)が用意されています。
コミュニティが活発なことと関連しますが、開発ツールの開発がとても活発です。例えばクラスブラウザは次のメジャーリリースで [Calypso](https://github.com/pharo-ide/Calypso)に置き換わります。また、[Glamorous Toolkit](https://gtoolkit.com/)は、プログラミングメディアとドキュメンテーションの関係を全く新しいビジョンに基づいて刷新しようとしています。5年後の他言語向けIDEがどうなっているか、Pharoを見ることで先回りして体験することができます。

# Squeak
Smalltalkという言語が何を目指していてどのようなプログラミングになるのか、それを最も現実に忠実に体現している方言を探しているのであれば、[Squeak](https://squeak.org/)をお勧めします。
Smalltalkを生み出したアラン・ケイ博士やダン・インガルス氏の研究チームが開発の中心的役割を果たしてきました。そして、先述の Pharo を含め、いくつかの Smalltalk 方言を派生させてきました。そして今でもとても野心的なプロジェクトを派生させ続けています。例えば、Smalltalk VMのJavaScript実装 [SqueakJS](https://squeak.js.org/)や、さらにそこから派生した [Caffeine](https://caffeine.js.org/#/caffeine) など。

# VisualWorks
Xerox PARC からの Smalltalk の直系が VisualWorks です。現在は[Cincom社](https://www.cincom.co.jp/)が開発・販売する、商用の処理系です。[個人利用向けライセンス](http://www.cincomsmalltalk.com/main/community/product-portal/trying-cincom-smalltalk/try-cincom-smalltalk/)で無償で利用することができます。

VisualWorksの特徴として、高速かつ信頼性の高いVMが挙げられます。現在では多くの言語VMがJITコンパイルや各種キャッシュによる高速化が施されていますが、VisualWorksのVMはその源流と言って良いと思います。長い歴史の中でブラッシュアップされたことによる高い信頼性、Smalltalkが持つ自由度からは信じられない実行速度は、一度体験しておく価値があります。
また、前述のPharoおよびSqueakのGUIがホストOSでは1つのウィンドウの中に閉じているのに対して、VisualWorksではホストOSのウィンドウシステムをそのまま使うことができます。また、GUIの実装として非常に長い歴史の中でブラッシュアップされてきた質の高いクラスライブラリが挙げられます。あえて挑発的に言えば、VisualWorksのUIのソースを見ることなしにMVCを語るなんて噴飯ものです。MVCの真髄がそこにあります。
また、他のSmalltalk方言との違いとして、ネームスペースが挙げられます。Smalltalkでは、グローバル変数は単一のネームスペース（その名も```Smalltalk```）を持っていたのですが、VisualWorksでは階層構造を持つ名前空間を利用し、また、ユーザ定義することができます。


# GemStone/S
GemStone/SはSmalltalkベースのOODBMSです。単にオブジェクト指向DBなだけでなく、GemStone/S自体が1つのSmalltalk処理系として実装されています。商用ですが、[無償もしくは安価なライセンス](https://gemtalksystems.com/licensing/)もあります。
一度GemStone/Sを使ってしまうと、ORマッパーなんかでは満足できない体になってしまいます。ご注意を！
GemStone/Sでは、ディスクパーティションをオブジェクトメモリとして使います。つまり、オブジェクトは全て永続化されます。オブジェクトメモリの上に、複数のVMが並列実行します。GemStone/Sはサーバとして動作して、クライアント側となるSmalltalk(VisualWorks, Pharo等)がGUIを提供します。
GemStone/Sは分散オブジェクト環境として見ることもできます。GemStone/Sのオブジェクトは、プロキシオブジェクト(Forwarderと呼ばれます）またはコピー（Replicateと呼ばれます）として、クライアント側のSmalltalkのオブジェクトメモリ中に転送されます。クライアント側のSmalltalkのForwarderが受け取ったメッセージはGemStone/Sに転送され、GemStone/SのVMが元オブジェクトのメソッドを実行します。また、Replicateに対するトランザクション中での変更をトランザクションをコミットする時にGemStone/Sに反映させたりすることができます。
そして驚くべきことに、ディスクパーティション中に永続化されたオブジェクトに対しても、ちゃーんとガーベージコレクタが使われなくなったオブジェクトを回収してくれます。

# まとめ
どのSmalltalkでもいいから、とりあえず思いっきりヒャッハーしようぜ