Written in Japanese(UTF-8)
2026. 2. 3
INASOFT

/トップ/目次/管理人のひとこと/生成AIを活用して、独自スクリプト言語を作り直したい。いじくるつくーるからR-Scriptを分離して他のアプリで活用したい

3441744 (+0263)[+0721]

管理人のふたこと

生成AIを活用して、独自スクリプト言語を作り直したい。いじくるつくーるからR-Scriptを分離して他のアプリで活用したい



公開日:2026/ 2/ 3

【目次】

■読み飛ばしても良いこれまでの人生の流れ

先月(2026年1月)、四半世紀ぶりに、独自のスクリプト言語について考え始めていました。

振り返ってみると、小学5年生のときにPC98のN88BASICに出会い、BASIC言語でのプログラミングを覚え、その2~3年後くらいには、ジャストウィンドウの一太郎(ver.4.3)を見て、マルチタスクにあこがれて、これを実現できるような自力のプログラミング言語を作って、それを実行するマルチタスク環境(今でいうところのVM)を作ってみたい…という、途方もない憧れを抱いていました。

大学4年生のとき、当時フリーソフトの開発・公開活動がかなりノッて来ていた頃。翌年に就職を控え、効率の良い開発・公開の活動を継続することへの不安をネタとして、それを卒業研究の活動にしたらどうか?と、当時の研究室の先生から勧められ、効率の良い開発のために自力のプログラミング言語とインタプリタの作り方を教わって、約半年くらいかけて、「いじくるつくーる」(Rnsf7)を独自のスクリプト言語(R-Script)で構築するに至りました。

現在は、色々あって、いじくるつくーるは開発を終了しまして、R-Scriptも塩漬けとなりました。

今から振り返ると、内部コードはShift_JIS(CP932)で構築され、整数は正の値しか扱えないなど、なかなか無理のある状態になっていました。



■生成AIとプログラミング(生成AIにゲームを作ってもらう)

去年(2025年)あたりから、「バイブコ-ディング」という言葉が騒がれるようになりました。ってか、この言葉自体は後から知ったのですが、世間でこれだけ生成AIが騒がれているなら、生成AIにコーディングさせたら面白いことができるんじゃないか?と思うのは自然な流れでした。

最初の挑戦(というか試行)は、去年末に挑戦した、ブラウザで動くシューティングゲームを生成AI丸投げで作ってもらってみるという試みです。

そこそこ緩めの指示(プロンプト)を渡して、ChatGPT, Gemini, Copilotの3者にシューティングゲームを作ってもらって、見事にゲーム性のある物が出来上がりました。(実際に与えたプロンプトは上のリンクから見れます。ゲームも遊べます)



■生成AIとプログラムの作り方相談(生成AIにダークモード対応をお願いしてみる)

上の試みで味を占めたので、年末年始休暇は、既存で公開しているソフト(Win32)を、ダークモード対応させてみるのを、生成AIに手伝ってもらってやってみようということにしました。

残念ながらCopilotはあまり有効な回答を返してくれませんでしたが、GeminiとChatGPTは色々と周辺情報含めて教えてくれまして、かなり有効に進めることができました。

相手はコンピュータなので、しつこく質問してもちゃんと応えてくれるのが良い。ただ、専門用語とか分からないと、そもそもAIにどう聞いたら良いのか(どうプロンプトを書いたら良いか)分からないこともありましたね。その前提条件そのものも、聞けば教えてくれるのが良いですね。

また、自力でWeb上をGoogle検索したら、こんなに素早く知識を得ることができなかったので、開発スピードも上げることができたかと思います。だいぶ味を占めてきました。



■生成AIに独自スクリプト言語の構築をお願いしてみる(Boost)

最初の話に戻ります。生成AIを使って、独自のスクリプト言語を再構築してみることができるんじゃないか?と思い始めました。先月(2026年1月)末に書いた妄想です。

でも実は、妄想と言いつつ、2026年の生成AIなら何とかしてくれるんじゃないか?という期待もありました。仮に期待通りにならなかったとしても、リスクは無いようなもんですし。(AIを動かしているデータセンターが設置されている、米国の電力消費が激しくなることくらい?)

