🖖

Go言語でmrubyの静的型検査器を作ってみた💎

に公開

はじめまして!🤖

多分技術記事を投稿するのは初めてかも🔦

都内でエンジニアをやってる、hamachangです!

半年くらいかけて「mrubyの静的型検査器」を作ったので、成果物の紹介や作るまでにキャッチアップした本とかを紹介したいと思います!

作ったやつ: mruby型検査器 Ruby-TIの紹介

「Ruby-TI」
https://github.com/engneer-hamachan/ruby-ti

画像みたいな感じで、未定義関数呼び出しにエラーを出したり、
関数実行時に型検査をしてエラーを出したりと、
とにかくmrubyコードを静的解析しまくって、
ありとあらゆる実行前検査を行う事が出来ます💎

↓ちょっと前のだけど、Xに投稿したdemo動画もあります🎥
https://x.com/EHamachang/status/1958682100678189562/video/1

なぜGo言語を選んだのか

Go言語はセルフホストされた言語(Go言語はGo言語で書かれてる言語)なので、Go言語自体が恐らく言語処理を上手く行うための機能を持っているだろうと思って、選択しました。

実際にGo言語で自作の言語処理系ソフトを色々作ったのですが、「Goだから出来ない」みたいな事は一度も無かったです⭕️

型検査器を作るまでのキャッチアップ

1.まずはプログラミング言語を作ってみる

言語処理系の技術を獲得するなら、プログラミング言語を作ってみるのが一番手っ取り早いです!

自分が勉強した本の中では、

「いまどきのプログラミング言語の作り方」

「やさしいLispの作り方」

の2冊が特におすすめで、実際にこの2冊しかまともに読んで無いですが、

割と本格的なLisp処理系(VM実行方式のインタプリタ)まで作る事が出来ました

「DISCO LISP」
https://github.com/engneer-hamachan/disco-lisp

自分が行ったキャッチアップ方法としては、

紹介した本はそれぞれ「Java」「C言語」で参考コードが書かれてる所を、Goに置き換えながら実装するやり方で覚えて行きました📒

2. インタプリタが作れたら型検査器も作れる

はい。もうSTEP2で終わっちゃうのですが、
インタプリタが作れたら、基本的に型検査器も作れます!

インタプリタも型検査も、

  1. コードを字句解析する
  2. パースする
  3. 動作させる

と言う、ざっくりとした部分は一緒なのと、

型検査する為の型情報の管理も、インタプリタの変数の管理方法をそっくりそのまま使えたりするので、

技術的にもやってる事も、本当にそんなに変わらないです⭕️

実際に、DISCOとRuby-TIも1/3くらいはほとんど同じ様なコードになってます(lexerやparser辺りは特に)

まとめ

「型検査」とか、「インタプリタ」とか一見難しそうに思えますが、

本当に全然そんな事は無くて(きっと紹介した本を読んでくれれば解ってくれるはず!)

誰もが手軽に楽しめるものなので、言語処理系を個人開発するのは超おすすめです(仕事にはあんま役立たないけどね!)

あと、オートマトンとか〇〇理論とか、
少し勉強して挫折しちゃった人も沢山いると思うのですが、

実際は知らないままでも、全然実装出来たりするものなので、
「難しい事はすっ飛ばして後から勉強するぜ!」って気持ちで再チャレンジしてみて欲しいです💪

型検査器を作るまでに必要な知識や技術の紹介って、あんまり見た事無いなって思ったので記事にしてみました🙆

この記事をきっかけに、「よーし、ちょっと言語処理系やってみようかな」とか思ってくれたら嬉しいです✨

それじゃ!

Discussion