🕠

GoとLLVMで電卓を作る

2022/08/12に公開

自作言語作りたい

ある程度実用性がある自作言語を作りた買ったのですが、
Go言語でつくるインタプリタ」をパーサーの途中で「自分が作りたいのはコンパイル言語だ」と思って挫折してしまいました。

後日、本屋さんで
きつねさんでもわかるLLVM
を見つけて、これなら簡単に作れたらいいなと思って、とりあえず電卓を作るところからということで始めました。

具体的には、goyaccとllvmを使って電卓を作ったので学習のメモ的な感じで残しとこうと思います。

最終は、goに加えて、ちょっとrustな言語に仕上げたいなぁと思ってます。

  • mut がない限りreadonly
  • ポインタなし、nullable は?つけるとかそんな感じ
  • if, forが式
  • ガーベージコレクタなしで、Borrow Checkerみたいな感じにしたい、でもライフタイム演算子とか複雑だから、半分は手動。

多分挫折するんですけど、今は、想像しながらニヤニヤしてまして、それがモチベーションです。

ソースはこちらです。

https://github.com/ryicoh/llvmcalc

今回学んだところ

今回学んだのは、主にBNF周りでした。

終端記号と非終端記号というコンパイラの授業で習った気がするけど、テスト勉強のためだけに勉強してたから何も理解していなかったやつを完全に理解できたかもしれないです。

BNF自体は見た目でなんとなく分かりますが、再帰が苦手すぎます。

llvmはアセンブラ書いてるみたいで可愛いです。ここは今回、電卓なので特に難しいことは何もなかったです。

便利だったやつ

goの text/scanner でレキサー書いたのですが、Goの標準ライブラリの割にはリッチで、ただ呼び出すだけで実装できました。go/scanner もあって、そっちはGo専用のスキャナみたいです。

https://cs.opensource.google/go/go/+/refs/tags/go1.19:src/text/scanner/example_test.go;l=28

GitHubで編集を提案

Discussion