オブジェクト指向なコードをどのように記述するか。
プログラミング言語を作ってみた人なら、一度は考えるテーマだと思います(ほんとか)。
わたしは、へっぽこプログラミングのかたわら、日本語プログラミング言語のバリエーションとして「そら豆スクリプト」を作ってしまいました。
なので、オブジェクト指向を日本語プログラム言語でどのように記述するとわかりやすいか、考えてみました。
そら豆スクリプトを作るための副産物で、
だれかの参考になるかどうか分かりませんが、公開しておきます。
多くのプログラミング言語では、プログラムを英数字と記号でコードを書きますよね。
たとえば、わたしがさいしょに覚えたベーシックというプログラミング言語BASIC - Wikipediaだと
PRINT "コンニチハ"
なんてぐあいに書きました。
くりかえし命令の場合は、
FOR i = 0 TO 9 PRINT "コンニチハ" NEXT i
なんて感じになりました。
このコードを実行すると、画面に「コンニチハ」を10個表示しました。
このようにプログラムを作るとき、あなたは、頭の中でコードを読んでいませんか。
たとえば、最初のコードは
「コンニチハ と表示する」
2番目のコードは
「変数iを0から9まで、くりかえし コンニチハ と表示する 次にすすむ」
というような具合です。
当時も今も、まともに英語ができるわけではありませんから、
そのまま英語読みするのではなく、
コードは、記号のならびとして書きあらわして、
頭のなかで、日本語っぽく変換して読み上げていたのです。
変換するのがメンドーになると、 コードのとなりに、コメント文で日本語っぽく書くなんて 習慣もありました。
FOR i = 0 TO 9 '変数iを0から9まで、くりかえし PRINT "コンニチハ" 'コンニチハ と表示する NEXT i '次にすすむ
ただし、コレ、プログラミングの達人のあいだでは、 コメントの悪い書き方の例として、知られています。
でも、どうせなら、このコメント文のままで、プログラムできたらいいのに
というのが、たぶん日本語プログラミング言語のスタートなのです(うそうそ)。
いまや、本格的なプログラミング言語のほとんどは、 オブジェクト指向をサポートしています。
オブジェクト指向プログラミング言語のサンプルとして、 Processing.jsをとりあげましょう。
たとえば、どこかでボールをあらわすオブジェクトが定義しておいて、 それを、ballというオブジェクトが割り当てた場合です。
ballオブジェクトの操作は、次のようになります。
ball.move(); ball.draw();
これは、あたまのなかで
ボールを動かす ボールを描く
と読む感じでしょうか。
それから、ballの現在位置を知るには
text(ball.x, 0, 0); text(ball.y, 0, 10);
という感じになります。
「ball.x」と「ball.y」が、それぞれ
ボールのx座標 ボールのy座標
という感じです。
オブジェクト指向を採用すると、プログラムの中で、 動作とデータのセットであつかえるようになり、とても便利です。
できあがったプログラムも、すっきりと書けるようになります。
この場合は、ボールという対象物について、 動き(moveとdraw)とデータ(x座標とy座標)を まとめてあつかえるようになります。
では、このようにあたまの中で読み上げたコトバを 日本語プログラミング言語に採用したら うまくいくのでしょうか。
そら豆スクリプトは、日本語っぽいコードをProcessing.jsに変換して動作します。
そら豆スクリプトの最初のプランでは、 さきほど紹介したアタマのなかのコトバのように、 プログラムを記述していました。
さきほどのボールを動かすコードは、次のように書きました。
@ボールを移動する @ボールを描く
「ball.move()」の「.」(ピリオド)を、 「を」という助詞に置き換えたような感じです。
さらに、引数をあたえる場合は、
ball.move(10)
にあわせて
@ボールを{距離:10}に移動する
と書きました。
対象物をあつかうので、「を」という助詞が、 ちょうど意味としてもピッタリになりました。
それから、@ボールの現在位置をあらわすには
@ボールの@位置x @ボールの@位置y
と書きました。
今度は「の」という助詞が、 「ball.x」の「.」(ピリオド)に対応しています。
この方式を、いろいろなプログラムや命令にあてはめていったところ、 いくつか問題があることがわかりました。
「***を」だけでは、ピッタリいかない場合があるのです。
たとえば、Processingで画像オブジェクトのコピー命令は、 次のように書きます。
img.copy(50, 0, 50, 100, 0, 0, 50, 100);
これは、imgという名前の画像オブジェクトに対しては、
「x=50, y=0, 幅=50, 高さ=100」の領域を 「x=0, y=0, 幅=50, 高さ=100」の領域に コピーするという命令です。
これを、アタマのなかで読み上げるとすると、
「imgに対して、"50, 0, 50, 100"を"0, 0, 50, 100"にコピーしろ」 という感じになります。
この場合は、対象物が複数あるため、「を」ひとつでは表現しきれないのです。
こういうときは、原点に戻って、考えてみるのが一番です。
そこで、オブジェクト指向について、すこし調べてみました。
で、インターネットでいろいろ検索してみると、オブジェクト指向について次のような説明がでてきます。
「コンピューティングに関わるすべてを“オブジェクト”と、 それに対する“メッセージ通信”で表現する」
つまり、「ボール」に対して、「移動しろ!」と伝えているのです。
わかりやすい例を持ち出すと、
スターウォーズのエピソード4で、
「ルークよ、フォースを使え」
と、オビワンの声が聞こえてくるみたいな(ぜんぜん、分かりやすくない)
[オビワン] -- フォースを使え ---> [ルーク]
この場合、「ルーク」が対象で、「フォースを使え」がメッセージです。
あるいは、超能力者ふうにいうと、
「スプーンよ、曲がれ!」
[超能力者] -- 曲がれ ---> [スプーン]
(もっと、分からない)
はたまた、魔法使いふうにいうと、
「魔人よ、いでよ!」
[魔法使い] -- いでよ ---> [魔人]
(なにが、なにやら)
こんな感じでアタマのなかで表現されるコトバを 日本語プログラミング言語としてあらわしてみると、 こんなふうになりました。
@ボール、{距離:10}に移動する
「、」(読点)が、「ball.move()」の「.」(ピリオド)に対応しています。
「@ボール」という対象物(オブジェクト)に、 呼びかけているような感じですね。
とはいえ、「ルークよ、フォースを使え」形式ではなく
ルーク、フォースを使う
という形式になっています。
これは、プログラムをアタマのなかで読むとき、
命令の羅列ではなく、対象の状態として読みあげるほうが 自然に感じたためです。
さきほど問題になった 「imgに対して、"50, 0, 50, 100"を"0, 0, 50, 100"にコピーしろ」 というコトバは
@img、{元x:50, 元y:0, 元幅:50, 元高さ:100}を{先x:0, 先y:0, 先幅:50, 先高さ:100}にコピーする
なんて書くことになりますね。
また、対象物(オブジェクト)の属性値(プロパティ)は、「@ボールの@位置x」というように 「の」のままになっています。
こういう方式なら、もう少しいろいろコードを日本語っぽく書けそうです。
というわけで、2012年の年末に、そら豆スクリプトの文法を修正してみました。
サンプルプログラムなども変更して、それなりに日本語っぽさが増したかなー、と思っていました。
ところが、ひとつ問題が出てきました。
オブジェクトに対するメソッドを1文として書く場合は、問題ないのです。
@ボール、移動する
でも、メソッドを計算式に組み込むと違和感があるのです。
ボールオブジェクトの振る舞いの結果、戻り値を返してきて、それを計算に使おうとすると
@ボール管理、移動する + 1
こんなふうに、「@ボール管理」と「移動する + 1」というかたまりのように見えるのです。 この場合、"移動する"はメソッドです。
なぜ、こんなふうに見えるかというと、日本語では「、」より「+」のほうが演算子の優先順位が高くみえるからだと思います。
解決案としては、
まず、かっこ(...)で囲むという方法。
(@ボール管理、移動する) + 1
これなら意図が、よくわかります。それに、文法は修正しなくてもいい。
もう一つは、メソッド呼び出しを計算式の中で使う場合のために、「.」(ピリオド)を使えるようにすること。
@ボール管理.移動する + 1
これも、英数字を使う場合の一般的なオブジェクト表記なので、まあ成立します。
でも、どちらも中途半端な感じがするんだよなー。
はてさて、どうしたものやら。
というわけで、日本語っぽいプログラミング言語で、オブジェクト指向をどのように記述すべきか、考えてみました。
そら豆スクリプトは、自然な日本語を目指してはいませんが、 アタマのなかで読み上げるコードを違和感なく表現できるようにしたいと思っています。
お役に立てば、幸いです。