これで分かるオブジェクト指向入門 基本編 #1-最初のオブジェクト指向

これで分かるオブジェクト指向入門 基本編 #1-最初のオブジェクト指向
By Michael Hicks from Saint Paul, MN, USA (img_7817) [CC BY 2.0 (https://creativecommons.org/licenses/by/2.0)], via Wikimedia Commons

はじめに

この連載では,オブジェクト指向を学んだ視点から見て,オブジェクト指向を実際に扱えるようになることを目指して解説していきます.
基本編では,実際にオブジェクト指向プログラミングを行うために,必要な概念を大まかに解説していきます.

また,本連載では,オブジェクト指向についてはさっぱり分からないけれど,CやArduino, Pythonなどのプログラミング言語なら一つでも触ったことがあるような人を想定しています.

オブジェクト指向の学習に関して,私や私の周りでは,CからC++へステップアップする際に苦労することが多かったです.このときに分からない原因となった説明として,「Cの構造体に関数を入れられるようにしたものがクラスであり,クラスが使えるものがオブジェクト指向である」というようなものが多かったですが,これはオブジェクト指向の本質ではありません.これはあくまでもC++における実装方法であるように思います.

概要

基本編 #1では,「オブジェクト指向(object-oriented)」という言葉が初めて採用された言語について知ることで,基本的な概念を学んでいきます.

用意するものは,まだ何もありません.

最初のオブジェクト指向

最初に「オブジェクト指向」という言葉が採用されたのは,Smalltalk(Smalltalk)という言語でした.初めてオブジェクト指向的な機能を持った言語は,Simulaだと言われています.SmalltalkもC++もこれに影響を受けたようですが,このときはまだ「オブジェクト指向」という言葉はありませんでした.
Smalltalkは,米Xeroxのパロアルト研究所(PARC)で1970年代に開発されました.

パロアルト研究所は,他にもイーサネット(Ethernet)やレーザープリンタなどが開発された場所として有名です.

Smalltalkは,「パーソナルコンピュータの父」ことアラン・ケイ(Alan Kay)が中心になって開発された言語,というより環境です.当時,アラン・ケイはダイナブック(Dynabook, 東芝のものはこれが元)と呼ばれる理想のコンピュータを提唱していて,この前段階として,Alto(Xerox Alto)と呼ばれる初めてGUI(Graphical user interface)とマウスが搭載されたハードウェアを開発しました(この記事のトップの画像がそれです).SmalltalkはこのAltoに搭載されたシステムなのです.

Smalltalk-76
By SUMIM.ST [CC BY-SA (https://creativecommons.org/licenses/by-sa/4.0/deed.en), via Wikimedia Commons Smalltalk-76の画面

ちなみに,AppleのジョブズとMicrosoftのゲイツは,パロアルト研究所でこのAltoを見学したあとに,それぞれMacintoshの前身であるLisa(Apple Lisa)とWindowsを生み出していて,少なからずこれらに影響を与えたと言われています.

Smalltalkにおけるオブジェクト指向

Smalltalkにおいて,アラン・ケイが定義したオブジェクト指向は,「すべてがオブジェクトによって構成されていて,オブジェクト同士がメッセージング(Messaging, Message passing)を行うもの」といった内容でした.実は,この記事の内容はこれが全てです.
これは,C++やPythonなどの言語と比べると,本当に純粋なオブジェクト指向であることを示しています.

“1 + 2” に見るオブジェクト指向

はじめに, “1 + 2” という処理を例に取ります.

まず,C++やPythonにおける “1 + 2” は以下のようなイメージになります.

1+2_in_procedure
C/ C++やPythonなどにおける”1 + 2″のイメージ

この場合,ソースコード上では “1 + 2” と記述されていても,実際には手続き(Procedure, Subroutine)と引数(Argument)を用いることが想像できます.例えば “add” という手続きに対して,”1″ と “2” という2つの引数を渡すことで,3を得ることができます.きっとこのような仕組みには慣れていることと思います.

次に,Smalltalkにおける “1 + 2” は以下のようなイメージになります.

1+2_in_smalltalk
Smalltalkにおける”1 + 2″のイメージ

この場合,ソースコード上では “1 + 2” と記述されていますが,実際には,値を表すオブジェクトである “1” に対して “+ 2” というメッセージを送信します.これをメッセージングと呼び,Smalltalkでは “+” をセレクタ, “2” を引数と呼びます.
少し分かりづらいかもしれませんが, “1” というオブジェクトは,それ自体が “+ 2” に対する振る舞いを知っていて,メッセージを受けると自分自身に対して引数に応じた “+” の処理を行います

制御構文(if)に見るオブジェクト指向

次に,代表的な制御構文(Control flow)である “if” の処理を例に取ります.
今回は,booleanのisDogに対して,Trueであれば”Bowbow!”, Falseであれば”Meow!”をcryに代入(Assignment)し,それを表示する処理を行います.

まず,Python3で記述したソースコードを以下に示します.


# -*- coding: utf-8-unix -*-
# Version: CPython 3

isDog = True

if isDog:
cry = 'Bowwow!'
else:
cry = 'Meow!'

print( cry, '\r' )

C/C++やPythonを触ったことのある人なら,とても馴染みのある形だと思います.コンピュータがisDogの値をテストして,もしtrueなら’Bowwow!’を,falseなら’Meow!’をcryに代入していることが分かります.

次に,Smalltalkで記述したソースコードを以下に示します.


Transcript open.
Transcript clear.

isDog := true.

cry := isDog ifTrue: [ 'Bowwow!' ] ifFalse: [ 'Meow!' ].

Transcript show: cry; cr.

Transcriptというのは,ソースコードの実行結果を表示するものです.stdout(Standard output)のようなものであると考えてください.

isDogという変数にtrueを代入した後,isDogがtrueなら’Bowwow!’を,falseなら’Meow!’をcryに代入しています.ここでは, “isDog” というオブジェクトに対して, “ifTrue: [ ‘Bowwow!’ ] ifFalse: [ ‘Meow!’ ]” というメッセージを送信しています.セレクタは “ifTrue” と “ifFalse” で,引数は “[ ‘Bowwow!’ ]” と “[ ‘Meow!’ ]” です.なお,これらの[]で囲まれた部分はブロックと呼ばれる処理のかたまりです.

すなわち,オブジェクト “isDog” に対して,「もしあなたがtrueならこの処理を実行して,もしfalseならこの処理を実行してね」というメッセージを送信していることになります.

なお,今回の動作確認にはPharo(Pharo)を使用しました.Pharoはオープンソースで開発されているモダンなSmalltalk実装です.この連載はSmalltalkの入門講座ではないためこれ以上深い解説はありませんが,興味を持たれた方はPharo公式サイトから入手してみてください.

pharo-screenshot
Pharoで上のソースコードを実行する様子

まとめ

ここまで来れば,Smalltalkが純粋オブジェクト指向言語と呼ばれる理由が大体わかってきたのではないでしょうか.C/C++やPythonとは違い,演算や制御構文までもがオブジェクトとメッセージングによって成り立っていて,「すべてがオブジェクトによって構成されていて,オブジェクト同士がメッセージングを行うもの」という定義を満たしています.

C++やPythonにおけるオブジェクト指向はこれとは少し違うものですが,このような考え方を知っていることで,とても理解がしやすくなります.次回は,これらの言語に採用されている最近のオブジェクト指向を取り上げていきたいと思います.