kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

ChatGPTをプログラミング言語開発に役立てる

久し振りの更新です。巷では先日リリースされたばかりのGPT-4oの話題でもちきりですが、私も当日深夜2時のライブストリーミングを見てその後すぐにGPT-4oを試しています。性能に関する雑感としては

  • 全般的にはGPT-4-Turboより頭が良い
  • Claude 3 Opusと比較すると、お堅い & 無難な回答を返す傾向あり
    • ただし、Opusよりハルシネーションは起きにくい印象
  • 画像認識の性能が凄い

辺りでしょうか。特に最後の点は特筆すべきことで、GPT-4-Turboの画像認識よりだいぶ性能が向上したおかげで今までだとやりにくかったことも簡単にできるようになっています。その際たるものが先日バズった

でしょうか。とはいえ、今回の本題は画像認識機能でなくタイトルの通り、プログラミング言語開発にGPT-4o(の画像認識部分でない部分)を役立てるというものです。

ちょくちょく停滞気味なのが玉に瑕ですが、私は現在日本語プログラミング言語「ぬこ」を開発しています。

github.com

特徴としては

などが挙げられます。さて、プログラミング教育をやるようになってここ数年、漠然と考えていたことがありました。それは抽象構文木の概念をどうやって初心者に教えるかということです。実際、Scratchは抽象構文木を割と素直に視覚化したプログラミング言語および開発環境ともいえ、知られているようにプログラミング教育で大きな成果を収めています。

しかし、一方でScratchである程度「プログラム」が書けるようになっても、そこから先のテキストベース言語に移行する際に大きなギャップがあり、ここでつまづく人も少なくありません。

そんなこんなで色々考えを巡らせていましたが、今夜、ふと「プログラミング言語内でvisualize(1 + 2)のようにしたら、グラフィカルな形でASTを表示してくれればいいんでは」という(誰でも思いつきそうな)着想が浮かびました。実際、Nimではdumptreeという機能があるそうです。

ただ、調べてみた限り、dumptreeはアスキーアート風味に木構造を表示する代物のようで、惜しいけど求めてるものとはちょっと違うという感じでした。

ともあれ自作のプログラミング言語なら自分で作りこむしかないのですが、最初思い浮かんだのはJavaで書かれた木構造(かグラフ構造)描画ライブラリを使うことでした。しかし、調べてみると木構造の方は実用に耐えるものがあまりなさそうでしたし、グラフ構造描画ライブラリを使って木構造を描画するのは多少手間がかかります。

なんとかいいアイデアがないものかと考えていたのですが、ふと「JTreeを使って、素直にNukoの抽象構文木をビジュアライズすればいいんじゃね?」と思い至りました。というわけでChatGPTの出番です。

こんな感じのリクエストを出したら、見事にASTを受け取ってSwingのJTreeとして表示するライブラリができました。それを早速Nuko言語に組み込んでみた結果が以下です。

可視化した結果はまだ粗削りですが、これは手で修正してもよし、さらにChatGPTに依頼してリッチな見た目にしてもらうことも容易でしょう。

驚くべきは、最初にアイデアを思いついてから、ChatGPTに質問して実際に組み込むまでわずか1時間で完了したことです。少なくとも以前の私だったらここまで素早く思いついたアイデアを自作の言語に組み込むことはできなかったでしょう。ChatGPT様!といった感じです。

ChatGPT (GPT-4o) でなくても、Claude 3 OpusやGemini 1.5Pro、GPT-4-Turboでもできそうなことではあるのですが、以前に比べて一発でほぼ動くコードが出る確率が高くなったように感じます。

そんなこんなで、ChatGPTにコード生成させると便利な例の紹介でした。