AIがコードを書くようになるなら、AIだけに理解できる言語を作ればいい、のかな?

AIがコードを書くようになって、そしてその品質がどんどんあがってきて、人間がコードを書く必要性が薄れてきています。
であれば、プログラミング言語そもそも不要で日本語で命令与えるだけでいいのでは、とか、人間には読み書きできないAI専用言語を作るといいのでは、という話になりそうだけど、やっぱ今のプログラミングは残るんじゃないかな。

(画像は「創るJava」初版の挿絵です。初版のイラストは自分で描いてます)

大森さんと話をする機会があって、そこで話した内容が日経XTECHの記事で少し触れられていました。
生成AIは所詮は人間の亜種、企業のITシステムの置き換えにはならない | 日経クロステック(xTECH)

人の言葉を理解できるようになったのだから、プログラミング言語はもう不要なのではないか。
この考えをある著名なソフトウエアエンジニアに話してみたところ、意外なことに「プログラミング言語はなくならないと思う」という意見が返ってきた

このとき話した内容をもとに、すこしAI時代のプログラミング言語の必要性をまとめてみます。

AIがあるならプログラミング言語は不要?

AIが解釈してくれるのであれば日本語なり英語なりで命令与えればいいだけでは?と思ったりするけど、やはりなんらかの言語は必要だろうと思います。
システムにおいて大事なことは再現性と検証可能性、そして性能だからです。

再現性

システムでは、多数のユーザーに対して同じ動作を何回も提供する必要があります。そうすると、各実に同じ動作を何万回も繰り返せるよう、動作を規定できる必要があります。いまのAIのように、場合により少し動作が違ったり、うまくいかなかったりするというのではダメですね。
そのためには、なんなりか形式的な言語で動作をゆらぎなく記述する必要があります。プログラミング言語はそのための知見がつまって今の形になっているので、活用するほうがいいです。

もちろん、テストを十分に行えば動作保証できるのではという考え方もできますが、そのようなテストを行うのは困難です。まずは記述によって正確性を担保する必要があると思います。

検証可能性

同じ動作を何万回も繰り返せる必要があると書いたのだけど、やっぱり少しずつ条件が変わりますね。こういったブログの投稿を考えても、基本的には同じだけど書かれている内容や文字数、タイミングが違います。 そうすると、なんらか特殊な条件で動作がおかしいということが起きることがあります。
そのとき、どういう条件で動作がおかしいのか、なぜそのような動作になるのか検証できる必要があります。そして、その動作を修正したときに、他に影響がないのかも確認できる必要があります。

「なんかよくわからないけどいろいろ試してプロンプトに『よろしくお願いします』を付けたら治った」ではダメですね。
そうすると、確認できる可読性も必要になります。
いま広く使われている言語は、読み書きしやすいバランスが保たれているので、活用したほうがいいでしょう。

性能

そもそもAIは遅いし電気を食います。電気を食うということはコストがかかるということです。AIを動かすコストはかなり高いです。
サンプルプログラムレベルのTODOアプリを使うために月1000円の課金が必要になっても、だれも使わないですね。 システム構築では、いかにコンピュータを効率よく使ってコストを下げるかということも求められます。

では、AIに直接機械語を出力させればどうなのか、となります。けれども、効率のいい機械語を出力できるようAIを学習させるのは難しく、またそうやって出力した機械語が常に最適であるという保証もできません。
コンピュータには物理制約があり、その制約を回避するためにキャッシュやパイプラインといった複雑な仕組みをもっています。その仕組みをいかして性能を出すには、特性をいかしたコードを生成できる必要があります。AIにそのような特性を教え込ませるよりも、すでに存在するLLVMJVMといった最適化の仕組みを利用するほうが、効率が高く確実です。コードはプログラミング言語で記述して、そういった仕組みに高度な最適化を行ってもらうのが、一番効率がいいと思います。

AI専用のプログラミング言語でいいのでは?

