はじめに
Java C# Ts Goの新旧C系言語、Mind DNCLの日本語系言語の制御構文を比較して自作言語Re:Mindの構文を定めます、
自作言語Re:Mindの詳しい利用シーンのイメージはこちらへ
この記事内容の作業目的
日本語トランスコンパイラ言語 Re:Mind (自作言語)と他言語との構文比較(IF文)という記事で、もっともシンプルなif文について検討しましたので、今回は比較的複雑なelse ifとelseに加えて、さらに前半の間にif elseが入れ子になっている状態をモチーフとします。
この記事内容の保証
※この記事には実装的な情報が含まれます。各言語で書かれた引用ソースの妥当性は保証されません。また、自作言語は開発中(というよりまだ企画段階)のため、本記事に開示された仕様は予告なく変更される場合があります。
Java C# Ts Goの新旧C系言語の構文イメージ
なるべく長くならずイメージが比較しやすいよう、比較判定用の変数の宣言は割愛します。また、糖衣構文もとりあえず今回対象外です。
Java
if(i>0){
if(j==0){
//todo
}else{
//todo
}
//todo
}else if(i<0){
//todo
}else{
//todo
}
C#
if(i>0)
{
if(j==0)
{
//todo
}
else
{
//todo
}
//todo
}
else if(i<0)
{
//todo
}
else
{
//todo
}
C#は構文仕様とは関係ないと思いますが、コードエディタの整形機能で、かっこのインデント位置を縦線で表現したいせいか、わりとこんな感じで改行を強制してくるイメージがあります。
TypeScript
if(i>0){
if(j==0){
//todo
}else{
//todo
}
//todo
}else if(i<0){
//todo
}else{
//todo
}
Go
if i>0 {
if j==0 {
//todo
}else{
//todo
}
//todo
}else if i<0 {
//todo
}else{
//todo
}
GoはC言語由来の言語で小かっこ「()」があるはずのところにないのは斬新な印象を受けます。
各言語のIF構文の間に挟まれているtodoは各言語のコメントアウト符号によるコメントです。なにか実行文が書けますの意。
まとめ
C言語由来の各言語は伝統の中かっこ「{}」をうまく使って、構文の区切りをトークナイザが識別できるようにしている感じですね。
最初にifが出現したあと、次の条件は中かっこ閉じた後、ifではなくelseが出現するので、入れ子となったifを入れ子になっていると認識しやすそうな構造です。
Mind DNCLの日本語系言語の構文イメージ
では、続いて日本語プログラミング言語のグループです。
VBAは日本語ではありませんが、中かっこ「{}」を使って区切ることはなく、構文の表現も自然言語の英語に近いので、こっちの方に寄せました。
VBA(Excel用)
If I>0 Then
If J=0 Then
'todo
Else
'todo
End If
'todo
Else If I<0 Then
'todo
Else
'todo
End If
Mind
Iが 0より 大きい
ならば
Jが 0に 等しい
ならば ※todo
さもなければ ※todo
つぎへ
※todo
さもなければ
Iが 0より 小さい
ならば ※todo
さもなければ ※todo
つぎへ
つぎへ
Mindはelse if構文はないような気がしました。ありましたら、ごめんなさい。訂正します。とりあえずelse ifなしの入れ子にしています。
2023/02/11追記 条件分岐パスが他言語と等価となるようelse側への入れ子を追加しました。
Mindでは「もし」を擬似語(ダミーの単語)として登録してあり、見た目が自然となる場合は記述することもできます。if構文の終端は「つぎへ」。
DNCL
もし I > 0 ならば
もし J = 0 ならば
//todo
を実行し,そうでなければ
//todo
実行する
//todo
を実行し,そうでなくもし I < 0 ならば
//todo
を実行し,そうでなければ
//todo
実行する
DNCLでは「実行する」がif構文の終端、「を実行し、」がelseの役を担っている感じです。さすがに「を実行し,そうでなくもし」は冗長かな感あり。
自作言語の構文イメージ
Re:Mind
◇i > 0 の場合
◇j == 0 の場合
//todo
◇他に
//todo
◇ここまで
//todo
◇他に i < 0 の場合
//todo
◇他に
//todo
◇ここまで
単純If構文で◇を初開示した際に、else ifの中に入れ子にされたらだいじょうぶかな的な心配があったのですが、今回書いてみていけそうな予感はしてきました。最初の◇IF条件行に続いて、入れ子の◇IF条件行が出現したとき、else if相当の◇IF条件行とどうやって区別させるかあたりがポイントです。直訳っていえば直訳ですがなるべく短く(笑)
プロデル なでしこ 第2世代日本語系言語の構文イメージ(参考)
あまりと言いますかかなり詳しくはないのですが、参考にわたしの心の中での第2世代日本語プログラミング言語「プロデル」と「なでしこ」の制御構文も比較してみました。よくわかっていないので、間違っていたらごめんなさい。訂正します。
プロデル
もし i > 0 なら
もし j = 0 なら
//todo
そうでなければ
//todo
もし終わり
//todo
他でもし i < 0 なら
//todo
そうでなければ
//todo
もし終わり
なでしこ
もし、I > 0 ならば
もし、J = 0 ならば
//todo
違えば
//todo
ここまで
//todo
違えば、もし、I < 0 ならば
//todo
違えば
//todo
ここまで
2言語とも単行コメント文にはダブルスラッシュ可のようでした。
else文は、プロデルは「そうでなければ」、なでしこは「違えば」のようです。各言語作者の好みといいますか、このあたりのゆらぎは面白いですね。
なでしこの「ここまで」はオプショナルの模様。
おわりに
システムエンジニアというとプログラミング得意なのではと業界外の人は思っていらっしゃるかと存じますが、特に業務システムのエンジニアはそうでもないのが実情です。分業が進んでいる環境ですと、実装工程は製造とかいってアウトソースしたり若手にまかせたりというシーンが少なくないように思われます。ただ、経験値的に、あるいは地頭的に複雑なロジックを組み立てることはできるので、若手のデベロッパーをそういう面から支援している場合は多くあります。
そこで、昨今のこまごまとしたフレームワークの細かい小技はわからないけど、きもとなるロジックはこれだ的なシーンで、年配エンジニアやマネージャ層でも記述できる言語として日本語トランスコンパイラ言語なるものがあったらいいなと考えたしだいでございます。
この企画を実現・設計・実装していくには、スキル上の課題や未獲得の知見など多数あることが予想されます。Qiita様の場をお借りして、獲得したスキルや知見の共有、いたらない点のご支援をいただければと考えています。
参考リンク