vm2gol-v2

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

移植一覧に戻る やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、というレベルのものです。 github.com 移植元 memo88.hatenablog.com ベースになっているバージョン: tag:50 のあたり ただ、実質的には Perl版 からの移植です。 メモ P…

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

移植まとめに戻る やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、というレベルのものです。 github.com C♭は書籍 『ふつうのコンパイラをつくろう』の題材として作られた、C によく似た言語です。コンパイラ cbc は Java製。 移植元 m…

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

移植まとめに戻る 20年ぶりくらいに Perl のコードを書きました。 やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、というレベルのものです。 github.com 移植元 memo88.hatenablog.com ベースになっているバージョン: tag:49 のあたり …

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

移植一覧に戻る 20年ぶりくらいにC言語のコードを書きました。 かなり忘れてます。 やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、というレベルのものです。 github.com 移植元 memo88.hatenablog.com ベースになっているバージョン: …

vm2gol v2 (49) codegen_case を移植しやすいように変更

目次ページに戻る 前回からの差分をまとめて見る まずはしょぼいミスを修正……。 --- a/vgparser.rb +++ b/vgparser.rb @@ -478,7 +478,7 @@ if $PROGRAM_NAME == __FILE__ begin tree = parser.parse() - rescue ParseError => e + rescue Parser::ParseErro…

vm2gol v2 (48) 変数宣言のコード生成処理の改善など

目次ページに戻る 前回からの差分をまとめて見る Java版 を書いているときに codegen_stmts() の微妙なところに気付いてしまいました。 def codegen_stmts(fn_arg_names, lvar_names, stmts) alines = [] stmts.each do |stmt| stmt_head, *stmt_rest = stmt…

vm2gol-v2 移植まとめ

要件をゆるゆるにしてハードルを下げまくった初心者・入門者(=自分)向けの簡単・素朴で割といいかげんな自作言語のコンパイラ vm2gol-v2 の移植です。 ノリとしては zick さんの LISP Implementation Advent Calendar : ATND (2014年、 Wayback Machine …

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

移植一覧に戻る Java で書いてみました。やっつけなので汚いです。ライフゲームが動いたのでヨシ、というレベルのものです。 github.com 移植元 memo88.hatenablog.com ベースになっているバージョン: tag:47 のあたり メモ アセンブラ・VM は移植対象から外…

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

移植一覧に戻る Dart で書いてみました。やっつけなので汚いです。Dart よく知らないけどライフゲームが動いたのでヨシ、というレベルのものです。 github.com 移植元 memo88.hatenablog.com ベースになっているバージョン: tag:46 のあたり メモ アセンブラ…

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

移植一覧に戻る Python で書いてみました。やっつけなので汚いです。Python よく知らないけどライフゲームが動いたのでヨシ、というレベルのものです。 github.com 移植元 memo88.hatenablog.com ベースになっているバージョン: tag:45 のあたり メモ アセン…

vm2gol v2 (45) リファクタリング(主にVM)

目次ページに戻る 前回からの差分をまとめて見る 今回は(主に VM の)リファクタリングです。 テストが用意できたので、安心してサクサクと進められます。 Rubocop 関連 Rubocop の設定が古くなってると言われたので設定を修正して、新たに指摘された箇所を…

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で素朴な自作言語のコンパイラを作った

目次ページに戻る / 前 / 次 RubyでオレオレVMとアセンブラとコード生成器を2週間で作ってライフゲームを動かした話 の続きです。 このときスコープ外にしていたパーサ部分(高水準言語から構文木への変換部分)をやっと書きました。 3日くらいでできたので…

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コードです。 最終的にはグ…