-
Notifications
You must be signed in to change notification settings - Fork 0
Home
sonota88 edited this page Oct 1, 2022
·
18 revisions
- (2019) RubyでオレオレVMとアセンブラとコード生成器を2週間で作ってライフゲームを動かした話
- 最初に v1 を作ったときの備忘記事
-
vm2gol v2 製作メモ
- v2 の製作過程
- (2020) Rubyで素朴な自作言語のコンパイラを作った
- パーサまで作った時点の記事
- (2021) 素朴な自作言語Ruccolaのコンパイラをセルフホストした
- v2 に機能を加えてセルフホストしたバージョン
TODO 各命令の説明
- exit
- cp
- add_ab
- mult_ab
- add_sp
- compare
- jump
- jump_eq
- call
- ret
- push
- pop
- set_vram
- get_vram
- _cmt
- _debug
VM命令とほぼ1対1対応
mini-ruccola という名前にする前は VG言語と呼んでいました。
call
call_set
case
func
return
set
var
when
while
_cmt
_debug
//
から行末まで
// ここはコメント
- 宣言
− var 文
- 関数定義の直下でのみ使える(たとえば while 文の中では使えない)
- 代入
- set 文
func main() {
var x; // 宣言
set x = 42; // 代入
return x; // 参照
}
- 値の型は符号あり整数のみ
- B言語に近い?(要調査)
- 真偽値として扱う場面では 0 は偽、それ以外は真
-
+
,*
,==
,!=
- 優先順位なし(
(
)
で明示する)
- 定義
- 呼び出し
- call 文
- call_set 文
- return
func foo() {
}
func add(a, b) {
return a + b;
}
func main() {
var x;
call foo(); // 呼び出し
call_set x = add(1, 2); // 呼び出して返り値を変数に代入
}
- case 文
- fall through なし
- 条件式をつねに truethy になる式にすれば else 節相当になる
func main() {
var x = 1;
case
when (x == 42) {
// ...
} when (1) { // else
// ...
}
}
- while文
func main() {
var i = 0;
while (i < 10) {
// ...
i = i + 1;
}
}