はじめに
Java C# Ts Goの新旧C系言語、Mind DNCLの日本語系言語の制御構文を比較して自作言語Re:Mindの構文を定めます。今回は少し複雑なループ制御。
自作言語Re:Mindの詳しい利用シーンのイメージはこちらへ。すみません、企画段階です。
この記事内容の作業目的
日本語トランスコンパイラ言語 Re:Mind (自作言語)と他言語との構文比較(FOR文)という記事で、もっともシンプルなfor文(カウンタ変数なし、打ち切り条件なしの無限ループ)について検討しましたので、今回は比較的複雑なカウンタ変数ありの構文に加えて、間にif文で打ち切り条件がカウンタ満了前に入っている状態をモチーフとします。
この記事内容の保証
※この記事には実装的な情報が含まれます。各言語で書かれた引用ソースの妥当性は保証されません。また、自作言語は開発中(というよりまだ企画段階)のため、本記事に開示された仕様は予告なく変更される場合があります。
Java C# Ts Goの新旧C系言語の構文イメージ
なるべく長くならずイメージが比較しやすいよう、if文の比較判定用の変数の宣言は割愛します。また、カウンタ変数はint整数型でそろえ、インラインで宣言できる言語はそのようにします。拡張for文、foreach文、Iterator系はとりあえず今回対象外です。
Java
for (int i=0; i<10; i++)
{
//todo
if(j==0)break;
//todo
}
C#
for (int i=0; i<10; i++)
{
//todo
if(j==0)break;
//todo
}
TypeScript
for (let i=0; i<10; i++)
{
//todo
if(j==0)break
//todo
}
Go
for i:=0; i<10; i++ {
//todo
if j==0 {
break
}
//todo
}
各言語のFor構文の間に挟まれているtodoは各言語のコメントアウト符号によるコメントです。なにか実行文が書けますの意。j変数はその中でなんらか操作されている想定。
まとめ
C言語由来の各言語は伝統の中かっこ「{}」をうまく使って、構文の区切りをトークナイザが識別できるようにしている感じですね。
GoはC言語由来の言語にもかかわらず、小かっこ「()」があるはずのところにないのは斬新な印象を受けます。しかしfor文の中かっこ開始「{」が改行されると構文エラーになります。if文からも小かっこトークンがなくなったので、中かっこ「{}」がはずせなくなった。このあたりはトレードオフといったところでしょうか。
Mind DNCLの日本語系言語の構文イメージ
では、続いて日本語プログラミング言語のグループです。
VBAは日本語ではありませんが、中かっこ「{}」を使って区切ることはなく、構文の表現も自然言語の英語に近いので、こっちの方に寄せました。
VBA(Excel用)
For i = 0 To 9 Step 1
'todo
If J=0 Then Exit For
'todo
Loop
Mind
10を 回数指定して
※todo
Jが 0に 等しい
ならば 打ち切り
つぎへ
※todo
繰り返す
「回数」が既定のカウンタ変数となっていて、構文内で参照することができる。インクリメンタル数指定の構文があるかはわかりませんでした。
DNCL
i を 1 から 10 まで 1 ずつ増やしながら,
//todo
もし j = 0 ならば
//脱出文は未定義?
実行する
//todo
を繰り返す
DNCLはループ文中の条件分岐で脱出させる実行文は定義されていない模様。存在するならば、確認でき次第訂正します。
自作言語の構文イメージ
Re:Mind
〇i=0,i<10,i++ 繰り返す
//todo
◇j==0 の場合 やめる
//todo
〇ここまで
分岐やループを直感的に表す全角記号「◇」や「〇」を積極的にトークンとして活用しようと考えているのが、「Re:Mind」(自作言語リマインド)の特徴です。
また、日本語のまま記述すると、書くのが手間になりそうな構文はある程度の半角文字の記号表現(慣れれば直感的にわかりそうな範囲)を許容しようかなと考えております。C言語系に慣れているとセミコロン;打っちゃいそうなところは、余裕があれば許容するとしたいです。また、もう少し日本語的で簡潔な表記があれば、それも可としたい。
プロデル なでしこ 第2世代日本語系言語の構文イメージ(参考)
あまりと言いますかかなり詳しくはないのですが、参考にわたしの心の中での第2世代日本語プログラミング言語「プロデル」と「なでしこ」の制御構文も比較してみました。よくわかっていないので、間違っていたらごめんなさい。訂正します。
プロデル
Iを0から1ずつ増やしながら9まで繰り返す
//todo
もしJが0なら、繰り返しから抜け出す
//todo
繰り返し終わり
なでしこ
カウンタで0から9まで繰り返す
//todo
もし、Jが0ならば、抜ける
//todo
ここまで
2言語とも単行コメント文にはダブルスラッシュ可のようでした。
脱出文は、プロデルは「繰り返しから抜け出す」、なでしこは「抜ける」のようです。各言語作者の好みといいますか、このあたりのゆらぎは面白いですね。
なでしこの「ここまで」はオプショナルの模様。インクリメンタル数指定の構文があるかはわかりませんでした。
なでしこv3はjavaScriptをターゲット言語として、ソース言語をなでしこv1互換とした日本語トランスコンパイラ言語とも言えそうですね。
おわりに
日本語トランスコンパイラ言語という企画を実現・設計・実装していくには、スキル上の課題や未獲得の知見など多数あることが予想されます。Qiita様の場をお借りして、獲得したスキルや知見の共有、いたらない点のご支援をいただければと考えています。
参考リンク