LoginSignup
4
2

More than 1 year has passed since last update.

素朴な自作言語のコンパイラをCrystalに移植した

Last updated at Posted at 2021-03-26

Crystal が 1.0 になりましたね :confetti_ball:

めでたい。

というわけで(といいつつ少し前から作っていたのですが)移植しました。例によってライフゲームのコンパイルが通ったのでヨシ、という程度の雑なものです。

移植元

ベースになっているバージョン: tag:56 のあたり

(2022-01-09 追記) step62 の変更まで反映しました。

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

動かし方の例

# Docker イメージをビルド
./docker_build.sh

# コンテナに入る
./docker_run.sh

# 以下はコンテナ内で実行

# コンパイラをビルド ... bin/* が生成される
./build_container.sh

# コンパイル
echo '
  func add(a, b) {
    return a + b;
  }

  func main() {
    var one = 1;
    var result;
    call_set result = add(one, 2);
  }
' | bin/lexer | bin/parser | bin/codegen

# ↓ アセンブリが出力される
  call main
  exit

label add
  push bp
  cp sp bp

  # 関数の処理本体
  cp [bp:2] reg_a
  push reg_a
  cp [bp:3] reg_a
  push reg_a
  pop reg_b
  pop reg_a
  add_ab

  cp bp sp
  pop bp
  ret

label main
  push bp
  cp sp bp

  # 関数の処理本体
  sub_sp 1
  cp 1 reg_a
  cp reg_a [bp:-1]
  sub_sp 1
  cp 2 reg_a
  push reg_a
  cp [bp:-1] reg_a
  push reg_a
  _cmt call~~add
  call add
  add_sp 2
  cp reg_a [bp:-2]

  cp bp sp
  pop bp
  ret

# ... snip ...

メモ

参考

他の言語への移植

記事 リポジトリ 日付
Haskell github 2021-06-28
OCaml github 2021-06-26
Pascal github 2021-05-22
Julia github 2021-05-03
Rust github 2021-04-07
セルフホスト github 2021-02-21
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