「なでしこ」「プロデル」「Mind」三大日本語プログラミング言語を徹底解説

# はじめに
「プログラミング言語は何が書かれているのか、どうしても理解できない」
そんな悩みを抱えている方は、Qiitaのユーザーには少ないのではないでしょうか。

「ランタイムエラーが英語で出力されたら」、とりあえず機械翻訳しますのでほぼ問題にならない！もちろん、そのまま自力で意味がわかる方も多くいらっしゃるでしょう。
大人、子どもを問わず英文字のソースコードの解読が得意という意識を持つ方は少なからずいらっしゃいます。

今回は、そのようなふつうに自信を持たれている方に日本語でプログラミングができる「日本語プログラミング言語」を3つ紹介します。
プロフェッショナルなあなたがまだ知らない、日本語プログラミング言語の世界を徹底解説します！

# 日本語プログラミング言語とは？
##  日本文字（日本漢字、ひらがな、カタカナ）を使ったプログラミング言語
あくまで形式言語の範疇で、主に英文字ではなく日本文字（日本漢字、ひらがな、カタカナ）を使ったプログラミング言語のことです。自然言語としての日本語の語順を取り入れるかは必須要件ではありませんが、これからご紹介する３言語は取り入れている例です。

##  日本語プログラミング言語の歴史
80年代前半ごろまでのパソコンは非常に非力で日本語の入力や出力がネックになっていました。PC-DOSに独自の日本語規格を実装して日本語処理能力を高めた日本電気製パソコンが日本市場を席捲すると日本語ワープロソフト一太郎も登場し、パソコン上での日本語の入出力は極あたりまえの操作となりました。このころに日本語（日本文字の漢字など）を使った形式言語Mindなどが登場し始めます。

90年代半ば、Windowsが日本市場を席捲し、プログラミング言語の主流もウィンドウGUIを操作できるアプリケーションが容易に生産できるものとなります。このころ、プロデルやなでしこの前身であるTTSneoやひまわりがWindows対応の日本語プログラミング言語として登場します。

# 1985年に登場した「Mind」
1985年に登場した日本語プログラミング言語「Mind」はソースコードを自然な日本語で記述でき、大規模開発の実績と堅牢性を持つ中間コードコンパイラ言語です。中間コードは独自の軽量ランタイム環境で実行され非常に高速です。

Mindで実装された「MindSearchII」が大規模商用サービスぐるなびの全文検索エンジンとして2004年から6年間採用されたことも、その実力を示していると言えるでしょう。また、Mindは2012年からAndroidに対応するなど、現在も精力的な開発が続けられています。

以下は、Mindの変数宣言・実行文・関数宣言の構文です。

```mind:Mind
年齢は	変数。
名前は　文字列実体　長さ　１０桁。
特待区分は	変数。


名前と　特待区分で　メンバーの年齢を取得し　年齢に　入れる。
名前と　特待区分で　メンバーの年齢を設定する。

メンバーの年齢を取得するとは 　処理単語
            （名前、区分　→　整数）※コメントなので動作としては意味が無い
       ※todo
　　　　齢をつむこと。

メンバーの年齢を設定するとは
            （名前、区分　→　・）
       ※todo
　　　　・・・・・すること。
```
単語(変数名、メソッド名)間の分かち書きを必須とすることで、連結した日本単語の形態素解析のような自然言語処理を回避し、漢字の後のひらがなを一部の例外を除いて無視するという大胆な手法で、逆ポーランド記法よりの日本語の自然さをシンプルに実現した処理系です。処理単語定義の「とは」の後の「処理単語」という文言はデフォルトなので２つ目のように省略することが可能です。単文コメントは※こめじるしです。

# 「なでしこ」
日本語に近い語順で書ける、オープンソースのインタプリタ言語です。現在もっとも知名度のある日本語プログラミング言語で、中学校の教科書にも採用されている実績があります。（ちなみに前述のMindも中学生向けバージョンが富士通などへOEM提供されていたました。）ネーミングも日本らしさを強調していてグッドですね。

なでしこ３はWebブラウザ版にも対応
なでしこ１とは完全互換ではないですが、１と同じく日本語に近い文法を持ちつつ、なでしこ３ではブラウザベースの実行環境を整えています。（実はJsへのトランスパイラ）

以下は、なでしこの変数宣言・実行文・関数宣言の構文です。
```mind:なでしこ
年齢とは整数。
名前とは文字列。
特待区分とは整数。

年齢 = メンバーの年齢を取得する(名前と特待区分の)
名前と特待区分でメンバーの年齢を設定する

●メンバーの年齢を取得する(名前と特待区分の)
        //todo　　v1はかっこ後方
    それは歳
ここまで

●(名前と特待区分で)メンバーの年齢を設定するとは
        //todo  v3はかっこ前方
ここまで
```
定義文は●で始まるのが特徴的ですね。私は●ではじまる文は結構好きです。箇条書き風の雰囲気になると私は認識しています。なでしこも実行文では分かち書きをせず、実行文「名前と特待区分でメンバーの年齢を設定する」などはかなり自然な日本文に見えます。（ので、何らかの形態素解析を実装されているものと推察されます。）単文コメントはダブルスラッシュです。


# 「プロデル」
プロデルは日本語に近い語順で記述できるオブジェクト指向の中間コードコンパイラ言語です。中間コードは共通言語ランタイム(CLR)で、なんと.NETアプリケーションと同じ実行環境で動きます。
言語名は変わりますが、「プロデル」のフランス語風カナ読みで「プロデューレ」の「レ」とレつながりで、「スミレ」と「スミレ畑」があります。

スミレ畑はWebブラウザ版にも対応
スミレは.NET Core環境で動作し、スミレ畑はWebAssemblyというWeb用のアセンブリ言語の一種をコード生成しますので、これらの環境上で動く他言語のアセンブリとの相互運用性に優れた日本語形式言語の実装と言えます。


以下は、プロデルの変数宣言・実行文・関数宣言の構文です。
```mind:プロデル
【年齢:整数】
【名前:文字列】
【特待区分:真偽値】

年齢 = メンバーの年齢を取得する(名前と特待区分の)
名前と特待区分でメンバーの年齢を設定する

【名前】を、【特待区分】で、メンバーの年齢を取得する手順
        //todo
    齢を返す
終わり

【名前】を、【特待区分】で、メンバーの年齢を設定する手順
        //todo
終わり
```
読点（、）は実はオプションで区切り文字として必須ではないです。それでいて分かち書きをしない日本語記述を可能にしているのは、独自の形態素解析を実装しているからです。実行文「名前と特待区分でメンバーの年齢を設定する」などはかなり自然な日本文に見えます。単文コメントはダブルスラッシュです。


# おわりに
この３つの日本語プログラミング言語の開発者は３名様ともQiitaユーザーさんでもあります。[^1] [^2] [^3]
本格的なコンパイラを実装することは非常にたいへんなことです。この記事を読んでいただいたQiitaユーザーのみなさん、ぜひ日本語プログラミング言語の開発者Qiitaユーザーさんを応援して、盛り上げていきましょう！

[^1]: Qiita [まるで詩のような日本語で書いたプログラム - 実際に動きます](https://qiita.com/killy/items/0b5eb530fdceebd8c03e)　参照
[^2]: Qiita [なでしこでもっと美しくFizzBuzzを書く](https://qiita.com/kujirahand/items/4d6a0166f54e4d6290fc)　参照
[^3]: Qiita [日本語プログラミング言語「プロデル」でズンドコキヨシ](https://qiita.com/jpl_produire/items/e28a54709b7eb73cd201)　参照