日本語プログラミング言語の強み

るびまの 「Rubyist のための他言語探訪」は毎回とても愉しみにしているコンテンツです。今週は残念ながらまつもとさんが書かれていないのですが、その代わりに なでしこの作者クジラ飛行机さんが自ら自作を解説していて、これはこれで興味深かったです。

るびま

私が日本語プログラミングに注目するようになったのは、今は無き PC USER誌でひまわりのコードが紹介されていたのを見てになります。それまでは、手続き言語である限り日本語だろうが英語だろうが「キーワード」が違うだけで、よほどの英語アレルギーでない限りあまりメリットは無いと考えていました。(むしろ、潜在ユーザとコミュニティの小ささという大きなデメリットを抱えるほうが問題かと)

しかし、PC USER誌に掲載された 100行程度(だったかしら?)のコードを見たとき、ちょっと意識が変わりました。そこにあったのはちょっと句読点が多いだけの普通の日本語の文章で、ひまわりの知識どころか、プログラミングの知識が無くても、純粋な日本語として理解可能 だったんです。

ひまわりの素晴らしいところは、「日本語の語彙」「日本語風の構文」を備えているだけじゃなく、(コーダーの努力によっては)生成されたコードが完全な日本語の文章になってしまうところです。

これはちょうど、漢文にレ点や一二点、送り仮名をつけて日本語として読み下すテクニックに似ています。人間が読めば日本語に、コンピュータが読めばプログラムに。一つのコードを全く文法体系が違う二つの視点から読み下せるように巧みに設計してあるという意味で、ひまわりと漢文読み下しは本当によく似ています。

ひまわりトリック

ひまわりやなでしこが、人間にも解りやすくインタプリタにも理解できるコードを実現できるよう、幾つかのトリックがあります。

例として、ひまわりで Hello Worldするなら、

「こんにちは」と、言う

になりますが、これは "言" という関数に前置引数を渡す構造です。ちなみにひまわりでは以下のようなおなじみの記法もサポートしています。

言( "こんにちは" )

ひまわりの仕様でおそらくプログラマが一番驚くのは、解釈されない文字列をコメントではなく地の文として書き下ろせるということです。ひまわりに於いて、送り仮名はプログラムとして解釈されない「コメント」です。

「こんにちは」と、言う。
「さようなら」と、言いました。
「元気でね」と、言ったりして。
「貴方もね」と、言うことはあるまい。

これらは全て 「言」関数の呼出です。この自由な部分を上手く使うことで、人間には日本語に見えるように文章を繋げられます。

もう一つ面白いのが、特種変数「それ」です。関数の戻り値は必ず「それ」という名前に格納されます。

「あなたのお名前は」と、尋ねる。    //戻り値が「それ」に入る
もし それが、「みねこ」ならば、
    「こんにちは、みねこ」と、言う。

関数の引数を省略したときは、暗黙に「それ」があてがわれます。

今。            // 『それ』に現在時刻をセット
表示。          // 『それ』を表示。

ここまで省略するのに意味は全くないのですがw(素直に "今を、表示。" と書いた方が良い)。


ひまわりでの美しいコードとは、いかに自然な日本語に見えるように書くかだと思います。そうやってかかれたコードは、読むだけなら日本人なら誰でも意味がわかるようになります。「送り仮名の無視」や特種変数「それ」のように、ひまわりには「自然言語に見間違うコード」を実現するための心配りがたくさんあります。

しかし、いくら日本語のように読めるからと行って、ひまわりプログラムとして有効なコードを書くには、当然プログラミングの知識が必要です。このRead/Writeのユーザスキルの不均衡さを受け入れるかどうかが、ひまわりの評価の分かれ目かな?って思います。「読めるけどかけない」は良くある話ですが、それが「日本人ならほぼ誰でも読める」まで拡大しきっちゃった時の威力には、素晴らしい可能性があると思います。

非構造化、非オブジェクト指向プログラミング

もう一つのひまわりの作戦として、原始的でシンプルな手続き言語への回帰があります。

今でこそ、ひまわりにも関数が、なでしこにも限定的なオブジェクト指向機能である「グループ」が導入されていますが、作者のクジラ飛行机さんは構造化プログラミングやオブジェクト指向プログラミングの導入に消極的です。

構造化プログラミングもオブジェクト指向プログラミングも、貧弱な認識力しかない人間が大規模と闘うために欠かせない武器ですが、大規模との戦いを諦めちゃえばそれは必要なくなるし、そうなれば、単純にコードの上から下へ実行される原始的な手続きプログラミングが一番理解しやすいんじゃない?というポリシーで設計されているからです。

私はオブジェクト指向プログラミング(特にメッセージ指向)が小規模プログラミングであっても決して「わかりやすさ」の邪魔にはならないし、OOP自体「習得困難な奥義」では決してないと思っています。しかし、(プログラミングと関係なく)PC使う課程ではオブジェクトに触れられない今のコンピュータ世界では、「一見」できない為どうしても「百聞」しなくてはならず、結果OOというパラダイム自体が解りにくいモノになってしまっています。(…とあたしは思ってる)

で、「今、コンピュータを使っている人」をターゲットに「簡単な」プログラミング言語を設計した場合のひまわりの解は、好みではないし同意もできないけど、「なるほどな」と思うのです。