vieweditattachhistoryswikistopchangessearchhelp

Smalltalk 言語の特徴や考え方

このページの最後へ


どうもです、sumimさん。
http://d.hatena.ne.jp/hoshimin/20050831#1125495708 のコメント覧の続きということで。

RubyからSmalltalkの把握とsumimさんは書いてらっしゃいましたが、それは僕の場合ちょっとあやしいなと思っています。
僕が一番長く使っている言語はC/C++で、特にC++です。そのC++的な考え方が染みついています。クラスを静的な設計図以上のものとして、ごくごく最近まで考えられませんでした(ほんの1〜2週間ほど前まで……)。たとえば、RubyのFile.newなんかは「クラスFileのクラスオブジェクトにnewというメッセージを送っている」という風に考えるのが正しいのだと思いますが、C++まんまにクラスFileの静的メンバー変数(C++風にいうと)を呼んでいるといった解釈でした。こんな解釈だと、色々と他のことを考えるときに不都合が出ると思うんですが、全然気にしなかったというか……。クラスが単なる設計図ではないからこそ、後からクラスメソッドの内容を変更して、インスタンスメソッドを追加したり、メソッドの名前をaliasで変えてしまうなんていうことが無理なくできるのだなと、先頃ようやく合点がいったわけですが、Rubyを触り始めて3年以上たっているのですよね……。言語が持っている便利な機能をただ使っていただけだったわけです。これはC++にも言えて、基本的にはBetter Cから出ていません。そういう使い方でもこれまで自分の仕事の上で困らなかったわけですが、やっぱりそれだけではもったいないですし、技術者として情けないよなと、まあそんな風に思っています。
あと、Smalltalkのコードの例を眺めていて(文法もしっかり把握せずに読んでますから、読んでもあまり理解できないんですが、習うより慣れろでぼおっと眺めていました)、"Object subclass: #Hoge"などと書かかれているのを見ました。サブクラス(のクラスオブジェクト)の生成もメッセージなのかと驚きました。

ただ、sumimさんのはてなダイアリーの記事"http://d.hatena.ne.jp/sumim/20050830"にあった、

「Ruby 同様?」と思われた方もおられるかもしれませんね。たしかに Ruby 、あたかも配列への代入の構文があるかのように見せています。が、じつはこれ、Smalltalk が at: 1 put: 10 というメッセージを送って #at:put: というメソッドを起動しているのとそっくりな方法で、#[]= というちょっと変わった名前のメソッドを起動しているのです。

を読んで、Rubyもクラス定義の書き方は、
class Hoge < Object
end

とやりますが、これは文法的にこう書くだけで、実際にやってることはSmalltalkと似たようなものなのかな?なんて考えたりもしています。違うのかもしれませんが。 --hoshimin- 2005-09-02, 21:37:50

hoshimin さん、わざわざどうも。

このページは Wiki ですので、入力フォームを使った入力の他に、上の edit ボタンや下の「このページを編集」リンクでモードを切り換えることで、ページ中の任意の場所の書き換えも可能です。もし必要なことがありましたら、この機能もご利用ください。ただ現在、スパム対策でログインが必要です。squeak/smalltalk(ユーザー名/パスワードの順)をお使いください。

あと、たいていの文字は使えるのですが、HTML を挿入できる都合、< と >、この Wiki 独自の * については、期待しない結果になる可能性がありますので、全角の相当文字(<、>、*)を代わりに使うか、&lt;、&gt;、&star; と入力してお使いください。このほかの細かな注意や書式に興味があれば、ページ上の help ボタンをクリックして呼び出されるページをご覧ください。--sumim
- 2005-09-03, 18:13:33

>僕が一番長く使っている言語はC/C++で、特にC++
分かりました。では、C++ と Smalltalk の考え方や特徴の違いにフォーカスすれば、だいじょうぶでしょうか。

>サブクラス(のクラスオブジェクト)の生成もメッセージ
よいところに目をつけられたと思います。Smalltalk は(少なくとも古典的には)メッセージングというものに軸足を置いて考え出され、作られており、そこでのプログラミング(ひいては設計や分析)もそれを念頭に置くことで“シアワセ”になれるよう工夫されています。もちろん処理系としての実装上はそれほど特殊なことをしているわけではないので、他の言語同様、メッセージングを無視あるいは軽視したプログラミングも不可能ではありません。が、あえてそうするメリットはきっとないだろうなぁ…と思います(何ごともメッセージングに置き換えようとする Smalltalk での考え方に辟易とさせられる向きは、他の言語を使えばいいってだけの話ですからね)。

あと、Smalltalk システムそれ自体が、この「メッセージング」という考え方の実践や、その有効性を自ら示した場であることは、他の言語には見られない特徴のひとつと言えそうです。

