Saturday 23 June 2007

Squeak, Smalltalk



プログラミング言語シリーズ。前にも何回か書いたことがある。

Smalltalk は、鈴木則久さんが東大に来たときに、Xerox Parc から持って来たのを使いました。最初にビデオを見せてもらうのだが「mouse で cut & paste でプログラムしていく」という感じ。

で、まぁ、プログラムして行くのだが、これが「まったくわかりません」状態だった。1台しかマシンがない(1100SIP)し、マルチユーザで使えないので、全然、いじれなかったし。それでも、Smalltalk でProlog書いた人とか、一種のテンプレート書いた人とかが、一緒にいじった中にはいました。結局、判った気になったのは、Squeak いじってからかな。

Xerox は、Smalltalkをかなりの高額のライセンスで売ったので、あまり広まらなかったんだよね。例の通り、金融関係ではかなり使われたらしい。その理由は、実行しながら、どんどんコードを変更できるから。コンパイルとか要らないし。

Smalltalk は、image file と言うのがあって、実行時の環境をそのままfileで持ってます。なので、コマンドとかの概念がない。

プログラムは、基本的に既存のオブジェクトを継承して、単調増加的に変更を加えて行くという形になります。なので、ソースを読んで、いろいろ調べないとプログラミング出来ない。逆に、必要な範囲を理解する時間は短いと思う。多重継承が入ると、単調増加的な変更が難しくなるので、C++ とか Perl とかは、入門には向かないと思う。

become というおそるべきオペレータがあって、今動いているオブジェクト(インスタンス)を、その場で入れ換えるということが可能。今動いているWWWサーバを、動いているまま version up するような感じ。

Smalltalk のXeroxの実装には、on the fly compile ってのがあって、それを、そのままパクったのが Java のJITというわけ。Smalltalk には型がなく、整数とかもオブジェクトだが、Java は、型を持っていて、整数はオブジェクトではないところが異なります。あと、Smalltalk にはInterface はないです。

Xerox のライセンスから逃れる努力はいろいろあったんだけど、今は、open source な Squeak があるので、そっちを使えば良い。ただし、インタプリタです。速度的にはそれで十分だと思う。

Smalltalk/Squeakを使ってない人に、オブジェクト指向言語を議論する資格はないと行って良いと思う。Java/C++ では、ダメだと思う。一つは、Java/C++ だと、手続的に書くことが可能だから。Smalltalk だと、自然にオブジェクト中心に書くようになります。

オブジェクト指向の反対側には、構造化システム開発というのがあります。これは、Pascal とかの構造化プログラミングとは、まったく関係ない。オブジェクト指向言語が、OOA/OODと、まったく関係ないのと同じぐらい関係ない。業務を、伝票のやりとりと解釈して、伝票を構造体で表して、そのやりとりでプログラムを書くと言う手法ですね。これをやると、面白いくらいデータベースの構造が伝票的になる。官僚型プログラミングと言っても良いぐらい。そこで、業務の変更が入ると、そこら中にある伝票的構造を一つ一つ修正して行くという作業になり、その単調作業の見積りを取るのは極めて簡単。つまり、簡単な修正で、多量のコードの修正を生じると言う、プログラマにとって金銭的においしいシステムとなってます。が、係わりたくはないね。

オブジェクト指向言語でも、構造化システム開発を行うことは可能で、コンテナクラスを多種多様に作り、それをやりとりするという感じになります。で、コンテナクラスには、method がほとんどないということになる。その結果、単調増加的なシステムの変更が出来なくなるというわけですね。そういう罠に陥らないという意味で、Smalltalk/Squeakから始めるというのは重要だと思う。

ただ、image file と環境全て持ち歩く方式なので、「一旦、その世界に入らないと何も出来ない」ってのは、ちょっとねぇ〜 まぁ、Unix だって、Windows だって、そうなわけなんだけどさ。

No comments: