vm2gol-v2

vm2gol v2 (44) テストの追加

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 残りのテストをまとめて追加しました。 アセンブラ・コード生成器・パーサについては ひとまずライフゲームのコードを与えて出力が一致するか検証するようにしました。 これで、パース〜アセンブル…

素朴な自作言語のコンパイラをTypeScript(Deno)に移植した

移植一覧に戻る TypeScript 入門というか、とりあえず何か書いて慣れようと思って書いてみました。やっつけなので汚いです。TypeScript まだよく分からないけどなんか動いたのでヨシ、というレベルのものです。 github.com 移植元 memo88.hatenablog.com ベ…

vm2gol v2 (43) フォーマットなどいろいろ修正

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 前回 test ディレクトリを作ったので test_vgparser.rb をそちらに移動 各ステップで使っていたソースファイルを steps ディレクトリに移動 最初から細かくディレクトリを分けるのはあまり好みでは…

vm2gol v2 (42) ライフゲームのテスト

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る これまでずっと、テスト書かなきゃなーとは思っていたのですが、書かないままズルズルとここまで来てしまいました。 いいかげん書かないと。 これまで(第38〜40回あたり)はライフゲームを実行し…

Rubyで素朴な自作言語のコンパイラを作った

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る Qiita に引っ越しました。 qiita.com

vm2gol v2 製作メモ(40) 落ち穂拾い: ローカル変数宣言時に初期値をセット

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る これは簡単なのでサラッとやります。 (18) ローカル変数の宣言と代入 / var, set文 のときにちょっと触れていた件です。 だいぶ枝葉な話ですね。 ["var", "x"] , ["set", "x", 12] このように2つ…

vm2gol v2 製作メモ(39) 落ち穂拾い: 入れ子の式を書けるようにする

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 第24回 入れ子の式 で泣く泣く見送ったアレをやっつけます! 枝葉の修正(1) ステップ実行の切り替え 先に枝葉っぽい部分を片付けます。 前回 ダンプ表示を間引きしてライフゲームの実行を高速化…

vm2gol v2 製作メモ(38) おまけの修正

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る ゴール設定が「ライフゲームが動けばOK」 だったので、前回で終わり、としてもよかったんですが、 せっかくなのでもうちょっとだけいじります。 すでにライフゲームが動いており目的は達成されてい…

vm2gol v2 製作メモ(37) 完成!

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る はい、前回でとうとう 1回のターンが動くように……なってないんですねこれが。 1回のターンに必要な処理がもう1つ残ってます。 VRAM のバッファ領域に書き込んだ次世代の状態をメイン領域に戻す処理…

vm2gol v2 製作メモ(36) すべてのセルで繰り返し

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 前回までで、1つのセルについて 生存セル数をカウントして、 次世代の生死を決定して、 バッファ用の配列に書き込むところまでできました。 今回は、盤面のすべてのセルに対してそれを行うようにし…

vm2gol v2 製作メモ(35) 次世代の生死をバッファ領域に書き込み

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 周囲の生存セル数から次世代の生死を決定できるようになりました。 今回は、これを VRAM のバッファ領域に書き込む部分を作ります。 VRAM のメイン領域とバッファ領域は、アドレスが 25 ずれている…

vm2gol v2 製作メモ(34) 次世代の生死を決定

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る もうだんだんライフゲームそのもののコーディングに移ってきたので、 cp 33_adjust_index_2.vgt.json gol.vgt.json として、以後はこの gol.vgt.json に対して修正を加えていきます。 座標補正がで…

vm2gol v2 製作メモ(33) 座標の補正 (2)

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 前回の座標補正の続き……の前に、 先に引っかかるところを潰しておきます。 codegen_return() でローカル変数を返そうとすると 参照の解決ができずにエラーになるので、修正。 --- a/vgcg.rb +++ b/…

vm2gol v2 製作メモ(32) 座標の補正

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る これまでは、 その都度の目標に向けて適当に作り、バグや not yet impl で例外が出たら その都度潰していく、という進め方でやってきました。 そういう方針なので、それはそれでいいのですが、 同…

vm2gol v2 製作メモ(31) 生存カウント (2) / _cmt

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 1つのセルの生死が取れるようになったので、 今度は周囲の8つのセルに対して同じように取得できるようにして、 生存カウントを完成させましょう。 前回のものを修正していくので、vgtコードをコピ…

vm2gol v2 製作メモ(30) 生存カウント / VRAM から値を取得 / ステップ数を表示

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る $stdin.gets を無効化 前回二重ループですべてのセルを生存に変えていくというのをやりましたが、 ループがぐるぐる回るため何度も同じ処理を繰り返すようになり、 Enter キーを押しっぱなしにしな…

