アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72で遊んでみるシリーズです(なお最新のSmalltalkについては Pharo などでお楽しみください!)。他の記事はこちらから→Smalltalk-72で学ぶOOPの原点 Advent Calendar 2019 - Qiita
オブジェクト指向とは
“オブジェクト指向”というのは大きく分けて「カプセル化・継承・ポリモーフィズム(多態性)」の三要素と、「オブジェクトにメッセージを送る(メッセージを介して協働させる)」に象徴される2つで構成されるプログラミングのスタイルや考え方(後には設計や分析をはじめとするプログラミング以外の分野でも応用されるようになった──)です。成立の経緯としては、まず「オブジェクトにメッセージを送る」の方のアイデアが先に提唱され、後に「カプセル化・継承・ポリモーフィズム」の考え方がそれを置き換えるかたちで主流になり、現在は解説する人の都合にあわせて両者から背反しないエッセンスを抽出・混在させて(設計・分析まで広げてその要素を含めるなどして、多くは独自の勝手解釈をまじえながら…)語られるのが一般的になっています。
もう少し詳しい経緯は次のリンク先で解説していますので、興味があれば、特に末尾に列挙した参考文献などにあたってみてください。
-「オブジェクト指向とは何ですか?」に対するsumimの回答
オブジェクト指向とSmalltalk
当初の「オブジェクトにメッセージを送る」、つまり、コンピューターの中で動かすプログラムをデータや手続き(関数)などの“部分”に分解して考えるのではなく、コンピューターの中で小さなコンピューターが高速なネットワークに接続され、互いにメッセージを送り合う(まるでインターネットのように!)ことで計算をする…という新しい考え方でプログラミングを捉えるとどうなるだろうか?というのを実践してみせたのがSmalltalkという言語処理系です。
最初のSmalltalk-72はタートルグラフィックス機能を備えたスクリプティング言語のようなものでしたが、すぐにウインドウやポップアップメニューなどGUI(グラフィカルユーザーインターフェース)などを備え、OSのような役割を担うIDE(統合化開発環境) Smalltalk-74 に進化しました。
なおその後Smalltalkは、二世代目のSmalltalk-76を経て、最新の Pharo などの今知られているSmalltalkまで続く三世代目のSmalltalk-80へと進化します。実用面を重視した高速化などでモダンなGUIの構築が可能になり、これを見たスティーブ・ジョブズがApple社のLisaやMacに同様のGUIを採用したことは有名です。
ただし反面、速度を重視したSmalltalk-76以降では、単なる動的な関数コールを“メッセージ”とみなす「省コスト版」のメッセージング機構を採用したため、この実装方法や解釈こそがオブジェクト指向(特にメッセージングのOOP)の本来であるかのような誤解をはびこらせる原因にもなってしまいました。
「メッセージを送る」という考え方だけでプログラムは組めるのか?
さて、メッセージングによるプログラミングというのはどんなものなのでしょうか?
たとえば、タートルグラフィックのタートル(紙の上を自動的に動くペンのようなもの)に、「(ペン先を)上げろ」「(ペン先を)下げろ」「(インクを)黒にしろ」「100ドット前へ進め」「右に90度向きを変えろ」といった命令するのを、タートルを小さなコンピューターだとみなしてそれに「penup」「pendn」「black」「go 100」「turn 90」といった“メッセージ”を送ることで期待する動作をさせると解釈することはそれほど難しいことではないと思います。
問題は、3 + 4 といったよくある計算や arr[3] ← 4.56 といった代入についてばどうか?ということです。アラン・ケイは、これらについても、「3」という数値オブジェクトに対して「+ 4」というメッセージを送る、「arr」に代入された配列オブジェクトに「[3] ← 4.56」というメッセージを送ると解釈し、そのように実装もできることを発見、メッセージングの考え方で多くのことが表現可能であることに気がつきました。そこで、ダン・インガルスに依頼して作ってもらったのがSmalltalk-72というわけです。
「オブジェクトにメッセージを送る」世界にようこそ!
オブジェクト指向の勉強をしていると必ず出てくる「オブジェクトにメッセージを送る」という考え方は、今ある多くのオブジェクト指向言語(省コスト版メッセージング機構を採用して以降の現在のSmalltalkを含め──)をただ使ってみただけではなかなかピンと来にくいものになってしまっています。また一方で、Smalltalk-72にインスパイアされて考案されたアクター理論や、Erlang/Elixir といったそれに似た考え方を主要な言語機能に取り込んだ処理系が注目を集めたり、仮想化技術としてのコンテナや、Webの世界におけるマイクロサービス化など「オブジェクトにメッセージを送る」という考え方を思い起こさせる技術が多く一般的になりつつある今、改めてSmalltalk-72に触れて温故知新な体験をしてみるのも一興かと思います。