Crystal が 1.0 になりましたね
- Crystal 1.0 - What to expect - The Crystal Programming Language
- プログラミング言語Crystal、初のメジャーリリースとなるバージョン1.0を公開:CodeZine(コードジン)
めでたい。
というわけで(といいつつ少し前から作っていたのですが)移植しました。例によってライフゲームのコンパイルが通ったのでヨシ、という程度の雑なものです。
移植元
ベースになっているバージョン: 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 ...
メモ
-
is_a?
で型を調べて分岐させると型が制限される。自分が知ってる中では TypeScript が近い。 - ユニオン型からのキャスト:
as
-
of
による型の指定-
これは推論された型を置き換えるので、生成時には同じ型しか入っていないけれど、あとで別の型が入ってくるような場合に対応できます。
https://ja.crystal-lang.org/reference/syntax_and_semantics/literals/array.html
-
- String からシンボルへの変換
- グローバル変数は使えない
-
しかし Crystal にグローバル変数はありません。代わりにクラス変数や定数を使ってください。
https://crystal-jp.github.io/introducing-crystal/chapters/03-syntax.html
-
- レキサの出力も
["kw", "func", 1]
のような JSON にしてみた。
少し冗長になるけど、扱いが楽になるので良さそう。
これは Ruby 版にフィードバックしようかな。
参考
他の言語への移植
記事 | リポジトリ | 日付 |
---|---|---|
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 |