ChatGPTに相談してみたら、Boost.spiritをお勧めしてくれました。以前、Boostの本を買わせてもらったk.inabaさんの紹介によると、四則演算+カッコを処理するプログラムが、こんな感じで書けるっぽい。おお!令和の時代に作るなら、これがよさそう!ということで、早速試してみました。

というわけで、こちらのページに書かれてたクソ長い呪文詠唱(プロンプト)を作りました。165行に渡る、超絶長いプロンプトですが、構築したいスクリプト言語仕様のほぼ全てを含んでいます。

これだけしっかりと指示を与えればイケるんじゃね?と思ったのですが、そう簡単には行きませんでした。

C++ クラステンプレートを使わなければいいんじゃないか?ということを思い立ち、四半世紀前と同じく、flexとyacc(Bison)を使って作り直す(これも生成AIに作ってもらう)ことにしました。C++レベルではなく、C言語のレベルで出力するエラーなら、ややこしいこともないだろうし。

ちなみに、いじくるつくーる(R-Script)の文法定義のlex定義とyacc定義を流用できないのは、当時はフロー制御をyacc定義の中で書ききることができず、R-Scriptのyacc定義といじくるつくーるのフロー制御に分かれてしまい、これらが密結合状態になっていたためです。他のアプリと連携させる手前、yacc定義とアプリケーションは疎結合にすることは必須事項ですし、そもそもyacc定義でフロー制御を書きなおしたかったというのもあります。

で、結果として4日程度でβ版レベルまで完成しました。長くなりましたが、ここまでは単なる前提で、今日はこの過程を書こうという回になります。


■生成AIに独自スクリプト言語の構築をお願いしてみる2(lex, yacc)

まずは、話を単純化するため、さっき作ったプロンプトよりも、もうちょっと単純化したもの(組み込み関数は減らし、文字列の取り扱いを止めた)をプロンプト(生成AIへの指示呪文)として作り直しました。ちなみに、プロンプトを書くために要した時間は40分ほどです。もしこれで一発で完璧なインタプリタが作れたなら、なんかもう、生成AIバンザイって感じです。


下記の仕様を持つ独自のスクリプト言語「FR-Script」を処理するインタプリタを作ってください。
なお、開発環境はVisual Studio 2010を用い、開発言語はC++言語とし、flexとbisonを用いる。また、スクリプトの文字コードはShift_JISとする。
これに必要なflex用のソースコード、bison用のソースコード、C++のソースコードを出力してください。

■インタプリタ

インタプリタは、ワイド文字のスクリプト文字列、コールバック関数へのポインタを引数にして、C++言語から呼び出せる関数の形をとる。関数名はfr_scriptとする。コールバック関数については後述する。

■式

式は、数値の戻り値を持つ。この言語での数値は32bit符号付整数とする。
式は、一般的な優先度で加減乗除と括弧を処理する。また、以下の演算子を使用可能とする。
式1%式2 :式1を式2で割ったときの余を返す。
式1|式2 :式1と式2をビットORした結果を返す。
式1&式2 :式1と式2をビットANDした結果を返す。
式1^式2 :式1と式2をビットXORした結果を返す。
~式1 :式1の全ビットを反転した結果を返す。
式1>>式2 :式1を式2の数だけ右シフトした結果を返す
式1<<式2 :式1を式2の数だけ左シフトした結果を返す

