[Codex] Consolidate Pytra automation TODO fixes - #8
Conversation
- Add Dart/Zig TupleUnpack and MultiAssign emitter handling for generated host code.\n- Fix sample parity runner argument drift against current runtime_parity_check CLI.\n- Record Top100 language coverage matrix and update Japanese TODO/progress notes.\n\nRelated IDs: P1-HOST-CPP-EMITTER-ZIG-S1, P2-TOP100-LANG-S1, P2-TOP100-LANG-S2.
Weekly sync staged safe changes under: docs, src, tools
|
補足説明です。PR 本文にも概要は書いていますが、差分が 65 files / +7796 / -682 と大きめなので、レビュー時に「どこで何を直したのか」を追いやすいよう、やや細かめに分解して書きます。 この PR の位置づけこの PR は、個別に出していた #6 / #7 相当の変更を一本化した統合 PR です。単一の小修正ではなく、Pytra の多言語 backend 作業を進めるための足場整備、host emitter の再接続、Top100 coverage の可視化、Go selfhost parity の実測更新をまとめています。 最終的な主眼は、Go emitter を Python 実装から生成するだけでなく、Go で selfhost した emitter binary が実際に fixture と sample を再変換し、その出力が Python 正本と一致する状態まで持っていくことです。今回の到達点として、Go selfhost は fixture 161/161 PASS、sample 18/18 PASS になりました。 大きく何をしたか
1. devcontainer と隔離検証環境
追加した主なものは以下です。
Dockerfile では Python 3.12 系をベースに、Pytra の backend / runtime parity で必要になる主要 toolchain をまとめて入れています。 Swift は Linux devcontainer では重いので optional 扱いにしており、標準 devcontainer には入れていません。Dart / Zig も今回の matrix 上では「host 生成は進んだが native CLI は未導入」という blocker として明示しています。 2. CLI / build pipeline の整理
具体的には、以下のような方向です。
この変更により、CLI 上の表記ゆれで build が落ちる問題を減らし、PowerShell 系や JS/TS 系の扱いを tests で固定しやすくしています。 3. runtime EAST 再生成 tool の分離
あわせて、以下の docs / metadata も更新しています。
これで、clone 直後の bootstrap 手順として 4. host emitter / 多言語 runtime 側の補強Go selfhost が主役ではありますが、周辺の host emitter と runtime も直しています。 Dart / Zig では、C++ emitter を Dart / Zig host として生成する流れで詰まっていた tuple unpack / multi assign 系の処理を補強しました。 PowerShell では、CLI runtime copy と runtime mapping / native helper を補強しました。 Lua / Ruby / C++ でも、mapping や runtime bridge、plain builtin fallback、emitter helper detection の調整を入れています。C++ については full sample sweep はまだ 7/18 PASS ですが、代表的な fixture / sample / stdlib parity を通すために plain builtin call を runtime helper 経路へ戻す修正を入れています。 5. Go selfhost の主な修正今回一番大きい差分は Go emitter 側では、主に以下を補強しています。
Go runtime 側では さらに、PNG/GIF sample parity の最後の blocker だった bytearray-mutating helper を直しています。Python では この変更により、sample の PNG/GIF artifact-size mismatch が解消し、Go selfhost sample parity が 18/18 PASS になっています。 6. Top100 language coverage の追加
生成物として以下を追加・更新しています。
coverage 表では、単に target が存在するかではなく、backend / syntax / defer / blocked などの分類、現状、blocker、次アクションを分けています。今回の更新で Go row は 7. TODO / progress docs の同期docs 側では、日本語 TODO を中心に、今回の実測結果に合わせて状態を更新しています。 主な更新は以下です。
PR 本文にも書いた通り、残件は「終わったこと」と「まだ blocker として残っていること」を混ぜないように分けています。Go sample の PNG/GIF mismatch は完了側へ移し、C++ sample 7/18 の残 blocker、Dart / Zig native CLI 未導入、Go stdlib selfhost sweep 未拡張は残件として残しています。 8. 追加・更新した tests今回の変更は emitter / runtime / CLI / docs generator にまたがるので、regression test もいくつか追加しています。 代表的な追加・更新は以下です。
特に 9. 実施した検証PR 作成時点では、以下のような検証を通しています。
レビュー時に見ていただきたい順番差分が大きいので、レビュー時は以下の順が追いやすいと思います。
残していることこの PR で全部を完了扱いにはしていません。次に残しているのは主に以下です。
以上です。PR 本文の概要よりもかなり細かく書くと、この PR は「Go selfhost parity を fixture/sample まで到達させるための emitter/runtime 修正」と「その作業を継続できる devcontainer・coverage・TODO・test の足場整備」をまとめたもの、という位置づけです。 |
概要
統合状況
大元向け PR はこの PR に一本化しました。この PR は #6 と #7 の範囲を包含し、その後の Go selfhost fixture/sample parity、Top100 coverage、automation 更新まで含む統合版です。旧 PR #6 / #7 はレビュー導線を一本化するため close 済みです。
この PR は Pytra の継続拡張ブランチです。自動化 TODO / Top100 coverage / devcontainer gate の整理に加えて、Go emitter を Go で selfhost したバイナリが fixture と sample を実際に再変換・実行し、Python 正本と parity 一致するところまで進めました。
今回の更新で
P7-GO-SELFHOST-RT-S1からS5までを完了扱いにしています。Go selfhost は fixture 161/161 PASS、sample 18/18 PASS です。主な変更
emit/goを含む実 emitter として動く経路を整備しました。src/toolchain/emit/go/cli.pyを selfhost 用の最小 CLI として強化し、manifest 入力、単体 EAST3 JSON 入力、runtime copy、Go target 制限を扱えるようにしました。isinstancenarrowing、None判定、union / container narrowing を selfhost 実行でも崩れない形に調整。Path,deque,zip,sum,min,max,time.perf_counter,math.*などの戻り型・builtin lowering を補強。py_to_list_typedなどが selfhost 生成コードから typed wrapper へ戻れるようにしました。clear()builtin ではなくdeleteloop に戻しました。_png_append/_gif_append型の bytearray-mutating helper を Go では戻り値で受けるようにし、PNG/GIF artifact-size parity を解消しました。ACTIVEに戻しています。根本原因
Go selfhost runtime は、Python emitter 実行時には曖昧なままでも通っていた
JsonVal/any/ container の型境界を、生成 Go の compile/run 時に厳密に踏み抜いていました。特にlist[unknown]へ広がる comprehension、constructor 戻り値がanyになる runtime import、tuple-return call の Go 表現、Path / str、deque()、sum(zip(...))、true division、min/maxが複合して fixture parity を止めていました。sample 側では compile/run blocker を解消した後、PNG/GIF の artifact-size mismatch が残っていました。原因は Go slice が値渡しであるにもかかわらず、Python の
dst.extend(src)型 helper を副作用だけの関数として Go に落としていた点でした。helper を[]byte戻り値として扱い、呼び出し側でdst = helper(dst, src)と受けることで Python 正本と同じ byte 列になりました。検証
python3 -m py_compile src/toolchain/emit/go/emitter.py tools/gen/gen_top100_language_coverage.py tools/unittest/toolchain2/test_linker_spec_conform2.py tools/run/run_selfhost_parity.pypython3 -m unittest tools.unittest.toolchain2.test_go_selfhost_ifexp_typing tools.unittest.toolchain2.test_go_emitter_cli_selfhostpython3 -m unittest tools.unittest.toolchain2.test_linker_spec_conform2.Toolchain2LinkerSpecConform2Tests.test_go_emitter_returns_mutated_bytearray_helperspython3 -m unittest tools.unittest.selfhost.test_run_selfhost_parity.RunSelfhostParityBuildTest.test_build_selfhost_binary_go_uses_go_emitter_cli_entrypython3 -m unittest tools.unittest.tooling.test_gen_top100_language_coveragetools.run.run_selfhost_parity._build_selfhost_binary("go")python3 tools/run/run_selfhost_parity.py --selfhost-lang go --cmd-timeout-sec 300=> fixture 161/161 PASSpython3 tools/run/run_selfhost_parity.py --selfhost-lang go --case-root sample --all-samples --cmd-timeout-sec 300=> sample 18/18 PASSpython3 tools/gen/gen_top100_language_coverage.py && python3 tools/gen/gen_top100_language_coverage.py --checkgit diff --check残件
min/max/enumeratefallback が残っています。