プログラミング言語が必要というのはわかった、しかし人間に読み書きできることをあきらめてAI専用の言語にすれば、もっと高度なプログラミング言語ができるのでは」と思うかもしれません。
けど、それは難しそうだし、必要性もないんじゃないかなと思います。

どうやって作るのか

まず、どうやって作るのかという問題があります。結局のところその言語は人間が作る必要があります。 そうすると、人間には理解できないけどAIに理解できるということを想像しながら言語を作っていく必要があります。
そうやって作った言語が本当にAIに理解可能なのかを検証するために、言語を作って、その言語で書かれたコードを大量に作って、学習させて、理解度を確認する必要があります。
そしてAIに理解できていなさそうとなったとき、AIに本質的に理解できないのか、単に学習の量や質が足りないのかの判断は難しいですね。
そういった試行錯誤を行いながら言語を技術的に作れるか、現実的にそのような困難な作業をするモチベーションがあるかというと疑問があります。

必要なのか

人間じゃなくてAIが作ればいいんでは、となるかもしれませんね。じゃあなんなりかそのような言語が作れるとします。そうなると、そもそも必要かという話をする必要がでますね。

機械専用の言語を作るとしたときに、イメージとしては自然言語の単語で表しているものを記号にするというものがありますね。
たとえば、extendsと書いているところを:で表すような。これはJavaC++などの違いですけど。
けど、AIが扱うと考えたときにそのような記号化のメリットはほとんどありません。文字数は問題にならないからです。
また、いまのAIは自然言語で常識を学びつつプログラミング言語を学ぶという形になっています。自然言語がベースにあるのです。そうすると、AIにとっても記号より単語のほうが理解しやすいということになります。

では機能的なところはどうか、ということになりますね。AIだとより高度な言語機能を扱えるのではないかと。
言語機能といったとき、大事なのは型システムと並列性だと思います。ちょっと記述量が減らせるといったものは、AI専用としては不要です。いい感じに記述が減らせるなら、人間用の言語にも取り込めばいいですね。

まず並列性で、最近はコルーチンなど並列性の機能を取り込んだ言語も増えています。これをAIが扱うならさらに高度な並列機能が可能では、というのを考えたいところですが、並列性の難しさって本質的ではないかというのがあります。また、いまのAIの仕組みはトランスフォーマーからニューラルネットの階層に直列的に情報が流れるので、並列処理が人間に比べて得意になる要素がない気もします。
AIだからといって訓練された人間以上に並列処理の記述が得意になるとは思えないです。

型システムについては、人間よりちょっと複雑な型システムを扱えるかもしれないなという気はします。ただ、型システムを強くすると、広範囲に記述が面倒になりがちというのがあります。AIといえども、そういった面倒な記述は不得意で、不整合がでやすくなる型システムとの戦いが必要になる気がします。

そもそもとして、並列性も型システムも、いまある以上に高度なものが必要なのかという疑問があります。いま広く使われる実用言語で一番高度な型システムとしては、Rustの借用がありますが、ほとんどの人がそれを求めていないですね。求めている人も、コードのすべてでそれが必要とは思っていないはずです。
つまり、いま人間向けとしてある言語はすでに実用システムを書くために必要十分なんではないかということです。 いまプログラミング言語に採用されていない高度な型システムは、仕様記述言語のように用途限定して使うので十分な気がします。用途限定であれば人間にも扱えてるというのもありますね。

ということで、AI専用の言語というのは必要性が薄いなと思うし、そのような薄い必要性のためにコストと労力をかけて言語を作ることもないように思います。

今のプログラミング言語は1000年残る

10年以上前はITの世界はドッグイヤーだと言われて変化が速いと言われていましたが、最近は新しいものがでなくなっています。生成AIが久しぶりに話題になった感じ。
もう新しい言語は10年近く出てないです。また他の技術としてもAWS LambdaやKubernetesも10年近くたってますね。システム開発のためのIT技術の進化は一段落ついたように見えます。
いまあるプログラミング言語はある程度の淘汰や変化はあるとしても、漢字が2000年続いているように、それなりに今の形を保ったまま残っていくように思います。