ただ、80 年代以降は C++ の影響も強く受けるようになりましたので、静的型チェック機構こそ欠いているものの、クラス、つまりデータ型大事という考え方も重んじられています。したがって、メッセージングという考え方(と、それに伴う、何ごとも動的であれ!という姿勢)は相変わらず重要ではありつつも、動的にクラスを作ったりすることは、容易だけれども普段はやらない…という範疇のことであるように個人的には感じられます。(余談ですが、こういう「できるけどやらない」たぐいの不文律や紳士協定のようなものが Smalltalk にはけっこうあります)

>Rubyのクラス定義
Ruby のソース(class.c)をざっと読んだかんじでは、残念(?)ながら、クラスオブジェクトの作成までは Smalltalk の方法(スーパークラスへのメッセージングにより作成…)は踏襲していないようです。きっと、そこまでする必要やメリットはないと判断されたのでしょう。Ruby のそういった「メッセージングというセマンティックスは大事にするけれど、それのみに必要以上にはこだわらない」…という姿勢は、if-then-else 構文の存在などにも現われています。--sumim
- 2005-09-03, 18:35:27

さて、どういたしましょうか。お手元で Smalltalk コードを実行してみたりしながらお話を進めたほうがよいですよね。今は Squeak のどんなバージョン(あるいは、どこから入手したものか、でもよいです)をインストール済みでいらっしゃいますか?--sumim - 2005-09-03, 18:36:42

前の投稿、少し修正してくださったのですね。一応、「squeak/smalltalk(ユーザー名/パスワードの順)」は見ていて、最初あまりに変な投稿をしてしまったので修正をしましたが、今の方が見やすいです。--hoshimin - 2005-09-06, 20:01:55


>C++ と Smalltalk の考え方や特徴の違いにフォーカス
はい、よろしくお願いします。

>80 年代以降は C++ の影響も強く受けるようになりましたので
C++はなんのかんのと他に影響を与えていると。

>こういう「できるけどやらない」たぐいの不文律や紳士協定のようなものが Smalltalk にはけっこうあります
こういうのって、結構、一人だと身につけにくいたぐいのものですね。

>if-then-else 構文
Smalltalkにif-then-elseが無いというのを、どこかで見まして、かなり驚きました。その手の制御もメッセージなのかと。なんか、すごいなと。--hoshimin - 2005-09-06, 21:24:48


>Squeakのヴァージョン
http://squeakland.jp/developer/
から落としてきた
を利用しています。

これを弄っていて思ったのですが、
日本語 Squeak :開発版イメージの作り方 (Nihongo6.1、Nihongo6)
にある、systemLanguage、primaryLanguageは今は無くなったのでしょうか?
上のページはNihongo6.1用の古い情報だともありましたし、Nihongo7の開発版は最初からデスクトップメニューも出ていて、あとはフラップを出すなどすればいいのかなとも思いましたから、今はきにしないでおこうかなとは思ったのですが、せっかくなので質問させていただこうかと思います。
開発版Nihongo7起動時に多言語化機能のことが書かれていますから、その手の機能が取り込まれた結果無くなったといったところなのでしょうか?--hoshimin - 2005-09-06, 21:52:33

systemLanguage、primaryLanguage は Nihongo7 にはなくなりました(ご推察どおり、多言語機構の本家公式版への取り込みにともなって、Nihongo6 と Nihongo7 とでは仕様が一部変更になったようです)。メニューやメッセージなどは英語のほうがいいですか? もし、そういうことでしたら、デスクトップメニュー → ヘルプ… → 言語を設定… → English をしてから(これで英語になりますが、このままだと日本語の入力ができないので)、どこか文字の入力できる場所で、

Locale currentPlatform: (Locale isoLanguage: 'ja')

を入力(あるいはここからコピー&ペースト)後、選択して do it (alt+d) すると、くだんのページでやろうとしているのと同じ設定(表示は英語で、入力文字などには日本語を使える)にできます。

フラップについては、デスクトップメニュー → フラップ… → すべての共有フラップを削除 で、いったんすでに設置済みのフラップを撤去した後に、同じ フラップ… から デフォルトの共有フラップを使う を選ぶと、公式版に近いフラップ構成にできます。あとは、同じく フラップ… から ナビゲータ を選択してチェックを入れれば([□] → [■])完成です。

Uploaded Image: worlde.png
英語化してある場合

Uploaded Image: world.png
日本語のままのとき

各種設定後には、仮想イメージの保存(デスクトップメニュー → 保存)もお忘れなく。--sumim
- 2005-09-06, 23:13:38


このページを編集 (8774 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 3980 times.