フリーでオープンな Smalltalk システムのひとつ。または、仮想マシン技術で動作する GUI ベースの OS(厳密にはモドキ)。他の Smalltalk システム同様、ネイティブ言語は Smalltalk 言語だが、Squeak システムではそれとは別に eToys というエンドユーザー向けのビジュアル・スクリプティング環境が新たに追加されている。
'70 年代、XEROX のパロアルト研究所(PARC)で作られた試作機「ALTO」用の OS のひとつ *1 。今やお馴染みの GUI、そして、オブジェクト指向 *2 を本格的に採用した史上初の個人ユーザー向けコンピュータシステムで、後の OS に多くの影響を与えた。結果的に、Smalltalk を OS にした ALTO が世に出ることはなく *3 、Smalltalk は用途を限定した開発環境「Smalltalk-80」 *4 として販売されたため、その後は単なる言語処理系というイメージが定着してしまった。
Smalltalk システムのネイティブ言語。自身の処理系、言語仕様的部分も含めた基礎部分から、GUI フレームワーク、標準添付のアプリケーション*5にいたる当該システムのほぼ全機能がこの言語により記述されている。さらに、GUI や各種ツールを介して用いることで、エンドユーザー向けスクリプティング言語としても使用できる*6。
原則として Smalltalk 言語のコードは式のみで構成される。式はリテラル式*7を除き、
メッセージレシーバ メッセージ
の書式に従う。これを「メッセージ式」と呼ぶ。配列要素へのアクセス、二項式、条件式、条件分岐、ループなど通常の言語では構文の一部などとして定められているものの記述も例外ではない。書式のメッセージレシーバ部分には、リテラル式、オブジェクトを束縛した変数、(オブジェクトを返す*8)別のメッセージ式のいずれかが当てはまる。
メッセージ部分の記述は、Smalltalk 言語でもっともとっつきにくい特徴のひとつであるが、ちょっと変わった関数の呼び出しにすぎない…と考えると比較的理解しやすい。関数は0個以上の引数をとり、関数名には引数と同数の「:」を含む(それ以外はアルファベットのみで構成)。また、引数を1つ以上持つ関数の関数名は「:」で終わらなければならず、引数を2つ以上持つ場合は、「:」を連続させてはいけない*9というルールがある。そして(ここがもっとも変わっているところだが)、メッセージとしての記述の際、引数は、「:」の後に(必要なら前後にスペースを伴わせて)挿入/追記する。
以上に従い、たとえば、次のようなものが典型的なメッセージ式となる。
Point x: 3 y: 4 "Point がレシーバ、x: 3 y: 4 がメッセージ" "#x:y: が関数名、3 と 4 が引数"
なお、一般的な言語の書式では、これは Point.x:y:(3,4) というふうに書くことができる*10。他方で、二項式に相当するメッセージ式は「二項メッセージ式」と呼ばれ、関数名がアルファベットではなく記号のみより成り立つ点で異なるが、ほぼ同じ考え方に従って解釈する。
3 + 4 "3 がレシーバ、+ 4 がメッセージ" "#+ が関数名、4 が引数"
Smalltalk では、関数を「メソッド」、関数名を「セレクタ」*11と呼ぶ。なお、セレクタの実体はシンボル*12であることから、そのリテラル記述の際に使用する「#」を冠して、#x:y:、#+ などと表現するのが一般的である。*13
関数、つまりメソッドは単独での存在を許されず、必ず何かしらのクラスに明示的に内包される。また、メッセージ式(つまり、インスタンスへのメッセージ送信)を介さずに関数を直接“名指し”で起動することはできない*14。Smalltalk 言語には組み込みの関数というものはなく*15、そのすべてが、システムに付随するクラスライブラリを介して提供されている。これに動的型システムである(変数に型がない)ことを言い添えれば、以上が、言語仕様のほぼすべて。LISP に次いで単純な仕様の言語と言える。
ただこれだけでは Smalltalk 言語の何も理解したことにならないので、実際に使用するにあたっては、本来の言語仕様的な部分を定める(ディストリビューションに共通して含まれる)基本的なクラスに対する理解はもちろん、GUI や各種ツール群について最低限の知識もまた、別に必要になる。
Squeak システムに標準で装備されたビジュアルスクリプト言語とその環境。Smalltalk 言語で組まれているが、Smalltalk 言語とはまったく別の仕様を持つ*16。言語としての大きな違いは、コードがメッセージ式で構成されないこと、静的型システムである(変数に型がある)こと、インスタンスベース*17である(インスタンスがメソッドを持てる)こと、など。
ユーザーは、「モーフ」という可視化したオブジェクト(簡単には、ドロー系描画ツールの基本図形のようなもの)に対し、スクリプトを記述する*18。スクリプティングは、各モーフに対応する「ビューワ」と呼ばれるある種のコントロールパネルから、「フレーズ」と呼ばれるタイル状の機能を意味する矩形を取り出し、それらをドラッグ&ドロップ操作で組み合わせることで行なう。キー入力は原則として必要でない。
[とりあえずページを作っただけなので、これから書きます・・・詳しい方、書いてください(笑)--機械]
[では、とおりいっぺんに。w --sumim]
[説明感謝です・・・私じゃここまで書けない --機械]
[恐縮です。このくらいならおやすい御用です。他に、書いておいたほうがよい情報、知りたいことがありましたらお気軽に。最近は Python もかじっておりますので、ちょっとした比較や対比なども可能です。--sumim]
[項目増やしてみました。特にSmalltalk言語(オブジェクト指向プログラミング言語)については私もまだまだ勉強中なので、C++系言語(含むPython etc)との比較について何か書いていただければ幸いです。--機械]
[どこからはじめたらいいか分からなかったので、とりあえず、言語仕様の初歩の初歩だけ書いてみました。さて、ここからどうやって C++ などとの比較に繋げましょうか…。w --sumim]
[C++言語 とSmalltalk言語の大きな違いは、やはりブロックだと思うんですが、そこまでつなげるのって大変ですよねぇ・・--機械]
[考えたのですが、言語の違いよりは、2つのオブジェクト指向の着眼点の違いを整理したほうがよいと思います。端的には、メッセージでどう表現するか、か、データ型でどう表現するか、です。どちらに軸足を置くかはユーザー次第。たまたま、Smalltalk 言語は前者に C++ は後者に重きを置くと幸せになれるように作られている…と。 Python は両者にバランスがとれているから好かれるんでしょうかね(逆に、私のように極度に前者寄りのスタンスだと物足りないw)。--sumim]
[まぁ、C++は実際はどうとでも書けると思うのですが、メッセージで全てを表現するようにC++で書くと、非常に面倒臭いというだけで・・・(そこらへんを改善したのがPython、という感じです)。SmalltalkはGUIのようなオブジェクトでイメージしやすいものをイジるには気持ちがいいんですが、フツーの計算とかは、やや特殊な思考をするように訓練しないと、つらいですからね。私はC++の一番の不幸は、そもそも汎用言語として設計されているとは思えないにも係らず、あまりにも使われすぎているということにあると思います。適材適所でそれぞれが使えるように、どこに使うべきなのかがイメージできるような、各言語のオブジェクトへのアプローチの違いの説明があると嬉しいです(いや、私も実はあんまりわかってないんですが・・・)--機械]