LoginSignup
4
2

More than 1 year has passed since last update.

Juliaでかんたんな自作言語のコンパイラを書いた

Last updated at Posted at 2021-05-02

とりあえず触って慣れようということで、何も分からないところからいきなり作り初めてその都度調べるという感じで雑に書いてみました。

移植元

ライフゲームのプログラムだけコンパイルできればOKという簡単なコンパイラです。
ベースになっているバージョン: tag:57 のあたり

作り方はここに全部書いています(Ruby 版のものですが): vm2gol v2 製作メモ

メモ

主な部分のサイズ(行数):

$ wc -l *.jl lib/utils.jl
  359 codegen.jl
  113 lexer.jl
  360 parser.jl
   56 lib/utils.jl
  888 合計

Ruby のような動的言語で書くのと似たフィーリングで書けました。

ただし、こういうのはダメで、

xs = ["a"]
push!(xs, 1) # xs に整数を追加
#=> ERROR: LoadError: MethodError: Cannot `convert` an object of type Int64 to an object of type String

次のように型について教えてあげないといけない、なんて場面はあったり。

xs = Any["a"]
push!(xs, 1)

今回のおためし。
ブランチ: trial

今回は case 文のネストを減らしてみました。
おためしというか v3 ですでに適用済みになっていて、 v2 にも取り込もうかなと考えているもの。

// before

case {
  (current_val == 0) {
    case {
      (count == 3) {
        set next_val = 1;
      }
    }
  (0 == 0) {
    case {
      (count == 2) {
        set next_val = 1;
      }
      (count == 3) {
        set next_val = 1;
      }
    }
  }
}
// after

case
when (current_val == 0) {
  case
  when (count == 3) {
    set next_val = 1;
  }
when (0 == 0) {
  case
  when (count == 2) {
    set next_val = 1;
  }
  when (count == 3) {
    set next_val = 1;
  }
}

{} が1段なくなるため、ネストが減り、行数も減ってちょっとコンパクトになります。

ついでに、when 句の先頭にキーワード when を置くようにしてみました。パーサの都合としてはあってもなくてもほとんど違いはなく、 when を置いた方がなんとなく見た目的に落ち着きがよいかな、という程度の理由です。

他の言語への移植

記事 リポジトリ 日付
Haskell github 2021-06-28
OCaml github 2021-06-26
Pascal github 2021-05-22
Rust github 2021-04-07
Crystal github 2021-03-27
Kotlin github 2021-01-14
Zig github 2021-01-07
LibreOffice Basic github 2020-12-14
Go github 2020-09-25
PHP github 2020-09-18
C♭ github 2020-09-13
Perl github 2020-09-08
C github 2020-09-06
Java github 2020-08-30
Dart github 2020-08-22
Python github 2020-08-19
TypeScript (Deno) github 2020-08-15
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2