1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Java C# Ts GoのC系言語 Mind DNCLの日本語系言語の制御構文を比較して自作言語Re:Mindの構文を定める(for..if文)

Last updated at Posted at 2023-02-10

はじめに

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

Java
    for (int i=0; i<10; i++)
    {
         //todo
         if(j==0)break;
         //todo
    }

C#

C#
    for (int i=0; i<10; i++)
    {
         //todo
         if(j==0)break;
         //todo
    }

TypeScript

TypeScript
    for (let i=0; i<10; i++)
    {
         //todo
         if(j==0)break
         //todo
    }

Go

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用)

VisualBasic for Application
    For i = 0 To 9 Step 1
        'todo
        If J=0 Then Exit For
        'todo
    Loop

Mind

Mind
    10を 回数指定して
       ※todo
        Jが 0に 等しい
            ならば 打ち切り
            つぎへ
       ※todo
    繰り返す

「回数」が既定のカウンタ変数となっていて、構文内で参照することができる。インクリメンタル数指定の構文があるかはわかりませんでした。

DNCL

DNCL
    i を 1 から 10 まで 1 ずつ増やしながら,
        //todo
        もし j = 0 ならば
            //脱出文は未定義?
        実行する
        //todo
    を繰り返す

DNCLはループ文中の条件分岐で脱出させる実行文は定義されていない模様。存在するならば、確認でき次第訂正します。

自作言語の構文イメージ

Re:Mind

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様の場をお借りして、獲得したスキルや知見の共有、いたらない点のご支援をいただければと考えています。

参考リンク

Mind プログラミングマニュアル 3 制御構文

共通テスト手順記述標準言語 (DNCL) の説明

目次-プロデルで始める日本語プログラミング言語入門

日本語プログラミング言語「なでしこ」 制御構文

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?