vm2gol v2 製作メモ(29) 盤面のスキャン / 組み込みの neq

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 盤面の初期化ができたので続きをやります。 えーと続きというのは何かというと…… とりあえずループを回して盤面のセルを1個ずつスキャンする処理が必要なので、 それをやりましょう。 Ruby のコー…

vm2gol v2 製作メモ(28) リファクタリング / ダンプ表示の改良

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る リファクタリングします! 参照の解決処理をメソッド抽出 前回雑にコピペで追加しまくった fn_arg_pos = fn_arg_names.index(args[1]) + 2 "[bp+#{fn_arg_pos}]" この部分を抽出してメソッド化しよ…

vm2gol v2 製作メモ(27) ライフゲームの実装開始 / 組み込みの掛け算

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る なんだかライフゲーム詐欺みたいになってきましたが 今度こそほんとにライフゲームに突入できる……はず……。 というか突入しましょう! やるぞぉ……! はい、やります。 vgtコードです。 最終的にはグ…

vm2gol v2 製作メモ(26) 配列とVRAM その2 / ダンプ表示の改良

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る さて、前回やっつけで VRAM を用意しましたが、 今回は VRAM の仕様というか使い方みたいなものを簡単に書いておきます。 あわせて、前回お手軽に inspect で済ませていたダンプ表示を いい感じに…

vm2gol v2 製作メモ(25) 配列とVRAM / set_vram, get_vram

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 関数まわりと条件分岐とかが一応できて、入れ子の式も回避方法が決まり…… たぶんまだ足りないところがボロボロ出てくると思いますが、 ライフゲームを作りながら直していきましょう。 まずはライフ…

vm2gol v2 製作メモ(24) 入れ子の式

目次ページに戻る / 前 / 次 前回からの差分 … 今回は差分なし 関数まわりが整備でき、条件分岐ができ、反復処理もできるようになりました。 プログラムを作るのに必要な道具が揃ってきたのでもうそろそろ ライフゲームが書けてしまうのでは!? ……と言いた…

vm2gol v2 製作メモ(23) 組み込みの eq / while文

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 準備が整ったので while やります! ["var", "a"] , ["set", "a", 0] , ["while", ["eq", 0, 0] , ["set", "a", ["+", "a", 1]] ] こんな感じでやりたいのですが!! ["eq", 0, 0] の部分の eq が…

vm2gol v2 製作メモ(22) 組み込みの足し算

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 分岐ができたので次はループをやりたいですね。 簡単なところで、数を1ずつ増やしていくカウンタとか。 ["var", "a"] , ["set", "a", 0] , ["while" , ["eq", 0, 0] // 条件: 必ず真になるようにし…

vm2gol v2 製作メモ(21) case文

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 関数まわりが整備できたので、次は条件分岐(if文)やりましょうか。 えーと、こんな感じで…… ["if" , ["eq", 33, 31] , [ ["set_reg_a", 11] ] , [ ["set_reg_a", 22] ] ] こんな感じで作っていま…

vm2gol v2 製作メモ(20) 値を返却してローカル変数に代入 / return, call_set文

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 関数呼び出しができて、 ローカル変数が使えるようになって、 引数も渡せるようになりました。 あと関数まわりは返り値をどうにかすれば一通り必要なものが揃います。 今回は次の2つのステップに分…

vm2gol v2 製作メモ(19) 関数に引数を渡す

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 今回は関数の引数をやります。こんな感じで進めましょう。 引数を1個渡す 渡した引数をローカル変数に代入 引数を2個渡してローカル変数に代入 引数を1個渡す これを動かします。 // 19_func_arg.v…

vm2gol v2 製作メモ(18) ローカル変数の宣言と代入 / var, set文

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 今回はローカル変数の宣言と代入をやります。 ( アセンブリをやっていたときはループ、条件分岐、 それからサブルーチン〜という順番でやっていました。 それとは違う順番になっていますが、 特に…

vm2gol v2 製作メモ(17) main から別の関数を呼ぶ / call文

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 空の main 関数の実行の次は、 main から 別の関数の呼び出しをやってみましょう。 簡単そうですが、これも一歩ずつということで 2段階に分けます。 関数定義を並べるだけ(main からの呼び出しは…

vm2gol v2 製作メモ(16) 簡単なコード生成

目次ページに戻る / 前 / 次 前回からの差分をまとめて見る 条件分岐とループができて、 サブルーチンの呼び出しができて、引数が渡せて、 結果を返せて、ローカル変数が使えるようになった!!! ので、これくらい揃えばもうなんでもできるんじゃね!?!?…