Smalltalk勉強会で夢を語ってみた

シンコム・システムズ・ジャパンさんのオフィスで行われた今年最後のSmalltalk勉強会で積年の夢を語ってきた。今回の勉強会は控えめに言っても言語の内臓丸出しの変態トークばかりだったので、「こんなの作りたいです」ってだけの私のLT?はかなり浮いてた気がするけど、そんなことは(゚ε゚)キニシナイ!!

で、その夢なんだけど、要するに「Smalltalkっぽい日本語プログラミング言語を作りたい」って話。だけど、せっかくの夢なのでここではさらに風呂敷を広げて「世界中の人が使える多言語化可能なプログラミング言語+ツールを作りたい」って話にしたい。

・・・

もし全ての人がプログラミングできればきっと世界がかわる。普通に生活してるだけでもプログラマが、役所で、レジで、窓口で、「YOU!自動化しちゃいなYO!」って思うことがどれだけ多いか。

日本人は識字率が高くて算数も得意なんだから、うまくすれば識プログラム率だって世界有数になれると信じてる。ただ、最大のネックはプログラミング言語が基本的に英単語で構成されてること。

もちろん日本語プログラミング言語だっていくつもあるけど、例えば「ドリトル」や「なでしこ」を全員が使えるようになれば満足かというと、正直日本でしか通用しないプログラミング言語を強制的に覚えさせるのは微妙。そりゃプログラミングを全く知らないよりはいいけどさ・・・。

そうじゃなくて、自分が本当に欲しいのは「世界に通用する日本語プログラミング言語」。

そんな明らかに形容矛盾してる言語は実現不可能だと言われそうだけど、Smalltalkっぽいやり方?なら実現できるんじゃないか、というのが今回の提案。

・・・

Smalltalkについて個人的に一番すばらしいと思っているのは「全てがメッセージ送信で定義されている」ところ。Smalltalkではクラスやメソッドの定義、算術演算から制御構文まで全てがメッセージ送信になってる。

それで考えたんだけど、文法にメッセージ送信しかないなら、例えば「日本語っぽいメッセージ送信の記法」(とリテラルの記法をいくつか)を定義してパーサーを用意しさえすれば、実際のオブジェクトシステムはSmalltalkのをそのまま使うだけで本格日本語プログラミング言語として動作するんじゃないか。

「日本語っぽいメッセージ送信の記法」というのは例えばこんな感じ。

単項メッセージ

レシーバー メッセージ

例

『文字列』の文字数。

結果:3
レシーバー:文字列
メッセージ:の文字数

キーワードメッセージ

レシーバー 助詞、 引数 助詞、 引数 メッセージ

助詞と引数の組の数は任意。0のときは単項メッセージに一致する。

例
『あいうえお』の、2 番目に、『ホゲ』 を挿入する。

結果:あホゲいうえお
レシーバー:あいうえお
メッセージ:の、番目に、を挿入する
引数1:2
引数2:ホゲ

制御構造

Smalltalkは制御構造もメッセージ送信なので、メッセージをどう定義するかだけど、例えば選択はこんな感じにできる。
選択
「『あいうえお』の文字数 が、5 に等しい。」 が本当なら、「『5文字ですね』。」を実行する。

結果:5文字ですね
レシーバー(ブロック):「『あいうえお』の文字数 が、10 に等しい。」
メッセージ:が本当なら、を実行する
引数(ブロック):「『10文字ですね』。」

プログラム例

ソース無くしちゃったけど、Rubyで仮に作ってみたところ以下のプログラムが動作してたので、実現は可能なはず。
<<もの>> の一種として、 <じゃんけん> を作る。

<<じゃんけん>> にメソッド、『ほいっ、(あなたの手) は?』 を定義し、「対応表 は {0→『グー 』・1→『チョキ 』・2→『パー 』}。あなたの手 を数値に変換する。あなたの手 は それ。私の手 は [0・1・2] のいずれか。勝敗 は あなたの手 と、私の手 の差。対応表 の、あなたの手 の値。対応表 の、私の手 の値。対戦結果 は あれ に、それ を繋ぐ。「勝敗 が、 0 と等しい。」なら、「対戦結果 に、『:引き分け』を繋ぐ。」そうじゃないとき、「「勝敗 が、 1 と等しい または、(勝敗 が、 -2 と等しい) が成り立つ。」なら、「対戦結果 に、『:あなたの負け』を繋ぐ。」そうじゃないとき、「「勝敗 が、 -1 と等しい または、(勝敗 が、 2 と等しい) が成り立つ。」なら、「対戦結果 に、『:あなたの勝ち』を繋ぐ。」を実行する。」を実行する。」を実行する。」を処理する。

<<じゃんけん>> にメソッド、『を開始する』 を定義し、「あなたの手 は 『』。「[『0』・『1』・『2』] に、あなたの手 が含まれる?。」まで、「『0:グー、1:チョキ、2:パー』を表示する。あなたの手 を <<キーボード>> から読み込む。あなたの手 の改行を除く!。」を繰り返す。私 ほいっ、あなたの手 は?。」を処理する。

じゃんけん は <<じゃんけん>> の実体。じゃんけん を開始する。結果 を表示する。

実行結果

0:グー、1:チョキ、2:パー
0
グー チョキ:あなたの勝ち

まぁこのプログラムを読みやすいかどうかについてはいろんな意見があると思うけど、少なくとも日本語だし、もっとセンスのあるメッセージにすればきっと読みやすくなると信じてる。

ということで、とりあえずの野望はSmalltalk環境内*1で動作する上記のような日本語プログラミング言語を作ってみたいということ。

・・・

で、ここから電波。

いくつかのリテラルとメッセージ送信の表記だけを定義して日本語プログラミング言語が定義できるなら、同様なやり方で中国語でもアラビア語でも、どんな(自然)言語のプログラミング言語でも作れるはず。多言語化だけじゃなくて例えば子供用に漢字を使わない簡単な言い回しだけを使ったプログラミング言語とかだって可能。

その上、それらは同じ言語の見え方を変えただけだから、対照表さえあれば相互に翻訳もできる。先に日本独自の言語を広めるのは微妙と書いたけど、これは実質Smalltalkを覚えていることになるので個人的にはOK。

なので本当に実現したいところは、そういうふうに見た目をいろいろに変えた言語を定義するためのシステム。で、それを使って世界中の人が自分の母国語でプログラミングするようになるといいな・・・

 ̄ ̄ ̄ ̄ ̄ ̄ ̄○ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
           O 。
                 , ─ヽ
________    /,/\ヾ\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|__|__|__|_   __((´∀`\ )< というお話だったとサ
|_|__|__|__ /ノへゝ/'''  )ヽ  \_________
||__|        | | \´-`) / 丿/
|_|_| 从.从从  | \__ ̄ ̄⊂|丿/
|__|| 从人人从. | /\__/::::::|||
|_|_|///ヽヾ\  /   ::::::::::::ゝ/||
────────(~〜ヽ::::::::::::|/        =完 =


*1:梅澤さんのSmalltalk勉強会での発表を見る限り文法をいじるのはSmalltalk環境の抵抗が大きそうなので、まずはGNU Smalltalkの改造からやってみるのがいいのかなと考え中