数値は、そのままの場合は10進数、0xで始まる場合は16進数、0bで始まる場合は2進数として扱う。
トークンは、スペース・タブ・改行で区切られる。スペース・タブ・改行はホワイトスペースとなる。改行は文の区切りもあらわす。
ただし、改行の直前が=,+,-,*,/,(で終わる場合は、次の行に文が継続しているとみなす。
シンボル名は、_またはアルファベットで始まり、その後に_またはアルファベットまたは数値が続く。シンボル名の大文字・小文字は区別しない。
変数はシンボル名で表す。
変数は無宣言で使用可能とする。変数の型は数値とし、無宣言の場合は0となる。

■文

文の終端は改行である。
変数=式で代入文を表す。代入文は式ではなく文である。
変数+=式で変数=変数+式を表す。
変数-=式で変数=変数-式を表す。
++変数または変数++で変数=変数+1を表す。
--変数または変数--で変数=変数-1を表す。

■条件式

条件式として、次の演算子が使用可能。
式1==式2 :式1と式2が等しければ真、等しくなければ偽。
式1!=式2 :式1と式2が等しければ偽、等しくなければ真。
式1<式2 :式1よりも式2の方が大きければ真、そうでなければ偽。
式1>式2 :式1よりも式2の方が小さければ真、そうでなければ偽。
式1<=式2 :式1よりも式2の方が大きいまたは等しければ真、そうでなければ偽。
式1>=式2 :式1よりも式2の方が小さいまたは等しければ真、そうでなければ偽。
TRUE :常に真を意味する。大文字・小文字は区別しない。
FALSE :常に偽を意味する。大文字・小文字は区別しない。

条件式は以下の演算子で組合せ可能とする。
条件式1&&条件式2 :2つの条件式のAND条件とする
条件式1||条件式2 :2つの条件式のOR条件とする
!条件式1 :条件式1の真偽を反転する

文を1つ以上連ねたものをブロックとすることができる。ブロックは { と } で囲まれた1つ以上の文とする。

■制御文

フロー制御文は以下とする。

・IF,ELSE IF, ELSE

IF 条件式1 {
ブロック1
}
ELSE IF 条件式2 {
ブロック2
}
   :
   :
ELSE {
ブロックn
}

条件式1を満たす場合はブロック1が実行され、条件式1を満たさず条件式2を満たす場合はブロック2が実行され、…、すべての条件式を満たさない場合にブロックnが実行される。
なお、IF、ELSEのキーワードは、大文字・小文字を区別しない。

・WHILE, LOOP

WHILE 条件式1 {
ブロック1
}

条件式1を満たす限り、ブロック1を実行し続ける。
ブロック1の中にBREAKが現れたら、WHILEから抜ける。CONTINUEが現れたら、条件式1の評価に戻る。
WHILE(TRUE)の特殊な書き方として、以下の書き方ができるようにする。

LOOP {
ブロック1
}

なお、WHILE、BREAK、CONTINUE、LOOPのキーワードは、大文字・小文字を区別しない。

・EXIT

EXIT または EXIT 数値式
プログラムを終了する。EXITの場合はインタプリタの呼び出し元に0を返し、EXIT 数値式の場合は、呼び出し元に数値式の結果の数値を返す。
なお、EXITが無くても、スクリプトの終端に達すれば、戻り値0でインタプリタを終了する。

■関数

関数は、インタプリタが事前に準備した関数を呼び出すものと、C言語で定義した関数をコールバックして呼び出すものの2種類がある。
関数の呼び出し文は、 シンボル(引数) の形とする。
引数は、0個以上の式をカンマで区切ったものとする。


・インタプリタが事前に準備する関数。なお、関数名の大文字・小文字は区別しない。
sleep(数値) :数値で指定したミリ秒待機する。常に1を返す。
GetCurrentYear() :現在のローカル日時のうち、年(西暦)を返す。ローカル日時は、Windows APIのGetLocalTime()を用いて取得する。
GetCurrentMonth() :現在のローカル日時のうち、月を返す。ローカル日時は、Windows APIのGetLocalTime()を用いて取得する。
GetCurrentDay() :現在のローカル日時のうち、日を返す。ローカル日時は、Windows APIのGetLocalTime()を用いて取得する。
GetCurrentDayOfWeek() :現在のローカル日時のうち、曜日を返す。ローカル日時は、Windows APIのGetLocalTime()を用いて取得する。
GetCurrentHour() :現在のローカル日時のうち、時間を返す。ローカル日時は、Windows APIのGetLocalTime()を用いて取得する。
GetCurrentMinute() :現在のローカル日時のうち、分を返す。ローカル日時は、Windows APIのGetLocalTime()を用いて取得する。
GetCurrentSecond() :現在のローカル日時のうち、秒を返す。ローカル日時は、Windows APIのGetLocalTime()を用いて取得する。
GetCurrentMilliseconds() :現在のローカル日時のうち、ミリ秒を返す。ローカル日時は、Windows APIのGetLocalTime()を用いて取得する。
rand() :疑似乱数を生成して返す。
srand(数値) :乱数生成のシード値を設定する。常に1を返す。


・C言語定義した関数を登録してコールバックする方法
インタプリタを呼び出す際の第2引数に、コールバック関数へのポインタを与える。ここがNULLの場合は、コールバック関数は存在しないものとみなす。
コールバック関数呼び出しは、次の形式の文とする。
CB.シンボル(引数)
CBの部分は大文字・小文字を区別しないが、その後に続くシンボルは大文字・小文字を区別する。
コールバック関数の引数は、シンボルの文字列と、引数の値を渡すための構造体とする。構造体の内容については任せるので、使い方を教えてください。

■コメント
行頭から#で始まる行、;で始まる行、//で始まる行はコメントとして扱い、処理を行わない。

これらをGemini, ChatGPTにそれぞれ伝えまして、結果を得ました。Copilotは前回の事があったので最初から止め。

ChatGPTは、相変わらずフェルマーみたいなことを言い出すので止めました。

というわけで、ここからはGeminiだけに依頼する形で進めています。

こんな感じで、AST木構造を作るためのヘッダ・コード、必要なlex定義, yacc定義をズラーッと書いてくれました。ここには結果の全文は書きませんが、気になる方は上のプロンプトをそのままGeminiに流し込んでもらえれば、ほぼ同じようなコードが出力されると思いますので、そちらをお試しください。

なお、この時は、式(expr)の定義と、引数(args)の定義が中途半端なものを出力されたため、「式と引数のルール定義を書いてください」と、追加で詳細の提示を依頼しています。

一通りできたかな?と思っていたら、コンパイラが「BinaryNodeとUnaryNodeが未定義」というエラーを出力したため、それをそのままGeminiに伝えます。

こんな感じで、適切にエラーが表示されれば、それをそのまま生成AIに伝えることで、適切な修正提案を受けることができます。しかも所要時間は1分くらい。早い。

その後も引き続き、エラーが起きるたびに、「ここでこういう感じのエラーが起きたのでどう対処したらよいか?」という質問を繰り返し続けます。

生成AI側も、いくらでも根気よく付き合ってくれます。早朝だろうと、真夜中だろうと、すぐに(1~3分程度で)答えてくれるのはありがたい。

各種修正の際に、併せて他の部分へ波及する修正もあることを教えてくれるか、教えてくれないかは、その時々によりまちまちでした。なので、「あれ?この部分は足りないんじゃないかな?」と気づいたら、それを伝えて詳細を書いてもらうのが重要です。Geminiだと、ここら辺は完璧なコードを書いてくれます。ChatGPTだと、忘れちゃうことも多いみたい。

ややあって、ようやくビルドが通るようになりました。今回作成を依頼しているのはインタプリタなので、スクリプトを書いてインタプリタに与えてみるテストが必要となります。そこでもやっぱりエラーになってしまったので、それもまた生成AIに聞いて、問題解消を試みます。

なかなかいい感じに解決方法を提案してくれまして、無事に通るようになりました。この辺りから、Geminiは機能拡張を提案してきます。次はそれ(パースエラーや0除算エラーが起きた時に行番号を表示する機能の追加)に従ってみることにします。

この辺りから、提案される機能追加よりは、元々実装しようとしていたが、最初のプロンプトから除外していた機能の追加を目指したくなってきましたので、指示を追加することにします。文字列の取り扱いです。


このスクリプトで文字列を扱えるようにしたいです。次のルールにします。

文字列リテラルは、ダブルコーテーションまたはシングルコーテーションで囲まれる。
文字列リテラルの中に含まれる\は、エスケープシーケンス記号として扱う。
 \n は改行。
 \t は水平タブ。
 \r は復帰。
 \\ は \ そのものを表す。
 \" は " そのものを表す。
 \' は ' そのものを表す。
 \v は垂直タブ。
 \a はビープ。
 \b はバックスペース。
 \f はフォームフィード。
ただし、文字列リテラルが @"文字列" または @'文字列' の形式で書かれた場合、文字列中の\はエスケープシーケンス記号として扱われず、通常の文字列の扱いとなる。
文字列を格納する変数の名前は、変数名の最後に$を付ける。
未設定の文字列変数のデフォルトは、空文字("")とする
文字列を返す関数の名前は、関数名の最後に$を付ける。コールバック関数も同様

文字列を扱う演算子として、次のものを追加・拡張する。
変数名=文字列1:文字列を変数に代入する。
文字列1+文字列2:文字列1と文字列2を連結する
文字列1+数値2:文字列1に、数値2を文字列に変換したものを連結する。
数値1+文字列2:文字列2を数値に変換し、数値1に足す。
変数名+=文字列1:文字列1を変数に追記する。
式1==式2 :式1と式2が等しければ真、等しくなければ偽。式の左右で文字と数値の型が異なる場合は、文字列変換して比較する。
式1!=式2 :式1と式2が等しければ偽、等しくなければ真。式の左右で文字と数値の型が異なる場合は、文字列変換して比較する。
式1===式2:式1と式2が等しければ真、等しくなければ偽。式の左右で文字と数値の型が異なる場合は偽。
式1!==式2:式1と式2が等しければ偽、等しくなければ真。式の左右で文字と数値の型が異なる場合は真。
式1<式2 :式1よりも式2の方が大きければ真、そうでなければ偽。式が数値の場合は単純な大小関係、式が文字列の場合は辞書順での比較とする。式の左右で文字と数値の型が異なる場合は偽。
式1>式2 :式1よりも式2の方が小さければ真、そうでなければ偽。式が数値の場合は単純な大小関係、式が文字列の場合は辞書順での比較とする。式の左右で文字と数値の型が異なる場合は偽。
式1<=式2 :式1よりも式2の方が大きいまたは等しければ真、そうでなければ偽。式が数値の場合は単純な大小関係、式が文字列の場合は辞書順での比較とする。式の左右で文字と数値の型が異なる場合は偽。
式1>=式2 :式1よりも式2の方が小さいまたは等しければ真、そうでなければ偽。式が数値の場合は単純な大小関係、式が文字列の場合は辞書順での比較とする。式の左右で文字と数値の型が異なる場合は偽。


文字列を扱う関数として、次の関数を追加する。
getenv$(文字列) :文字列で指定した環境変数の文字列を返す。指定した環境変数が存在しなければから文字列を返す。
setenv(文字列1,文字列2) :文字列1で指定した環境変数に文字列2を設定する。設定に成功したい場合は1を返し、失敗した場合は0を返す。
strlen(文字列) :文字列の文字数を数値で返す。
strstr(文字列1,文字列2) :文字列1の中から文字列2を探し、何文字目に存在していたかを返す。存在しない場合は-1を返す。大文字・小文字を区別する。
strstri(文字列1,文字列2) :文字列1の中から文字列2を探し、何文字目に存在していたかを返す。存在しない場合は-1を返す。大文字・小文字を区別しない。
toInt(文字列) :文字列を数値に変換したものを返す。文字列の先頭から解析し、数値として解釈可能な部分までを数値として返す。
toStr$(数値) :数値を10進数とみなして、文字列に変換したものを返す。
toStr2$(数値) :数値を2進数とみなして、文字列に変換したものを返す。
toStr16$(数値) :数値を16進数とみなして、文字列に変換したものを返す。
strupr$(文字列) :文字列のうち、アルファベット小文字を大文字に変換した文字列を返す
strlwr$(文字列) :文字列のうち、アルファベット大文字を小文字に変換した文字列を返す
left$(文字列,数値) :文字列のうち、先頭から数値文字抜き出した文字列を返す。文字列の文字数が足りない場合は、元の文字列を返す。
right$(文字列,数値) :文字列のうち、末尾から数値文字抜き出した文字列を返す。文字列の文字数が足りない場合は、元の文字列を返す。
mid$(文字列,数値1,数値2) :文字列のうち、先頭の数値1文字目から数値2も自分を抜き出した文字列を返す。文字列の文字数が足りない場合は、元の文字列を返す。
mid$()の別名として、substr$(), substring$() も使えるようにする。
textout(文字列1,文字列2) :Windows APIのMessageBox APIを利用し、タイトルバーに文字列2、ダイアログ内に文字列1を表示する。メッセージボックスのスタイルとして、MB_OKを指定する。常に0を返す。
textoutの別名として、message, messageboxも使えるようにする。
Warning(文字列1,文字列2) :Windows APIのMessageBox APIを利用し、タイトルバーに文字列2、ダイアログ内に文字列1を表示する。メッセージボックスのスタイルとして、MB_OK|MB_ICONWARNINGを指定する。常に0を返す。
Information(文字列1,文字列2) :Windows APIのMessageBox APIを利用し、タイトルバーに文字列2、ダイアログ内に文字列1を表示する。メッセージボックスのスタイルとして、MB_OK|MB_ICONINFORMATIONを指定する。常に0を返す。
Error(文字列1,文字列2) :Windows APIのMessageBox APIを利用し、タイトルバーに文字列2、ダイアログ内に文字列1を表示する。メッセージボックスのスタイルとして、MB_OK|MB_ICONSTOPを指定する。常に0を返す。
Question(文字列1,文字列2) :Windows APIのMessageBox APIを利用し、タイトルバーに文字列2、ダイアログ内に文字列1を表示する。メッセージボックスのスタイルとして、MB_YESNO|MB_ICONQUESTIONを指定する。はいが選択されたら1を返し、いいえが選択されたら0を返す。
Question_OkCancel(文字列1,文字列2) :Windows APIのMessageBox APIを利用し、タイトルバーに文字列2、ダイアログ内に文字列1を表示する。メッセージボックスのスタイルとして、MB_OKCANCEL|MB_ICONQUESTIONを指定する。OKが選択されたら1を返し、キャンセルが選択されたら0を返す。
Question_YesNoCancel(文字列1,文字列2) :Windows APIのMessageBox APIを利用し、タイトルバーに文字列2、ダイアログ内に文字列1を表示する。メッセージボックスのスタイルとして、MB_YESNOCANCEL|MB_ICONQUESTIONを指定する。はいが選択されたら1を返し、いいえが選択されたら0を返し、キャンセルが選択されたら-1を返す。

ガッツリとコードが追加されたんですが、どう考えても足りない点があったので、そこは率直に伝えてみます。今回は、「はい、必ず見直す必要があります。」とか元気よく返事してくれました。おいおい、必ず必要ならそっちから提案してくれよ。

こんな感じで、生成AIの追加忘れが何か所かあったので、この後、しばらくは「修正は必要ないですか?」を聞き続けることになりました。

その後、当初はShift_JIS(CP932)を前提として文字列を扱おうとしていたため、2バイト文字の2バイト目に\のコードが来る場合の対処法を追加してもらいます(後に、UTF-8で動くように変えたため、このコードは削除しました)。

それにしても、ダメ文字対応みたいな、こんな前時代的な仕草も知っているってのは、感動しますね。

この後、組み込み関数の追加をいくつかお願いしまして、最後に、ユーザー説明用の資料も、生成AIにお願いして作ってもらうことにします。

足りない要素が多かったので、この後、自力で色々追加しましたが、ゼロからマニュアルを作るよりははるかにラクに作業出来た感じでした。0→50より、50→100の方が簡単に作業できるので。

完成したマニュアル…というか、簡易説明書(簡易的な言語仕様書)はこちらに置いてあります。

ここまでの流れ……β版の作成までは4日間で出来ました。
ムチャクチャ速い!
一人でこれを作ったら、1~2か月くらいはかかっていたでしょう。




これを「バイブコーディング」と呼ぶかどうかは、バイブコーディングの定義次第かもしれません。ただ、極めて速い速度で作れたことは間違いないので、結果として、生成AIによるプログラミングの強烈な効果を感じ取ることができました。

あとは、自力でコーディングを進めています。上にも書いた通り、最終的には、「𓄿」や「👿」や「𡈽」などの文字を扱いたくて、内部動作をUTF-8に改造しました。その結果、得られた結果はこれです。

ヒエログリフ:𓄿

まぁ、家族は共感してくれないだろうし、友人も共感してくれないだろうし、Xのフォロワーも共感してくれないだろうし、誰も共感してくれないだろうし、需要とか実用性とかはどうでもよくて。
ヒエログリフの「 𓄿 」が、独自のスクリプトでメッセージダイアログに出力できたんですよ。

四半世紀前に作っていたいじくるつくーるのR-Scriptでは、内部動作がShift_JISになっていたので、これはできませんでした。
今回のFR-Scriptは、入力がUTF-16LEで、内部動作がUTF-8になっているので、実現できるというわけで。興奮しますね。

余談ですが、作者がローカルLLMをやっていた時に痛感したのですが、生成AIは、出力するトークンの数が多くなれば多くなるほどツラくなってきます。ChatGPTはその上限を超えないように、色々理論をこねくり回して、少ない答え方にするというアプローチなのかもしれません。対してGeminiの場合、ホワイトスペースを詰め詰めにしてトークン数を減らしつつも完全回答しようという様子が見られました。前に言ったことを忘れてしまうことも少なかったです。今回はGeminiが大変役に立ちました。(この辺りは、採用するモデル次第らしいです。ちなみに、適切なモデルについても、生成AIに聞けば、どれを使ったらよいか応えてくれるらしい)

とはいえ、Geminiも、出力しているコードに「ここは簡易版」とか書いてあったりします。たいていは、こちらから提示した仕様通りにはなっていないことになるので、「この箇所について完全版のコードを書いて」とお願いすることになります。

仕様提示・仕様通りかのテストは人間がやります。また、適切な聞き方(プロンプト)をしないと正確な答えは返ってこないので、聞き方(プロンプト)を作るための勉強が必要です。ちなみに勉強そのものも、生成AIから学ぶことができます。ChatGPTは2手3手先の答えを出してくれることもあり、助かりました。

ちょっと気になったのは、厳密な意味での著作権の話。絵や動画の生成の世界では、ジブリ風の絵を出せてしまう問題だったり、無断学習に対する反発だったり、色々な問題があります。おそらく、生成AIによるプログラミングも、同じことが言えるかと思います。出力されたコードは、誰かが書いたコードをミックスしたものなのかもしれません。今回、生成AIに協力を仰ぎながらコードが出来て、マウスのお供マウスふるふるのβ版が出来上がりましたが、これのスクリプトインタプリタ部分の著作権を自分が主張することは可能でしょうか? とはいえ、自力でコーディングする場合も、他者のサイトに公開しているサンプルコードを切ったり貼ったりして作るわけなので、それと何が違うんだ?というところでもあります。「人間的苦労」の有無は、著作権に影響を与えるのでしょうか? 将来的には、立法や裁判判決で、こういったことへの方針が示されるのかもしれません。

いちおう、今回作成したコード(と、flex, bison, Visual Studioが自動生成したコード)は、こちらに置いておきます。ライブラリ用に作り直しています。大部分はGeminiが作ってくれたコードになります。Geminiに感謝です。Powered by Gemini!!

このライブラリを取り込んで、実際に動くように実装したものは、マウスのお供マウスふるふるのβ版として公開していますので、そちらをお試しください。

ちなみに、R-Scriptを軽量版にしたということで、FR-Script (Feather R-Script)と名付けています。
また、最初に実験的に搭載したアプリケーションが「マウスふるふる(MOUSEFR)」だったことも、FRにした理由です。




本ページへは、自己責任の範囲内であれば自由にリンクしていただいて構いません。
本ページに掲載されている内容は、自由にお使いいただいて構いませんが、必ずしも筆者が内容を保証するものではありませんので、ご利用に際しては自己の責任においてお使いいただきますよう、お願いいたします。
このページのURLやアンカーは、サーバ運営・サイト運営・ページ運営・その他の都合により無告知で一時的あるいは永遠に消滅したり、変更したりする可能性がありますので、あらかじめご了承下さい。
本ページは、公開から1年半経過後の任意のタイミングで削除される予定です。本ページの内容は複製・公開していただいて構いません。


/トップ/目次/管理人のひとこと/生成AIを活用して、独自スクリプト言語を作り直したい。いじくるつくーるからR-Scriptを分離して他のアプリで活用したい