-
Notifications
You must be signed in to change notification settings - Fork 1
Home
sonota88 edited this page Apr 20, 2025
·
22 revisions
- (2019) RubyでオレオレVMとアセンブラとコード生成器を2週間で作ってライフゲームを動かした話
- 最初に v1 を作ったときの備忘記事
- (2019〜) vm2gol v2 製作メモ
- v2 の製作過程
- (2020) Rubyで素朴な自作言語のコンパイラを作った
- パーサまで作った時点の記事
-
vm2gol v2 追加機能など
- 後付けの機能。メインブランチにはマージせずブランチでいろいろ試しています。
- 言語機能の追加: 真偽値リテラル、break など
- パーサの代替実装: Racc、Parslet、Lrama
- 他のターゲット向けの出力: x86_64
-
週刊Railsウォッチ(20210209後編)Rubyでミニ言語処理系を作る、Kernel#getsの意外な機能、CSSのcontent-visibilityほか|TechRacho by BPS株式会社
- v1 を紹介していただきました
- (2021) 素朴な自作言語Ruccolaのコンパイラをセルフホストした
- v2 に機能を加えてセルフホストしたバージョン
TODO 各命令の説明
- mov
- add
- mul
- cmp
- jmp
- je
- call
- ret
- push
- pop
- exit
- 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 x; // ここはコメント- 宣言
- var 文
- 関数定義の直下でのみ使える(たとえば while 文の中では使えない)
- 代入
- set 文
func main() {
var x; // 宣言
set x = 42; // 代入
return x; // 参照
}- 値の型は符号あり整数のみ
- B言語に近い?(要調査)
- 真偽値として扱う場面では 0 は偽、それ以外は真
-
+,*,==,!= - 優先順位
- 左結合。ただし、
()で囲むことで明示的に指定できる。
- 左結合。ただし、
1 + 2 * 3 //=> 9
1 + (2 * 3) //=> 7- 定義
- 呼び出し
- 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 なし
func main() {
var x = 1;
case
when (x == 42) {
// ...
} when (1) { // else-equivalent
// ...
}
}- while文
func main() {
var i = 0;
while (i < 10) {
// ...
i = i + 1;
}
}