はじめに
あまりの衝撃にしばらくタイトルが考えられませんでした。興奮しすぎて変なタイトルにするとQiitaのコミュニティガイドラインやマナーに抵触する恐れも。
ついにある種のシンギュラリティを突破したかのようなチャットボットChatGPTの日本語自然文、プログラミング言語テキストのさばき具合を確認してみました。
この記事内容の作業目的
自作言語Re:Mindの構文仕様策定の参考情報としてAIによる構文認識度を検討します。
この記事内容の保証
※この記事には実装的な情報が含まれます。各言語で書かれた引用ソースの妥当性は保証されません。また、自作言語は開発中(というよりまだ企画段階)のため、本記事に開示された仕様は予告なく変更される場合があります。
とりあえずChatGPTの日本語プログラミング言語の認知具合をお問い合わせ
日本語プログラミング言語一般
Q>日本語プログラミング言語をご存じですか?
Chat gpt>はい、いくつかの日本語プログラミング言語を知っています。以下はいくつかの例です:
1.なでしこ - なでしこは、日本のプログラマ〇〇〇〇によって作成されたブロックベースのプログラミング言語です。主に子供向けに設計されています。
2.すごろくプログラム - すごろくプログラムは、日本のプログラマ◇◇◇◇によって作成されたプログラミング言語です。命令をすごろくのような盤上に書いて、サイコロを振ることでプログラムを実行します。
3.ぷよプログラミング - ぷよプログラミングは、日本のプログラマ〇〇◇◇によって作成されたプログラミング言語で、プログラミングの学習を楽しいものにすることを目的としています。ぷよぷよのようなキャラクターを使ってプログラムを作成します。
これらのプログラミング言語は、日本語を母国語とする人々にとって学習しやすく、特に子供たちにとっては楽しい方法でプログラミングを学ぶことができます。
う~む、やはりなでしこですか。しかし、子供向けはひどいいわれよう?初心者によりそった公式サイトの内容があだをなしているのかもしれません。〇〇◇◇には実名っぽい日本人名が出力されましたが、ほんとうかは不明な(次に問い合わせたMindの場合は明らかにあやまりだった)ので、ここでは伏せてます。
日本語プログラミング言語Mind
Q>日本語プログラミング言語Mindをご存じですか?
Chat gpt>はい、Mindという日本語プログラミング言語を知っています。Mindは、日本のプログラマ〇◇〇◇氏によって開発された、自然言語に近い日本語でプログラミングができる言語です。
Mindの特徴は、英語のプログラミング言語にありがちな「;」や「{}」などの特殊な文字を使用しないことです。代わりに、日本語の文章に近い形式でプログラムを書くことができます。たとえば、Hello Worldプログラムを書く場合、以下のようになります。
こんにちは、世界!
また、変数や関数名も日本語で書くことができます。例えば、次のようなコードが書けます。
もし(数値が5以上なら) {
コンソールに出力(「大きい数値です」);
} でなければ {
コンソールに出力(「小さい数値です」);
}
Mindは、日本語でプログラミングを学びたい人や、日本語が母国語である人々にとって、学習がしやすいとされています。ただし、英語とは異なる構文や表現が多くあるため、英語で書かれたプログラムと比べると、学習コストがかかる可能性があります。
う~む、Mindの強みと弱みを見事に言い当てているような…「{}などの特殊な文字を使用しない」といいつつ、例示したソースコードにはしっかり使われているのがご愛敬。
つづいて、どきどきしながら…
日本語トランスコンパイラ言語Re:Mind
Q>日本語トランスコンパイラ言語Re:Mindをご存じですか?
Chat gpt>はい、Re:Mindという日本語トランスコンパイラ言語を知っています。Re:Mindは、先に挙げたMindをベースにした、日本語からC++言語へのトランスコンパイルを行う言語です。
Re:Mindは、C++言語の構文に近い形式で日本語のコードを書くことができます。例えば、次のようなコードが書けます。
もし(数値が5以上なら) {
std::cout << "大きい数値です" << std::endl;
} でなければ {
std::cout << "小さい数値です" << std::endl;
}
このコードは、以下のようなC++のコードにトランスコンパイルされます。
if (数値 >= 5) {
std::cout << "大きい数値です" << std::endl;
} else {
std::cout << "小さい数値です" << std::endl;
}
Re:Mindは、日本語でプログラミングを学びながら、C++言語の構文や書き方を学ぶことができるため、初心者向けの教育用途に適しているとされています。また、日本語でのプログラミングが必要な場合にも活用されています。
ほんとですかっ!?Qiita上にのみしか存在しない情報で、ここまでまとめてくるとは恐るべしChatGPT。ただし創作も含まれる。「Mindをベースにした」なんて筆者にはおそれおおいです。ターゲットがC言語ファミリの場合、そのシンタックスを;{}なしで実現しようという意図は少ない情報でよく汲み取っていただけましたという感じです。
各言語名を明示して各言語の変数宣言・関数実行文・関数宣言文を与えてC#のソースコードへの変換を依頼する
各言語の変数宣言・関数実行文・関数宣言文、ここはロジックとは言えないところなのでAI的にも難しいところなのではと筆者は思う。しかし、学習リソースはネット検索可能情報なので、どこまでいけるかは見ものでした。
ChatGPTに与えたお題の各言語ソースはこちらの記事で比較していたものです。入力側はテキスト貼り付けしていますので引用以外のmarkdownの装飾はQiita記事上で行っていません。出力はChatGPTが付与してきたコードブロックとシンタックスハイライト指定をそのまま使用しています。
ちなみにAI Programmer(プロトタイプ)はこのお題3言語とも変換対象C#の場合undefinedが1行出力されるだけで、なにも変換できませんでした。これはAI Programmerには自然日本文としていきなりソースコードを与えているので諸条件ことなっています。筆者は日本発の当サービスを応援しています。
日本語プログラミング言語なでしこ
Q>以下は日本語プログラミング言語なでしこのソースコードです。対応するプログラミング言語C#のソースコードを教えてください。
年齢とは整数。
名前とは文字列。
特待区分とは整数。年齢 = メンバーの年齢を取得する(名前と特待区分の)
名前と特待区分でメンバーの年齢を設定する●メンバーの年齢を取得する(名前と特待区分の)
//todo v1はかっこ後方
それは歳
ここまで●(名前と特待区分で)メンバーの年齢を設定するとは
//todo v3はかっこ前方
ここまで
Chat gpt>以下は、日本語プログラミング言語なでしこのコードを、C#のコードに変換したものです。
using System;
class Program {
static void Main(string[] args) {
int 年齢;
string 名前;
int 特待区分;
年齢 = メンバーの年齢を取得する(名前, 特待区分);
名前と特待区分でメンバーの年齢を設定する(名前, 特待区分, 年齢);
}
static int メンバーの年齢を取得する(string 名前, int 特待区分) {
int 年齢 = 0;
// ここに年齢を取得する処理を書く
return 年齢;
}
static void 名前と特待区分でメンバーの年齢を設定する(string 名前, int 特待区分, int 年齢) {
// ここに年齢を設定する処理を書く
}
}
なでしこのコードは、C#の構文には直接対応する表現がないため、一部の判断が必要ですが、上記のようにC#のメソッドと変数を用いたコードに変換することができます。ただし、メンバーの年齢を取得する処理や年齢を設定する処理は、具体的なアルゴリズムが明示されていないため、それぞれのアプリケーションに応じて適切な実装を行う必要があります。
なでしこの「名前と特待区分で」の助詞で引数を特定するシンタックスは認識しなかったようです。しかし、関数の日本語名から処理の意図を理解してロジックは提示されていないのでわかりませんよと言ってくるあたりがSFっぽいです。
日本語プログラミング言語Mind
Q>以下は日本語プログラミング言語Mindのソースコードです。対応するプログラミング言語C#のソースコードを教えてください。
年齢は 数値 11桁。年齢に 34を 入れる。
名前は 文字列実体 長さ 10桁。名前に 「花子」を 入れる、
特待区分は 数値 1桁。特待区分に 1を 入れる。名前と 特待区分で メンバーの年齢を取得し 年齢に 入れる。
名前と 特待区分で メンバーの年齢を設定する。メンバーの年齢を取得するとは 処理単語
(名前、区分 → 整数)※コメントなので動作としては意味が無い
※todo
齢をつむこと。メンバーの年齢を設定するとは 処理単語
(名前、区分 → ・)
※todo
・・・・・すること。
※2023/02/20追記 正しくは「数値で」なく「変数」。ここではこのように入力してしまいましたのでそのままとします。
Chat gpt>以下は、日本語プログラミング言語MindのコードをC#のコードに変換したものです。
using System;
class Program {
static void Main(string[] args) {
long 年齢 = 34;
string 名前 = "花子";
int 特待区分 = 1;
年齢 = メンバーの年齢を取得する(名前, 特待区分);
名前と特待区分でメンバーの年齢を設定する(名前, 特待区分);
}
static long メンバーの年齢を取得する(string 名前, int 特待区分) {
// ここに年齢を取得する処理を書く
long 齢 = 0;
return 齢;
}
static void 名前と特待区分でメンバーの年齢を設定する(string 名前, int 特待区分) {
// ここに年齢を設定する処理を書く
}
}
Mindのコードは、C#の構文には直接対応する表現がないため、一部の判断が必要ですが、上記のようにC#の変数や関数を用いたコードに変換することができます。ただし、年齢を取得する処理や年齢を設定する処理は、具体的なアルゴリズムが明示されていないため、それぞれのアプリケーションに応じて適切な実装を行う必要があります。
Mindの「名前と 特待区分で 」の分かち書きで引数を特定するシンタックスは認識しなかったようです。なでしこのコメント記号は一般的なダブルスラッシュでしたが、Mindのコメント記号を解釈したのはしびれました。わたしはわすれてました。すみまんせん。todoコメントの内容を展開しているあたりもすごいです。
日本語トランスコンパイラ言語Re:Mind
Q>以下は日本語トランスコンパイラ言語Re:Mindのソースコードです。対応するプログラミング言語C#のソースコードを教えてください。
/** nenrei /
・int 年齢 = 34;
/** namae /
・string 名前 = "花子";
/** tokutaiKubun */
・bool 特待区分 = true;□年齢 = メンバーの年齢を取得する(名前,特待区分)
□(名前,特待区分)で メンバーの年齢を設定する/**
* getMembersAge
* @param 名前 name
* @param 特待区分 kubun
* @return 年齢
/
▽public int メンバーの年齢を取得する(string 名前,bool 区分)
//todo
齢を 返す
△
/**
* memberNenreiSettei
* @param 名前 name
* @param 特待区分 kubu
*/
▽private メンバーの年齢を設定する(string 名前,bool 区分)
//todo
△
Chat gpt>以下はRe:Mind言語のソースコードをC#に変換した例です。
using System;
public class Program {
static void Main() {
// nenrei
int 年齢 = 34;
// namae
string 名前 = "花子";
// tokutaiKubun
bool 特待区分 = true;
int 齢 = GetMembersAge(名前, 特待区分);
MemberNenreiSettei(名前, 特待区分);
}
/**
* getMembersAge
* @param 名前 name
* @param 特待区分 kubun
* @return 年齢
*/
static int GetMembersAge(string 名前, bool 区分) {
// todo
int 齢 = 0;
return 齢;
}
/**
* memberNenreiSettei
* @param 名前 name
* @param 特待区分 kubu
*/
static void MemberNenreiSettei(string 名前, bool 区分) {
// todo
}
}
ただし、Re:Mind言語には型情報を持つ変数やメソッドの引数に対して「数値」、「文字列実体」、「数値」、「文字列」などの型情報が付与されていますが、C#においてはこれらを表現する適切なデータ型に変換する必要があります。例えば、「数値」はC#においては整数型であるintに対応します。
なでしこ、Mindのコメントはテンプレ感のあるものでしたが、Re:Mindについては情報も少ないせいで若干当たってない状態となりました。このあたりはMindの構文情報とごっちゃになっているようです。変数宣言文の直前の中点・があだになっているかもです。ただし、C#のコードでは適切に型を出力。
しかし、おどろくべきは関数宣言前のjava docを解釈してC#側の関数名は実行文も宣言文も指定した英字名を出力してきたところです!ちょっとすごいです。日本語トランスコンパイラ言語Re:Mindのアノテーションとして使おうとしていた意図が汲み取られました。(勝手に創作したとも言える?)
おわりに
スゴすぎてなんとも言えない。最後に本記事のタイトル考えました。
日本語トランスコンパイラ言語という企画を実現・設計・実装していくには、スキル上の課題や未獲得の知見など多数あることが予想されます。Qiita様の場をお借りして、獲得したスキルや知見の共有、いたらない点のご支援をいただければと考えています。
参考リンク