🎂

祝!教科書掲載『なでしこ』でもビジュアルプログラミング~

2020/11/28に公開

(※本記事は2020/9/23にQrunch(閉鎖)にて公開したものを加筆修正したものです)

おめでとう!『なでしこ』

日本語で書けちゃうプログラミング言語『なでしこ』来年度の中学校の教科書に掲載されることになったそうです。

凄い躍進です。

この『なでしこ』を知ったのは実のところ、ごくごく最近です。
今年4月に出版された『なでしこ』言語開発者クジラ飛行机氏の著書『プログラミング言語大全』での項目でした。
日本語っていうところで世界的にみてもマイナーですし、業界界隈で出会うことがなく、紹介がなければ知ることがない言語です。

そうやって知った日本語でのプログラミング言語ですが、教科書に掲載されるとなれば、聞いたり触れたりする機会も増えることでしょう。

それで、私のStateGoに導入すべく、日本語プログラミング言語『なでしこ』を勉強してみました。

『なでしこ』を勉強してみて…

勉強しての感想ですが、プログラムの読み書きを英語で四十年近くやってきた身にとって、自然な日本語で書かれるプログラミングは異世界言語そのものでした。

例えば、C系列の書き方で下記のように表される場合、

index = 10

『なでしこ』でも上記の書き方は許容していますが、あえて『なでしこ』の特徴である純日本語表現で、

インデックスに10を代入

または

インデックスは10

と表すことができます。

同じ操作を2つの表現で表すことができます。しかし、母国語で書くとなる日本語として正しさを求めてしまいます。そのため、この流れではどれが正しいんだと考えてしまい、頭がクラクラします。

そして、なでしこが目指す純日本風のこだわりを感じるのが関数です。
たとえば、C系列の書き方で以下の関数呼び出しがあるとします。

hoge(a,b)

『なでしこ』でも上記の表現は可能ですが、こだわりの純日本語表記ではこうなります。

aとbでほげする

ここで悩ましいのが定義によって助詞('と' 'で')が引数と紐づけられていることです。
上記の関数の定義は次のようになります。

●ほげする(aとbで) //定義
 「{a}と{b}でほげした」と言う //命令
    戻る //リターン

もし、助詞を次のように変更すると先の呼出しは成立しません。

●ほげする(aとbに) 
 「{a}と{b}にほげした」と言う 
    戻る 

もちろん、呼出しの間違いはエラーで警告されます。

母国語だからもっと易しく習得できるかと思いましたが、長年培われたプログラム脳と日本語脳が反発しあって大変でした。

StateGoに『なでしこ』を

StateGoは、雛形に添ってソースコードを入力して利用するフロー型のビジュアルプログラミングツールです。

ソースコードと混ぜることで、様々な言語、様々なプラットフォームでのビジュアルプログラミングを可能にします。

すでに、21種類の言語、およびプラットフォームに対応しています。

詳細はこちらを参照下さい。

StateGoの画面

純日本語への挑戦

純日本語にするため、あえて、変数は日本語にしました。

例)

英語での変数名 日本語での変数名
nextstate _次ステート
curstate _今ステート

さらに、StateGoの変換結果を入力するマークも以下のような日本語にしました。

英語でのマーク名名 日本語でのマーク名
[STATEGO OUTPUT START] 【StateGoの自動挿入開始】
[STATEGO OUTPUT END] 【StateGoの自動挿入終了】

ステート関数

StateGoは、ステート呼ばれるノードにプログラムを埋め込みます。
プログラムは、言語別に用意されたテンプレートで展開されて、ステート関数となります。

『なでしこ』用のステート関数テンプレートは以下の通りです

#
●[[state]]
    # [[state-cmt]]
    [[command]]
    [[branch]]
    <<<?nextstate   //注:nextstateが指定してあれば >>>までを反映
    もし、_次ステートが空ならば
        _次ステートに「[[nextstate]]」を代入
    ここまで
    >>>
    戻る

ステートは、『なでしこ』の関数で定義され、入力した値が展開されます。
各項目の意味は以下の通りです。

項目 説明
state ステート名
state-cmt コメント
command 命令=ユーザが入力した『なでしこ』の命令
branch 分岐命令。分岐条件が翻訳される
nextstate 遷移先のステート名

例として、以下のように定義されているとします。

