Feature/v0.17.2 - #39
Merged
Merged
Conversation
…17.2セルフホスティングstdlib整備計画を作成 RAII(スコープ末尾デストラクタ)でヒープ解放を自動化するUniquePtr<T>(単独所有・move専用、get/set/raw/release/reset/is_null)とSharedPtr<T>(参照カウント共有・明示clone、use_count)をコンパイラ変更なしのCm実装で追加した。 確保はstd::mem::alloc/dealloc経由でカスタムアロケータ差し替えが効く。対応はnative系(jit/native/wasm/uefi/baremetal)で、JS/TSはポインタ禁止(GC)・SVは対象外。 所有規律(移動はmove・共有はclone・所有型の返却はreturn move。暗黙コピーは二重解放)はプロトタイプ実測に基づき設計文書とチュートリアルja/enに明記した。 integrationテスト4件(unique基本・move移動/factory/関数渡し・shared clone/参照カウント/可視性・構造体ペイロード)をtests/common/stdlib/smartへ追加し、jit/native/wasmで検証した(platform: !js|sv)。 セルフホスティングに向けた標準ライブラリの棚卸しとv0.17.2計画(Arenaアロケータ・文字分類・数値parse集約・HashSet/TreeSet・Vector強化・fs行読み・Stopwatch・WeakPtr/Atomic版、および言語側課題としてdtor持ちstruct暗黙コピー警告とreturn move検出)をdocs/design/v0.17.2/selfhosting-stdlib.mdへまとめた。 スマートポインタの設計文書は実装完了としてdocs/archive/v0.17.1/へ収載した。新しい構文・キーワードは追加していないためVSCode拡張の変更はない。
スマートポインタはv0.17.1タグ後の実装のためv0.17.2の収載へ変更し、設計文書のarchive位置(archive/v0.17.2)と各所のバージョン表記を追従した。 リリース一覧にv0.17.2(開発中)を追加し、v0.17.1をリリース済み(2026-08-14)へ更新した。
標準ライブラリの追加・強化: - 集合型を追加: TreeSet<T>(平衡二分木=AVL木ベース・昇順走査対応)と HashSet<T>(ハッシュ表ベース・平均O(1)) - TreeMapへAVL削除(回転による平衡維持・空きスロット再利用)・keys_in_order(明示スタックの反復in-order走査)・clearを追加 - std::mem::arena を新設(バンプアロケータ・8バイト整列・チャンク自動拡張・reset一括解放、ベンチで個別alloc/dealloc比約4倍) - std::mem::smart へ WeakPtr(downgrade/upgrade/is_alive・循環参照の切断)と SharedPtr.reset()/weak_count() を追加し、smart.cm を smart/mod.cm へ再構成 - std::mem::smart::atomic を新設(AtomicSharedPtr<T>・参照カウントをアトミック命令で増減、native/jit専用) - std::strings::chars を新設(is_digit等の文字分類・to_upper/to_lower・digit_value(c, base)) - 数値解析を std::io から std::strings::parse へ移設し、基数指定版 parse_int_radix/parse_long_radix(2〜36進)を追加(io側は再エクスポートで互換維持) - Vectorへ reserve/last/sortBy(比較関数ソート)を追加、sortは挿入ソート化 - std::fs::read_lines(行単位読み・LF/CRLF対応)を追加 コンパイラバグ修正(新stdlibが最初の実利用者となり顕在化した潜在バグ、記録はdocs/archive/v0.17.2/): - フィールドレシーバのメソッド呼び出しが一時コピーに実行され変異が消える問題を修正(self引数処理へlower_placeによる場所化分岐を追加) - ジェネリック関数の関数ポインタ引数 int*(T, T) が型置換されずLLVM検証エラーになる問題を修正(正準API・mono側の両実装へFunction型再帰を追加) - ジェネリックメソッドが返す K[] スライスの要素幅がずれる問題を修正(mono特殊化でターミネータにも型置換を適用し、cm_slice_new/cm_array_to_sliceの要素サイズ定数を置換後の型から再計算) - ポインタ経由でしか参照されない構造体がプログラムDCEで削除されAOTだけ不正IRになる問題を修正(使用中struct収集を型ノードの再帰走査に変更) ライブラリバグ修正: - HashSetコンストラクタの二重解放(dtor持ちHashMapの暗黙コピー)による非決定的SIGABRTを修正し、所有権移動後のポインタ無効化で対処 - ユーザ定義Optionとの衝突がlibs内部の選択importの即時型検査で無関係なプログラムへ波及する問題を、ワイルドカードimportへの変更で回避 - JSバックエンドのスライスポインタ引数(K[]*)未対応をTreeMap走査の反復化で回避(バックエンド側は残課題として記録) テスト・ドキュメント: - 機能テスト(Set/TreeMap削除/chars/parse/Arena/Vector強化/fs行読み/WeakPtr/Atomic)とバグ修正回帰4件を追加 - パフォーマンステスト(HashSet 10000件スモーク・Arenaチャーン・TreeSet平衡性の高さ検証)とベンチマーク3本(TreeSet/HashSet/Arena)を追加 - チュートリアル(ja/en)へ集合・文字分類/数値解析ページを新設し、mem/treemap/vector/io/索引を更新 - リリースノートを完成させ、設計文書とバグ記録6件を docs/archive/v0.17.2/ へ移動 - 全スイート通過を確認: interpreter 742・llvm 783・js 682・sv 147・wasm 729・unit/regression VSCode拡張の更新は新構文の追加がないため非該当(ライブラリAPIの追加のみで文法・ハイライト対象の変更なし)
- TreeMap: AVL内部ヘルパー11個(rotate/alloc_node/insert_at/remove_at等)と全フィールド(keys/vals/left/right/height/free_slots/count/live/root)をprivate化 - HashMap: grow()とcap/sizeをprivate化(entriesはHashSetコンストラクタの所有権移動処理が直接触るためpublic維持を理由コメント付きで明記) - HashSet/TreeSet: 内包マップフィールドをprivate化 - Vector: data/size/capをprivate化 - Arena: grow()とhead/chunk_size/totalをprivate化 - UniquePtr: ptrをprivate化、AtomicSharedPtr: ptr/countをprivate化 - SharedPtr/WeakPtr/SharedCount/AtomicSharedCountのフィールドは相互構築(downgrade/upgrade)や制御ブロック共有で他型implから直接アクセスされるためpublic維持とし、理由コメントを追加(privateはimpl粒度の検査のため) - 全バックエンドスイートで通過を確認: interpreter 747・llvm 791・js 756・wasm 747(いずれもFailed 0) ライブラリ内部の可視性変更のみで公開APIと文法に変更はないため、チュートリアル・VSCode拡張・リリースノートの更新は非該当
…加、mono総称ヘルパー連鎖の型汚染を修正 充足度評価(native/jit)で見つかった不足の実装(P0=正しさ→P1=性能・欠落API→P2=周辺整備、計画docはarchive/v0.17.2/stdlib-hardening.md): P0(正しさ): - HashMap<string, V>はハッシュがkey as int(文字列では実質ポインタ値)のため実行時生成キーが外れる(実測2000件中ヒット1件)。キーを文字列に固定し内容ハッシュ(FNV-1a)で探索するStringMap<V>/StringSetを新設した(std::collections::strmap/strset) - スライスバックでdtorを持たない構造(dtor持ち暗黙コピー問題を構造的に回避)。密配列+墓石削除・スロット再利用・負荷率50%成長。実行時生成キー10000件全ヒットのパフォーマンステストで担保 - ジェネリックHashMap内での型分岐が現行言語で書けないこと(フリー関数オーバーロード非対応・__typename__(T)のmono時解決なし・デッドブランチが型検査不能)を実験で確認し、設計判断と言語側課題として記録 - std::strings::hashにhash_string(FNV-1a 32bit)を公開 - HashMap/HashSetはintキャスト可能キー専用の制約をヘッダ・チュートリアルに明記 P1(性能・欠落API): - std::strings::formatを新設: to_radix(2〜36進・負数・long最小値も正確)/to_hex/to_bin/to_oct/pad_left/pad_right(parseの逆方向。コード生成の16進出力・桁揃え用) - Vector.sort/sortByを挿入ソート(O(n²))からヒープソート(O(n log n)・in-place・非安定)へ変更し、スライス向けstd::slices(sort/sort_by)を新設。20000要素逆順のパフォーマンステストで担保 P2(周辺整備): - std::strings::internにInterner(文字列→一意id・name_of逆引き)を追加(シンボルテーブルの基礎部品) - 大出力の書き込み経路(StringBuilder一括→write_fileとBufWriter逐次追記)のパフォーマンステストを追加 コンパイラバグ修正(6件目・記録はarchive/v0.17.2/bugfix-mono-generic-helper.md): - importモジュール内の総称free関数から総称ヘルパーを呼ぶとint版が呼ばれソートが無言で無効になる問題を修正 - 真因は総称本体スキャンの推論不能→既定intの偽特殊化リクエストと、生成直後の即時書き換えによるclone前本体の汚染、特殊化名の辞書順による発現(同一ファイルでは偶然無事) - mono不動点ループで総称本体をスキャン対象から外した(呼び出し元の特殊化後に正しい実型で要求される既存機構に委ねる) テスト・ドキュメント: - 機能テスト8件(strmap/strset/hash/format/intern/slices sort/総称ヘルパー連鎖回帰)とパフォーマンステスト3件(strmap 10000件・ソート20000件・書き込み8000行×2経路)を追加 - チュートリアル(ja/en)へStringMap/StringSet・format/hash/intern・ソート変更を反映、リリースノートへ新機能5節とバグ修正1節を追記 - 全スイート通過: interpreter 757・llvm 801・js 766・wasm 757・sv 147・unit/regression VSCode拡張の更新は新構文の追加がないため非該当(ライブラリAPIの追加のみ)
Contributor
There was a problem hiding this comment.
Pull request overview
v0.17.2 向けにセルフホスティングを見据えた標準ライブラリ拡充(スマートポインタ/Arena/集合/文字列ユーティリティ等)を追加し、それに伴い顕在化したコンパイラ不具合(MIR mono・DCE・型置換・フィールドレシーバ)を修正、広範な回帰テスト・ドキュメント・リリースノート・バージョン更新を行うPRです。
Changes:
- 標準ライブラリの新規モジュール追加/拡張(mem smart/arena、collections set/strmap、strings chars/parse/format/hash/intern、slices sort 等)
- コンパイラ内部の修正(型パラメータ置換、MIR mono の特殊化/型置換、AOT DCE の使用struct収集、フィールドレシーバ呼び出し lowering)
- 新機能・バグ修正に対応する大量の回帰テスト/ベンチマーク/チュートリアル/リリースノート更新と v0.17.2 へのバージョン更新
Reviewed changes
Copilot reviewed 132 out of 132 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| vscode-extension/package.json | VSCode拡張のバージョンを0.17.2へ更新 |
| VERSION | リポジトリバージョンを0.17.2へ更新 |
| tests/common/structs/ptr_only_struct.expect | プログラムDCE回帰テストの期待出力追加 |
| tests/common/structs/ptr_only_struct.cm | ポインタ経由のみ参照されるstructのDCE回帰テスト追加 |
| tests/common/structs/field_receiver.expect | フィールドレシーバ回帰テストの期待出力追加 |
| tests/common/structs/field_receiver.cm | フィールドレシーバ変異が反映される回帰テスト追加 |
| tests/common/stdlib/strings/parse_radix.expect | parse_radixテストの期待出力追加 |
| tests/common/stdlib/strings/parse_radix.cm | strings::parse(基数指定含む)機能テスト追加 |
| tests/common/stdlib/strings/intern_basic.expect | internerテストの期待出力追加 |
| tests/common/stdlib/strings/intern_basic.cm | strings::intern 機能テスト追加 |
| tests/common/stdlib/strings/hash_fnv.expect | hash_stringテストの期待出力追加 |
| tests/common/stdlib/strings/hash_fnv.cm | strings::hash(FNV-1a)機能テスト追加 |
| tests/common/stdlib/strings/format_radix.expect | formatテストの期待出力追加 |
| tests/common/stdlib/strings/format_radix.cm | strings::format(基数/パディング/境界)テスト追加 |
| tests/common/stdlib/strings/chars_classify.expect | chars分類テストの期待出力追加 |
| tests/common/stdlib/strings/chars_classify.cm | strings::chars 機能テスト追加 |
| tests/common/stdlib/smart/weak.expect | WeakPtrテストの期待出力追加 |
| tests/common/stdlib/smart/weak.cm | WeakPtr downgrade/upgrade/reset 連動テスト追加 |
| tests/common/stdlib/smart/unique.expect | UniquePtrテストの期待出力追加 |
| tests/common/stdlib/smart/unique.cm | UniquePtr 基本操作/所有権操作テスト追加 |
| tests/common/stdlib/smart/struct_payload.expect | スマートポインタ構造体payloadテスト期待出力追加 |
| tests/common/stdlib/smart/struct_payload.cm | UniquePtr/SharedPtrの構造体payload操作テスト追加 |
| tests/common/stdlib/smart/shared.expect | SharedPtrテストの期待出力追加 |
| tests/common/stdlib/smart/shared.cm | SharedPtr clone/use_count/段階解放テスト追加 |
| tests/common/stdlib/smart/move_transfer.expect | move所有権移動テストの期待出力追加 |
| tests/common/stdlib/smart/move_transfer.cm | UniquePtrのmove代入/関数渡し/return moveテスト追加 |
| tests/common/stdlib/smart/atomic_shared.expect | AtomicSharedPtrテストの期待出力追加 |
| tests/common/stdlib/smart/atomic_shared.cm | AtomicSharedPtr(単一スレッド機能)テスト追加 |
| tests/common/stdlib/slices/sort.expect | slices sortテスト期待出力追加 |
| tests/common/stdlib/slices/sort.cm | std::slices sort/sort_by 機能テスト追加 |
| tests/common/stdlib/slices/sort_load.expect | sort負荷テスト期待出力追加 |
| tests/common/stdlib/slices/sort_load.cm | 20000要素ソートのパフォーマンススモーク追加 |
| tests/common/stdlib/mem/arena_churn.expect | arenaチャーンテスト期待出力追加 |
| tests/common/stdlib/mem/arena_churn.cm | Arenaの大量確保/reset再利用のスモーク追加 |
| tests/common/stdlib/mem/arena_alloc.expect | arena基本テスト期待出力追加 |
| tests/common/stdlib/mem/arena_alloc.cm | Arenaの基本確保/整列/拡張/resetテスト追加 |
| tests/common/stdlib/fs/write_perf.expect | fs書き込み性能テスト期待出力追加 |
| tests/common/stdlib/fs/write_perf.cm | 大量出力のwrite_file/BufWriterスモーク追加 |
| tests/common/stdlib/fs/lines.expect | read_linesテスト期待出力追加 |
| tests/common/stdlib/fs/lines.cm | std::fs::read_lines の機能テスト追加 |
| tests/common/stdlib/core/parse_option_test.cm | parse系import移設に追随(strings::parseへ) |
| tests/common/stdlib/collections/vector_enhance.expect | Vector拡張テスト期待出力追加 |
| tests/common/stdlib/collections/vector_enhance.cm | Vector reserve/last/sortBy のテスト追加 |
| tests/common/stdlib/collections/treeset_basic.expect | TreeSet基本テスト期待出力追加 |
| tests/common/stdlib/collections/treeset_basic.cm | TreeSet insert/contains/remove/values_in_order テスト追加 |
| tests/common/stdlib/collections/treeset_balance.expect | TreeSet平衡性テスト期待出力追加 |
| tests/common/stdlib/collections/treeset_balance.cm | AVL高さ上界の決定的検証テスト追加 |
| tests/common/stdlib/collections/treemap_remove.expect | TreeMap remove/clearテスト期待出力追加 |
| tests/common/stdlib/collections/treemap_remove.cm | TreeMap削除/順序/clear/再利用テスト追加 |
| tests/common/stdlib/collections/strset_basic.expect | StringSetテスト期待出力追加 |
| tests/common/stdlib/collections/strset_basic.cm | StringSet基本操作テスト追加 |
| tests/common/stdlib/collections/strmap_load.expect | StringMap負荷テスト期待出力追加 |
| tests/common/stdlib/collections/strmap_load.cm | StringMap大量挿入/全ヒット/削除スモーク追加 |
| tests/common/stdlib/collections/strmap_basic.expect | StringMap基本テスト期待出力追加 |
| tests/common/stdlib/collections/strmap_basic.cm | StringMap挿入/上書き/墓石再利用/成長/keys順テスト追加 |
| tests/common/stdlib/collections/hashset_load.expect | HashSet負荷テスト期待出力追加 |
| tests/common/stdlib/collections/hashset_load.cm | HashSet大量操作スモーク(回帰)追加 |
| tests/common/stdlib/collections/hashset_basic.expect | HashSet基本テスト期待出力追加 |
| tests/common/stdlib/collections/hashset_basic.cm | HashSet基本操作テスト追加 |
| tests/common/generics/slices/method_return.expect | ジェネリックslice返却回帰テスト期待出力追加 |
| tests/common/generics/slices/method_return.cm | ジェネリックメソッドのK[]要素幅回帰テスト追加 |
| tests/common/generics/functions/module_helper_chain.expect | 総称ヘルパー連鎖回帰テスト期待出力追加 |
| tests/common/generics/functions/module_helper_chain.cm | importモジュール内総称連鎖の回帰テスト追加 |
| tests/common/generics/functions/fnptr_param.expect | 関数ポインタ引数回帰テスト期待出力追加 |
| tests/common/generics/functions/fnptr_param.cm | ジェネリック関数/メソッドの関数ポインタ引数回帰テスト追加 |
| tests/benchmarks/cm/10_arena_vs_alloc.cm | Arena vs alloc/dealloc ベンチ追加 |
| tests/benchmarks/cm/09_hashset_ops.cm | HashSet ops ベンチ追加 |
| tests/benchmarks/cm/08_treeset_ops.cm | TreeSet ops ベンチ追加 |
| src/internal/syntax/ast/types.cpp | AST型置換で関数型param/returnも再帰置換 |
| src/internal/mir/passes/cleanup/program_dce.cpp | AOT Program DCEの使用struct収集を型再帰走査に拡張 |
| src/internal/mir/lowering/mono/specialize.cpp | mono特殊化でターミネータ型置換+slice elem_size再計算 |
| src/internal/mir/lowering/mono/internal.cpp | mono側型置換でFunction型param/return再帰を追加 |
| src/internal/mir/lowering/mono/driver.cpp | 総称本体スキャン回避で偽特殊化汚染を防止 |
| src/internal/mir/lowering/expr/call.cpp | フィールド等のレシーバをplace化して実体参照を渡す修正 |
| libs/std/strings/parse.cm | strings::parse新設(移設+基数指定版追加) |
| libs/std/strings/mod.cm | stringsモジュールのexport拡充(chars/parse/hash/format/intern等) |
| libs/std/strings/intern.cm | Interner(文字列interning)追加 |
| libs/std/strings/hash.cm | 文字列内容ハッシュ(FNV-1a)追加 |
| libs/std/strings/format.cm | to_radix/to_hex/pad等のフォーマット追加 |
| libs/std/strings/chars.cm | ASCII文字分類/変換+digit_value追加 |
| libs/std/slices/mod.cm | スライスのheap sort(sort/sort_by)追加 |
| libs/std/mem/smart/mod.cm | UniquePtr/SharedPtr/WeakPtr 実装追加 |
| libs/std/mem/smart/atomic.cm | AtomicSharedPtr 実装追加 |
| libs/std/mem/arena.cm | Arenaアロケータ実装追加 |
| libs/std/io/console/input.cm | parse系をstrings::parseへ移設し再エクスポート維持 |
| libs/std/fs/mod.cm | std::fs::read_lines を追加 |
| libs/std/collections/vector.cm | Vector reserve/last/sortBy追加+sortをO(n log n)化 |
| libs/std/collections/treeset.cm | TreeSet実装追加(TreeMapラッパー) |
| libs/std/collections/treemap.cm | TreeMap remove/keys_in_order/clear+free list再利用追加 |
| libs/std/collections/strset.cm | StringSet実装追加(StringMapラッパー) |
| libs/std/collections/strmap.cm | StringMap実装追加(内容ハッシュ) |
| libs/std/collections/mod.cm | collections export拡充(set/strmap等) |
| libs/std/collections/hashset.cm | HashSet実装追加(HashMapラッパー) |
| libs/std/collections/hashmap.cm | HashMapにキー制約注記+フィールド可視性調整 |
| docs/tutorials/ja/stdlib/strings/chars-parse.md | strings新機能(chars/parse/format/hash/intern)チュートリアル追加 |
| docs/tutorials/ja/stdlib/mem.md | smart pointers/Arenaの日本語チュートリアル追加 |
| docs/tutorials/ja/stdlib/json.md | ナビゲーション更新(setsページ追加に追随) |
| docs/tutorials/ja/stdlib/io.md | read_lines項目をドキュメントへ追加 |
| docs/tutorials/ja/stdlib/index.md | stdlib一覧へv0.17.2機能を反映 |
| docs/tutorials/ja/stdlib/collections/vector.md | Vector拡張(reserve/last/sortBy等)を追記 |
| docs/tutorials/ja/stdlib/collections/treemap.md | TreeMap remove/keys_in_order/clear等を追記 |
| docs/tutorials/ja/stdlib/collections/sets.md | TreeSet/HashSetチュートリアル追加 |
| docs/tutorials/ja/stdlib/collections/hashmap.md | StringMap節追加+文字列キー制約を明記 |
| docs/tutorials/ja/index.md | チュートリアルの対象/更新バージョンを0.17.2へ更新 |
| docs/tutorials/ja/compiler/wasm/index.md | バージョン表記を0.17.2へ更新 |
| docs/tutorials/ja/compiler/native/uefi.md | 対象バージョンを0.17.2へ更新 |
| docs/tutorials/ja/compiler/native/index.md | バージョン表記を0.17.2へ更新 |
| docs/tutorials/ja/compiler/js/index.md | テスト結果セクションのバージョン表記更新 |
| docs/tutorials/ja/basics/index.md | ナビゲーションのバージョン表記更新 |
| docs/tutorials/en/stdlib/strings/chars-parse.md | strings新機能の英語チュートリアル追加 |
| docs/tutorials/en/stdlib/mem.md | smart pointers/Arenaの英語チュートリアル追加 |
| docs/tutorials/en/stdlib/collections/treemap.md | TreeMap拡張の英語ドキュメント更新 |
| docs/tutorials/en/stdlib/collections/sets.md | TreeSet/HashSet英語チュートリアル追加 |
| docs/tutorials/en/index.md | チュートリアルの対象/更新バージョンを0.17.2へ更新 |
| docs/tutorials/en/compiler/native/uefi.md | 対象バージョンを0.17.2へ更新 |
| docs/tutorials/en/compiler/js/index.md | テスト結果セクションのバージョン表記更新 |
| docs/tutorials/en/basics/index.md | ナビゲーションのバージョン表記更新 |
| docs/releases/v0.17.2.md | v0.17.2リリースノート新規追加 |
| docs/releases/README.md | リリース一覧へv0.17.2を追加 |
| docs/releases/index.md | リリース一覧へv0.17.2を追加 |
| docs/index.md | 最終更新バージョン表記を0.17.2へ更新 |
| docs/en/index.md | Last Updated表記を0.17.2へ更新 |
| docs/design/index.md | v0.17.2設計文書(アーカイブ)への索引追加 |
| docs/archive/v0.17.2/stdlib-hardening.md | stdlib補強計画のアーカイブ文書追加 |
| docs/archive/v0.17.2/smart-pointers.md | スマートポインタ設計のアーカイブ文書追加 |
| docs/archive/v0.17.2/selfhosting-stdlib.md | セルフホスティング向けstdlib計画のアーカイブ追加 |
| docs/archive/v0.17.2/bugfix-option-namespace-collision.md | Option衝突問題の記録追加 |
| docs/archive/v0.17.2/bugfix-mono-generic-helper.md | 総称ヘルパー汚染バグ修正記録追加 |
| docs/archive/v0.17.2/bugfix-js-slice-pointer-arg.md | JSのスライスポインタ制限の記録追加 |
| docs/archive/v0.17.2/bugfix-hashset-double-free.md | HashSet二重解放の記録追加 |
| docs/archive/v0.17.2/bugfix-generic-mir.md | ジェネリック/MIR関連バグ修正記録追加 |
| docs/archive/v0.17.2/bugfix-aot-struct-dce.md | AOT DCEのstruct誤削除バグ修正記録追加 |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
v0.17.2で整備した標準ライブラリの実証として、Cmで書いたCmソースの宣言レベルパーサを追加した。 動作: - コンパイル可能な構文なら各種定義一覧(module/import/use/typedef/const/struct/enum/impl/関数)を出力する - 構文エラーならエラー箇所(メッセージ・ファイル:行:桁・キャレット付きソース行)を出力して終了コード1を返す - 失敗し得る解析関数はすべてOption型で失敗を伝播し、診断(メッセージ/行/桁)はLexer/Parser状態に保持する(最初のエラーのみ保持) 構成(機能・定義ごとにファイル分割): - token.cm(トークン種別+TokenStream)/ lexer.cm(字句解析・StringSetキーワード表・::融合・コメント/文字列/文字/数値) - parser/state.cm(状態・基本操作・レコーダ)/ modules.cm(module/import/use)/ types.cm(struct/enum・ネスト型・無名宣言子)/ impls.cm(impl/interface・self/~self/private/static)/ funcs.cm(関数/typedef/const/extern)/ decl.cm(ディスパッチ) - 各ファイルに#[test]ディレクティブの単体テスト(*_test.cm・8ファイル38テスト)を付属 検証: - パーサ自身の全9ソースを自己解析できることを確認 - 正常サンプル(全宣言種別)とエラーサンプル(メソッド本体欠落を13行目として報告)を同梱 - CI(check_examples.sh)へ単体テスト・正常/エラーサンプル・自己解析の検証を追加(sample_error.cmは意図的に不正なためcm check対象から除外) 計画doc・チュートリアル・VSCode拡張は非該当(言語機能の追加ではなくサンプル実装のため。examples/README.mdとリリースノートのサンプル節で案内)
フラットに置かれていたモジュールを処理段階ごとのディレクトリへ再配置した: - lexer/(token.cm=トークン定義・scan.cm=字句解析器、旧lexer.cmを改名) - parser/state.cm(解析器の状態・基本操作) - parser/decl/(宣言種別ごとの解析: modules・types・impls・funcs・dispatch、旧decl.cmはディレクトリ名との重複を避けdispatch.cmへ改名) - samples/(ok.cm・error.cm、旧sample_*.cmはフォルダ名の重複を避け改名) - 各*_test.cmは対象モジュールと同じディレクトリへ同伴 モジュール宣言(module lexer.scan等)と相対importを新パスへ追従し、READMEのディレクトリ構成表とCI(check_examples.sh)の単体テスト・サンプル・自己解析パスを更新した。 再配置後も全単体テスト38件・正常/エラーサンプル・自己解析9ファイルの通過を確認済み
- エラーメッセージをdiag/messages.cmへ分離(Cmコンパイラのi18nメッセージ表と同様に文面をロジックから一元化。テストも同じビルダーを参照するため文面変更に自動追従) - トークン種別をint定数からenum TokenKind(Eof/Ident/Keyword/Number/StringLit/CharLit/Symbol)へ変更し、TokenStreamの格納・比較も型付きにした - キーワード定義をstring[]リテラルの一覧宣言とStringSetへの登録ループに分離した - 字句解析のバイト値マジックナンバーを全廃し、文字リテラルのキャスト(const int BYTE_LF = '\n' as int等)による定数定義へ置き換えた。main.cmの表示幅・基数も定数化 - テストを38件から56件へ拡充: キーワード前方一致の識別子判定・単独コロン・空入力・エスケープ付き文字リテラルの桁追跡・最初のエラー保持・EOFでのexpect・空struct/末尾カンマenum・フィールド属性・overloadコンストラクタ・空impl・関数ポインタ引数の括弧対応・非constグローバル・再エクスポート宣言列・2宣言目のエラー位置・メッセージカタログ整合 - 検証: 全56テスト・正常/エラーサンプル・自己解析・CI 3項目すべて通過
- Cmコンパイラ本体と同じ構成(enum MsgId×enum Langの2次元テンプレート表)でdiag/messages.cmを再構成した
- テンプレートは{0}〜{2}プレースホルダを持つ完結した1文とし、語順が言語ごとに異なるため断片連結による文組み立てを廃止した(msgf1/msgf2/msgf3が置換で埋める)
- 言語は環境変数CM_LANGで切替(ja=日本語、既定は英語)。日本語は語順に合わせてプレースホルダ位置を入れ替えたテンプレートを持つ
- main.cmの見出し(構文エラー/字句エラー/ファイル不在)もカタログ経由へ統一した
- diag/messages_test.cmを追加(既定英語・CM_LANG=ja切替・言語ごとの語順・見出しのローカライズ、4テスト)し、CIの単体テスト対象へ組み込んだ(計9ファイル60テスト)
- READMEへi18n構成とCM_LANG=jaの実行例を追記
- diag/messages.cmのテンプレート表: 言語→IDの二重if連鎖をmatch (Lang)×match (MsgId)の二段matchへ変更(網羅が構文上明示され、ID追加漏れが読み取りやすくなる)
- parser/decl/dispatch.cmの宣言分岐: 先頭字句の12連ifをswitch (p->text())のcase("struct")等へ変更
- lexer/scan.cmのバイト分岐はifを維持し、理由をコメントで明記(switchのcase(const変数)は現状値が解決されず全て0として重複caseの誤コンパイルになるため、リテラル以外をcaseに使えない。範囲判定・2バイト先読みもifが適切)
- 全60テスト・正常/エラーサンプル・CM_LANG=ja出力・自己解析・CI 3項目の通過を確認
…加時に対訳を並べて管理できる構成にする)
…テラル1つで全対訳を管理。添字はLangのタグ値で、対訳未整備の言語は英語へフォールバック)
…e-extension-installは非推奨エイリアスとして案内メッセージ付きで残す)
wrap_long_linesの折り返し候補はカンマ直後と二項演算子直前のみで、文レベルのメソッドチェーンが最大行幅を超えると最後の呼び出しの引数リスト内カンマで折れてチェーン構造が読めない整形になっていた。 .method(...)の呼び出しが2つ以上連なる超過行は、カンマ・演算子折り返しより優先して各チェーンの.直前で折り返すようにした(TypeScript/Prettier風・継続行1段インデント)。 フィールド参照の.や数値リテラルの小数点、括弧内のチェーンは候補にせず、折り返し後もなお長いセグメントは再帰適用でカンマ折り返しへ委ねる(各セグメントのチェーン.は高々1つなので停止する)。 回帰テスト(wrap/method_chain: チェーン折り返し・フィールド参照のみの行は従来のカンマ折り返し・冪等性)とチュートリアル(ja/en 2.2.1節)・リリースノートを追加し、設計文書はarchiveへ収めた。 VSCode拡張は構文追加がないため対象外。
引数数ごとのmsgf1/msgf2/msgf3は本質的に同じ置換処理の重複で、msgf3はチェーン式の折り返しも読みにくかった。
C++側i18n::msgfと同じ方式で、テンプレート中の{i}をargsの各要素で順に置換するmsgf(MsgId, string[]) 1本に統一し、診断ビルダーは配列リテラルで呼び出す形にした。
プレースホルダ番号はstd::strings::formatのto_radixで組み立てるため引数数の上限がない。
新フォーマッタ適用で100バイト超のテンプレート対訳配列は1要素1行へ展開した。cm test(diag/messages_test 4件)とscripts/ci/check_examples.shの通過を確認済み。
チュートリアル・VSCode拡張は例の内部整理のため対象外。
msg_expected等の診断ビルダーはmsgfへの引数固定だけの薄い転送で、msgf(MsgId, string[])一本化後は不要になった。 ビルダーを全廃し、呼び出し側がmsgf(MsgId::ExpectedButFound, [expected, found])のようにIDと引数配列を直接渡す形に統一した(MsgIdのenumコメントがプレースホルダ対応を文書化する)。 また各モジュールの隣に並んでいた*_test.cmはフォルダを雑然とさせるため、tests/フォルダへ集約して相対importを張り替えた(対象モジュール名+_test.cmで命名)。 scripts/ci/check_examples.shはtests/配下のグロブ実行へ変更し、README・リリースノートを追従した。全60テスト・正常/エラーサンプル・自己解析の通過を確認済み。 チュートリアル・VSCode拡張は例の内部整理のため対象外。
O_WRONLY|O_CREAT|O_TRUNCとしてmacOS/BSD固有値0x0601を直書きしており、LinuxではO_CREAT(0x0040)が立たずopenが失敗していた(CIのubuntuでcommon/stdlib/fs/write_perfがjit/nativeともにOutput mismatch)。 libs/native/io/file.cmのwrite_fileは#ifdef __linux__でLinux値0x0241へ分岐し、write_perfテストはwrite_fileで空ファイルを先に作成して両OS同値のO_WRONLY(=1)だけでopenする移植可能な形へ修正した。 jit/nativeの実行と期待値一致をローカル(macOS)で確認済み。バグ修正のためチュートリアル・VSCode拡張は対象外。
interpreterスイート(MIRインタプリタ・O3)はjit系ジョブと検証範囲が重複するため、CIのジョブ数削減として統合テストmatrixから外した。 ローカルのmake testには引き続き含まれ、必要になれば1行の復元で戻せる。 CI構成変更のためテスト・チュートリアル・VSCode拡張は対象外。
Cmの採用判断・設計判断の材料として、C++・Rustに対する現状評価をliving documentとして整理した。 マルチバックエンド出力(特にSV/HDL)とツールチェーン一体型を強みに、メモリ安全性の静的保証の不在・ジェネリクスの表現力制約・エコシステム不在をデメリットとして、リポジトリ内の記録(二重解放バグ・StringMap設計経緯・ロードマップ)へのリンク付きで記載した。 docs/design/index.mdのliving documents表へ掲載。ドキュメント追加のためテスト・チュートリアル・VSCode拡張・リリースノートは対象外。
構造体代入は浅いコピーのため、デストラクタ持ち構造体を値でコピーすると両方のインスタンスでdtorが走り二重解放になる(HashSetコンストラクタで実際に発生した非決定的SIGABRTの真因。bugfix-hashset-double-free.mdの設計課題)。 受理サイト(let初期化・代入・return・構造体リテラルのフィールド初期化)でmoveなしの場所式コピーを検出するcheck_dtor_copy_policyを追加した(通常は警告、--strictではエラー。Z5縮小変換と同じ段階導入方式)。 dtor持ち型はimpl登録時にベース名を記録し、typedef解決・ジェネリック特殊化サフィックス・名前空間修飾を剥いで判定する。一時値(コンストラクタ・メソッド戻り値)とdtor無し構造体は対象外。 move代入(self.f = move x)は既存のmove機構(HIRのis_moved_from→MIRのdtor登録解除)で機能することを実験で確認し、HashSetコンストラクタのポインタ手動無効化の回避策をself.map = move mへ置き換えた。 回帰テスト(dtor_copy_diag: 4サイト警告・move/一時値/dtor無しの非警告)と統合テスト(destructor/move_assign: dtorが移動先の1回だけ走る)を追加し、libs/tests/examples全ツリーで新規警告ゼロを確認した。 チュートリアル(ja/en ownership)・リリースノート・言語比較ドキュメントを更新し、設計文書はarchiveへ収録、バグ記録のフォローアップ節を実装済みへ更新した。 VSCode拡張は新構文なし(moveは既存キーワード)のため対象外。
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 188 out of 188 changed files in this pull request and generated 1 comment.
Suppressed comments (2)
libs/std/collections/hashmap.cm:22
- The comment says
entriesis public because HashSet's constructor needs to null it out, but HashSet now usesmoveand no longer touchesentriesdirectly. This rationale is outdated/misleading; please update the comment (or remove it).
examples/README.md:40 - Typo in the section title: "宣言リスタ" should be "宣言リスト".
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cm v0.17.2 リリースノート
前バージョン: v0.17.1
各項目は「何が問題だったか→どうなったか」の要約です。
🎯 テーマ: セルフホスティング向け標準ライブラリ整備
Cmコンパイラ自身をCmで記述するための土台として、コンパイラ実装が要求する標準ライブラリを整備する(設計文書)。
✨ 新機能
スマートポインタ(std::mem::smart — UniquePtr / SharedPtr)
ヒープ確保した値の解放を自動化する手段がなく、
alloc/deallocの手動対応が必要だった。コンパイラ変更なしのセルフホストライブラリ(Cm実装)として、RAIIベースのスマートポインタを追加した。
get/set/raw/is_null、UniquePtrはrelease/reset、SharedPtrはclone/use_count。std::mem::alloc/dealloc経由でカスタムアロケータ差し替えが効く。b = a;)は両dtorが走り二重解放になるため、移動はmove・共有はclone()・所有型の返却はreturn moveを必須とする。WeakPtr - 弱参照(std::mem::smart)
SharedPtrだけでは相互参照する構造(親子リンク等)が参照カウントの循環で解放されなかった。
SharedPtr.downgrade()で作る弱参照WeakPtr<T>を追加し、循環参照を切断できるようにした。is_alive/upgrade/clone。制御ブロックはstrong=0でペイロード解放後もweakが残る限り維持され、最後のWeakPtr破棄で解放される。weak_count()とreset()を追加した(moveはエイリアスで破棄タイミングが移動元スコープ末尾のため、決定的に手放す手段としてreset()を使う)。AtomicSharedPtr - スレッド安全な参照カウント(std::mem::smart::atomic)
SharedPtrの参照カウントは非アトミックで、clone済みインスタンスを別スレッドへ渡すと増減が競合し得た。
参照カウントの増減をアトミック命令(ネイティブC++ランタイムの
<atomic>)で行うAtomicSharedPtr<T>を追加した。API・所有規律はSharedPtrと同一で、対応はnative/jitのみ(ペイロード自体の同期は別途Mutex等で守る)。
Arenaアロケータ(std::mem::arena)
短命な大量オブジェクト(パーサのAST等)を1件ずつ
alloc/deallocすると管理コストが支配的だった。「まとめて確保・まとめて解放」のバンプアロケータ
Arenaを追加した(ベンチマークで個別alloc/dealloc比 約4倍)。allocated_bytes()で総確保バイトを取得できる。集合型 TreeSet / HashSet(std::collections)
重複しない値の集まりを扱うには
TreeMap/HashMapへダミー値を詰める必要があった。順序付き集合
TreeSet<T>(平衡二分木=AVL木ベース)と順序なし集合HashSet<T>(ハッシュ表ベース)を追加した。insert/contains/remove/len/is_empty/clear/values_in_order(全てO(log n)・走査はO(n))。insert/contains/removeを提供する。TreeMapの削除・順序走査・clear(std::collections::treemap)
TreeMapは挿入・探索のみで、削除や全キーの順序取得ができなかった。
AVL削除(回転による平衡維持)・in-order走査・clearを追加した。
remove(key): 葉・子1・子2の全ケースをO(log n)で削除し、空きスロットはfree listで再利用する。keys_in_order(): 全キーを昇順のK[]で返す。clear(): 全要素を削除する。文字分類(std::strings::chars)
字句解析に必要な文字種判定が標準ライブラリになく、セルフホスティングの前提を満たせなかった。
is_digit/is_alpha/is_alnum/is_space/is_upper/is_lower/is_hex_digit/is_ident_start/is_ident_continue/to_upper/to_lower/digit_value(c, base)を追加した。数値解析の移設と基数対応(std::strings::parse)
parse_int等の数値解析が入出力モジュール(std::io)に同居しており、文字列処理として独立していなかった。std::strings::parseへ移設し、基数指定版parse_int_radix/parse_long_radix(2〜36進)を追加した。import std::io::*;経由の既存コードは再エクスポートで引き続き動作する。Vectorの強化(reserve / last / sortBy)
Vectorは容量の事前確保・末尾参照・任意順序のソートができなかった。
reserve(n)(縮小なしの事前拡張)・last()(popせず末尾参照)・sortBy(cmp)(比較関数int*(T, T)によるソート)を追加した。文字列キーの連想配列と集合 StringMap / StringSet(std::collections)
HashMap<string, V>はハッシュがkey as int(文字列では実質ポインタ値)のため、実行時生成キーのルックアップが外れる正しさ問題があった(実測2000件中ヒット1件。リテラル同士はintern共有で偶然一致するため既存テストでは顕在化しない)。キーを文字列に固定し内容ハッシュ(FNV-1a)で探索する
StringMap<V>/StringSetを追加した(設計判断の記録)。insert/get/get_or/contains/remove/len/is_empty/clear/keys_in_order(StringSetは values_in_order)。__typename__(T)のmono時解決なし)、言語側の設計課題として記録した。文字列の内容ハッシュ(std::strings::hash)
export int hash_string(string s)— FNV-1a 32bitの内容ハッシュ(非負int)。StringMap/Internerの基礎部品で、単体でも利用できる。数値→基数文字列(std::strings::format)
数値解析(parse)の逆方向が無く、コード生成の16進出力・桁揃えができなかった。
to_radix(v, base)(2〜36進・負数対応・long最小値も正確)・to_hex/to_bin/to_oct・pad_left/pad_rightを追加した。ソートのO(n log n)化とスライスソート(std::slices / Vector)
Vectorのsort/sortByは挿入ソート(O(n²))で大規模入力に弱く、スライスにはソートAPI自体が無かった。
両者をヒープソート(in-place・追加確保なし・非安定)へ統一し、スライス向けに
std::slicesを新設した。20000要素の逆順ソート(挿入ソートでは約2億比較で退化する規模)のパフォーマンステストで担保する。
文字列interning Interner(std::strings::intern)
コンパイラのシンボルテーブルの基礎部品として、同一内容の文字列へ一意な整数idを割り当てる
Internerを追加した(intern/contains/name_of/len)。idの比較は整数比較になり、
name_ofで内容を引き戻せる。ファイルの行読み(std::fs::read_lines)
ファイルを行単位で処理するには
read_file+linesの組み合わせを毎回書く必要があった。read_lines(path)を追加した(LF/CRLF対応・失敗時は空スライス)。dtor持ち構造体の暗黙コピー診断とmove代入
構造体代入は浅いコピーのため、デストラクタ持ち構造体を値でコピーすると両方のインスタンスでdtorが走り二重解放になる(HashSetコンストラクタで実際に発生した非決定的SIGABRTの真因。設計文書)。
恒久対策として、受理サイト(let初期化・代入・return・構造体リテラルのフィールド初期化)でのmoveなしの場所式コピーを検出する診断を追加した(通常は警告、
--strictではエラー。Z5の縮小変換と同じ段階導入方式)。move代入(
self.f = move x;)は既存のmove機構(HIRのis_moved_from→MIRのdtor登録解除)で既に機能することを確認し、HashSetコンストラクタの「代入後にポインタを手動無効化する」回避策をself.map = move m;へ置き換えた。一時値(コンストラクタ呼び出し・メソッド戻り値)の代入や、dtorを持たない構造体のコピーは診断対象外。
🐛 コンパイラバグ修正(標準ライブラリ実装で顕在化)
新しい標準ライブラリが最初の実利用者となり、計5件の潜在コンパイラバグを発見・修正した(ジェネリック特殊化まわり3件の記録・DCE誤削除の記録・総称ヘルパー連鎖の記録)。
フィールドレシーバのメソッド呼び出しがコピーに実行される
w.c.bump()のようにフィールドをレシーバにすると、メソッド内のself変異が呼び出し元へ反映されなかった(HashSet/TreeSetのようなラッパー型が全滅する問題)。MIRのself引数処理へ場所化分岐(
lower_place)を追加し、実体のアドレスを渡すようにした。ジェネリック関数の関数ポインタ引数が未置換
<T>関数のint*(T, T)引数がmono特殊化で置換されず、LLVM検証エラーになった(Vector<T>.sortByが顕在化点)。型置換の2実装(正準API・mono側)へFunction型の再帰を追加した。
ジェネリックメソッドが返すスライスの要素幅ずれ
ジェネリックメソッドから
K[]を返すと要素読みが交互にゴミ値になった(TreeMap.keys_in_orderが顕在化点)。mono特殊化でターミネータにも型置換を適用し、スライス生成の要素サイズ定数を置換後の型から再計算するようにした。
総称ヘルパー連鎖が既定intの偽特殊化で汚染される
importしたモジュール内の総称関数(
sort<T>)から別の総称ヘルパーを呼ぶと、ヘルパーがint版として特殊化されソートが無言で無効になった(記録)。総称本体のスキャンが型未確定の呼び出しへ「既定int」の偽リクエストを作り、生成直後の即時書き換えがclone前の総称本体を汚染していた(同一ファイルでは特殊化名の辞書順の偶然で動いていた)。
モノモーフィゼーションの不動点ループで総称本体をスキャン対象から外して修正した(呼び出し元の特殊化後に正しい実型で要求される)。
ポインタ経由参照のみの構造体がAOTで消え不正IRになる
cm runでは動くプログラムがcm compileだけ「Load operand must be a pointer」の検証エラーで失敗した(AtomicSharedPtrの制御ブロックが顕在化点。記録)。AOT限定のプログラムDCEが使用中構造体の収集でポインタ・型引数を辿らず、
Ctr*のようにポインタでしか参照されない構造体定義を削除し、codegenのフィールド投影が型解決失敗で命令を黙って落としていた。DCEの収集を型ノードの再帰走査(ポインタ・配列・型引数)に改めて修正した。
🐛 標準ライブラリのバグ修正
native::io::file の open フラグがmacOS固有値だった
write_fileがO_WRONLY|O_CREAT|O_TRUNCとしてmacOS/BSDの値0x0601を直書きしており、LinuxではO_CREAT(Linuxでは0x0040)が立たず新規ファイルへの書き込みが失敗していた。#ifdef __linux__でLinux値0x0241に分岐するようにした。同じ値を使っていたfs/write_perfテスト(CIのubuntuでjit/nativeともにOutput mismatch)は、std::fs::write_fileで空ファイルを先に作成し両OSで同値のO_WRONLY(=1)だけでopenする移植可能な形へ修正した。HashSetの非決定的クラッシュ(二重解放)
HashSetを使うプログラムが実行ごとに完走・SIGABRTが揺れる非決定的クラッシュを起こした(記録)。コンストラクタの
self.map = m;が浅いコピーで、ローカルmのデストラクタがentriesを解放してdanglingになるのが真因(ハング中プロセスのスタック採取でmallocの二重解放検出を直接確認)。所有権移動後にローカルの保持ポインタを無効化して修正した。
恒久対策として「dtor持ち構造体の暗黙コピーへの警告」「move代入」を言語側の設計課題に記録した。
JSバックエンドのスライスポインタ引数の制限回避(TreeMap走査)
K[]*引数を再帰ヘルパーへ引き回すTreeMap.keys_in_order()がJSバックエンドだけ実行時エラーになった(記録)。JSのポインタ表現(配列+添字のセル参照)がスライスポインタのデリファレンスで壊れる既知制限のため、明示スタックの反復in-order走査へ書き換えて回避した(バックエンド側の修正は残課題として記録)。
ユーザ定義Optionとプレリュード衝突のライブラリ波及
ローカルで
enum Optionを再定義しているプログラムが、importしていないstd::strings::parseの型エラーでコンパイル不能になった(記録)。選択import(
::{名前})が対象関数本体を即時型検査する挙動と、ユーザ定義Optionのフラット名前空間上書きの合成が真因。ライブラリ内部の利用をワイルドカードimport(検査が利用時まで遅延)へ変更して回避し、型解決のモジュール分離を言語側の設計課題に記録した。
🔧 ツーリング
フォーマッタ: メソッドチェーンのTS風折り返し
cm fmtの折り返し候補はカンマと二項演算子のみで、文レベルのメソッドチェーンが最大行幅(100桁)を超えると最後の呼び出しの引数リスト内で折れてしまい、チェーン構造が読めない整形になっていた(設計文書)。.method(...)の呼び出しが2つ以上連なる超過行は、カンマ・演算子折り返しより優先して各チェーンの.直前で折り返すようにした(TypeScript/Prettier風。継続行は1段インデント)。フィールド参照の
.や数値リテラルの小数点、if (...)ヘッダなど括弧内のチェーンは対象にせず、従来の折り返しを維持する。CIからインタプリタ実行ジョブを削除
統合テストのmatrixにあったinterpreterスイート(MIRインタプリタ・O3)はjit系ジョブと検証範囲が重複するため、CIジョブから外した。
ローカルの
make testには引き続き含まれる。makeターゲット名の統一(install-vscode-extension)
操作系ターゲットは動詞先頭(
install/test-*/update-docs-version)、成果物ターゲットは名詞(release/dist/vscode-extension)という命名規約に対し、vscode-extension-installだけが操作なのに名詞先頭だった。make install-vscode-extensionへ改名した。📦 サンプル
セルフホストパーサ(examples/08_selfhost_parser)
v0.17.2で整備した標準ライブラリの実証として、Cmで書いたCmソースの宣言レベルパーサを追加した。
成功なら定義一覧(module/import/use/typedef/const/struct/enum/impl/関数)を、失敗ならエラー箇所(行:桁・キャレット付きソース行)を出力し、失敗し得る解析関数はすべてOption型で失敗を伝播する。
段階別ディレクトリ(diag/lexer/parser/decl/samples)へ分割し、
#[test]ディレクティブの単体テストはソースと混在しないようtests/フォルダへ集約した。トークン種別はenum、バイト値は文字キャストの定数で定義し、エラーメッセージはコンパイラ本体と同じi18n構成(enum MsgId×Langのテンプレート表・{0}プレースホルダ・CM_LANG切替)で診断モジュールへ分離している。プレースホルダ埋めは引数数別の関数や診断ビルダーを設けず、C++側
i18n::msgfと同じ方式のmsgf(MsgId, string[])1本へ集約し、呼び出し側がmsgf(MsgId::ExpectedButFound, [expected, found])のようにIDと引数配列を直接渡す。パーサ自身の全ソースを自己解析でき、CIが単体テスト・正常/エラーサンプル・自己解析を検証する。
🧪 テスト
08_treeset_ops(20000要素・木高検証)、09_hashset_ops(50000要素)、10_arena_vs_alloc(200000確保の対alloc比較)を追加。