見出し画像

Vibe codingでプログラミング言語を作る

  • タイトル通りです

  • JulesというAIコーディングエージェントが結構作業環境まで含めて作業してtestもしてという感じだったので, これなら少し指示してあげるだけでプログラミング言語も作れそうだなと思い, 作成

  • gccの再発明みたいなタスクではなくて, LLVMとか既存のcompiler基盤ソフトウェアをプロンプトで指定して作らせました(多分ここが工夫点)。

    • LLMが主にfront部分

    • LLVMが主にbackend部分

    • なので, LLVM部分はLLMがあまり頭を使うことのないようになっているはずです(人間がLLVMをすらすら書けるとかそういう話ではない)

    • LLMとLLVMがまぎらわしすぎる

  • Julesはpromptを打ち込むと裏側で勝手にVMが建って環境構築をしてそのまま開発が進む感じらしいです。しかも自分でしっかりcompileが通ることやtestもしてくれます。最初はminecraftを作らせていたんですが, 作成したUIを送りつけてきたこともありました。この自律性能を見てこいつなら自作言語いけるんじゃないかと思いました。

  • prompt

    • 思いついたままに書いたのでマジで網羅的でもなんでもないです。それでも作ってくれることを体感しましょう

    • というかわざと今回は人間側で細かく決めるのはやめました。本当に真面目に作るとしたら生成文法部分は自分で考えてからじゃないとまかせたくはないです。

  • 最初のprompt

LLVMをbackendにしてオリジナル文法で適当な言語を作って, 構文とか全部まかせますがASTを構築して理論的にしっかりとした言語にしてください。設計思想はまかせます。 ソースプログラム ↓ 字句解析器 ↓ 構文解析器 ↓ セマンティック解析器 ↓ 中間コード生成器 ↓ コード最適化器 ↓ コード生成器 ↓ ターゲットプログラム の順で作成してください, 他ファイルで定義したものも使えるような機能(import, includeのような)をつけてください。
typeがintだけなのはどうかと思うのでfloatと配列, string, structかclassなどの追加を求めます。C++やPythonのようなmethodやRustのimplのようにdataと関数をまとめたものを作成してください。
標準的な言語にあるsetやvector etc...などのデータ構造は作成した言語で定義してください。これら以外にも標準的な言語にあるデータ構造を実装するのに必要だと思ったものは実装してみてください。
+,-,*,%,<<,>>演算子など普通の言語にある演算子は実装してください。pointerの実装をする場合, void型とcastとか実装してください。
makefileなどbuild toolを使ってください, readmeなどに作成した言語の文法の解説は含めてください ARMとx86でcompileできるようにしてください
作った言語はいくつかしっかりとしたtest技法にしたがってtestしてください
  • 最初のprompt作業後のprompt

実行できるためのDockerfileとか作って, CやC++で定義した関数が呼び出せたり, 制作した言語で定義した関数がC/C++などで呼び出せるようにしてください。既存のエコシステムを再利用するためにlibcを使えるようにしてください
  • その後のprompt

importの際CにおけるPATHのような変数はないのですか?
制作した言語がwrapper.cとかなしにCの関数を呼び出せるようにしたいです。externとかを追加すればできませんか?
  • さらにその後

README.mdに言語機能をかなり詳しく書いて
lib/std.novのmalloc, free, and printf wrappersをどのように実現しているのかがわかればこの言語のextensionとか書きやすくなるかもなのでdocs/以下に配置できますか?
あとこの言語特有のpathとその設定の仕方とどう動くかとか, programする人向けのdocsを作って
  • 見ての通り全部AI任せです。

出来上がったもの
- こちらです

  • 構文とか

    • 変数定義, 関数の書き方, struct + impl型のdata定義などRustに近いかなと思います。

    • でも所有権とlifetimeはない

ちょっとこだわってみたところ
・流石にCのソフトウェアスタックは使える言語がいいかなと思い, Cの関数は呼び出せるようにしました。いくつかの基本的なdata構造も用意しました。

・あとは言語自体の拡張性が少しあるといいかなと思い, docs以下に自分で書いたCの関数の呼び出し方や制作した言語特有のPATHの設定方法やプログラミングガイドも追加しました。

実際にコンパイルしてみても普通に動いたので, コーディングエージェントってここまでできるんだなと思いました。

余談なんですがこれはTake2です。promptの序盤にCとの連携をお願いするとなんでもかんでもCの関数を呼び出すオンボロ言語ができてしまいました。
これからやる人は一旦作成し終わった後にCとの連携を考えた方がいいです。
あとはプログラミング言語に関して詳しい人が作った方がやはりいい言語はできるのかなと思います。特にプログラミング言語の研究者の方とかが自分の提唱するプログラミングモデルの最初期の実証とかにいいんじゃないでしょうか

書くことまだあった気がするけど思いつかないので今日はここまで, Jules, 面白いので遊んでみてください。

いいなと思ったら応援しよう!