項目 内容
state S_0000
state-cmt (定義なし)
command 「こんにちは、なでしこさん!」と言う
branch (定義なし)
nextstate S_0001

先のテンプレートで展開され、以下のようになります。

●S_0000
    #
    「こんにちは、なでしこさん!」と言う
    もし、_次ステートが空ならば
        _次ステートに「S_0001」を代入
    ここまで
    戻る

※branchについては、説明が長くなるので割愛しました。

ステート関数の管理

ステート関数の管理で扱うのは次の2つの変数です。

_今ステート

アンダーバーは、ユーザ利用と分ける意味で使用しています。
この2つの変数を以下のようにループ内で扱うことで対応しています。

	#
	もし、_次ステートが空でなければ
		_今ステートに_次ステートを代入
		_次ステートに空を代入
	ここまで
	#
	もし、_今ステートが空でなければ
        #【StateGoの自動挿入開始】 indent(8) $/./->#switch$
        もし、(_今ステート=「S_0000」)ならば、S_0000する
        もし、(_今ステート=「S_0001」)ならば、S_0001する
        もし、(_今ステート=「S_END」)ならば、S_ENDする
        もし、(_今ステート=「S_START」)ならば、S_STARTする
	#【StateGoの自動挿入終了】
	もし、(_今ステート=「S_END」)ならば
		「終了」と言う
		終了
	ここまで	

途中にある
【StateGoの自動挿入開始】 indent(8) $/./->#switch$は、ツールのコンバータにより挿入されれる部分開始の意味です。 【StateGoの自動挿入終了】で終了します。

#switchのマクロを使い展開されます。 #switchのマクロの定義は以下の通りです。

#switch=もし、(_今ステート=「[[state]]」)ならば、[[state]]する

上記のマクロが全ステートに対して実行されます。

動作の詳しい説明は、StateGoのホームページを参照下さい。

サンプル

StateGoなでしこサンプルはGithubで公開中です。

なでしこは、v1 とv3のバージョンがあり、v1がWindows版でv3がOSに依存しない様になっており、node.jsまたはブラウザ上で利用可能です。

サンプルは、それぞれ用意しました。

V1 サンプル

V3サンプル

なでしこV3サンプルについての注意

なでしこV3のサンプル作成の際、ブラウザでの操作について深く考慮しておりません。ブラウザ内の遷移を考える場合、イベントドリブンまたはタイマ起動のようなJavascriptサンプルで使ったような設計が不可避と考えています。

なでしこをプログラミングしてわかったこと

このように『なでしこ』のプログラミングをやってきて気づいたことがありました。
それは、「母国語そのものだからコメントが要らない」。
当たり前っていえば、当たり前ですが、英語を母国語としない我々にとっては(特に自分以外の場合)コメント無しでは理解の半分も難しいことがあるのです。
逆に英語が母国語の人たちはこれが普通の世界なのですね。変数名の命名則、スペルや省略名を大変気にするわけです。

日本語プログラミングの未来

『なでしこ』についてはここまでです。
ここからは、本題から外れて、日本語によるプログラミングの未来について言及してみます。

私が中学の頃は、教科書にコンピュータのことなど一切書かれていませんでした。当時の学習雑誌で知り、独学し、言語はアセンブラで更に手作業での機械語翻訳でした。
そして、あれから何度ともなくパラダイムシフトが起きました。
いまやプログラミングを知らずとも、スマートスピーカーを使い日本語でコンピュータに命令できる時代になりました。まさに隔世の感です。
中学で『なでしこ』を勉強した方々が社会に出るころには、きっとシンギュラリティを間近で経験し、そして、その後の方が人生で長く経験することとなると思います。
英語といった他国語でのプログラミングではなく母国語でニュアンスを含めてコンピュータに伝える時代になるのではないでしょうか?
そして、AIアシストのスマートスピーカーならぬスマートエディタ、または、スマートプログラミングと言ったのが普通になる時代ではと思い馳せてしまいます。
まさに、わくわくする未来です。

がんばれ、日本の子供たち!

リンク

このページのリンクを集めました。

日本語プログラミング言語なでしこ https://nadesi.com/
StateGo https://statego.programanic.com/
StateGoなでしこサンプル https://github.com/NNNIC/psgg-nadesiko-sample

(イラスト:TAJIBON)

Discussion