**タイトル**  
「JITで生成したコードを世に知れ渡らせる ― その手段を数え上げてみよう」

2026/03/10 18:31

**タイトル** 「JITで生成したコードを世に知れ渡らせる ― その手段を数え上げてみよう」

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

(必要に応じて修正がない場合は元の要約をそのまま繰り返してください)

Summary:
MoarVM, written in C, implements Raku exception handling with

longjmp
rather than standard C++ unwind tables. On Windows, MSVC’s change to fully unwind frames broke crash handling because JIT‑compiled code had no unwind info. The fix was to generate unwinding data for those frames and register it via the WinAPI call
RtlAddFunctionTable
, which stops crashes but still leaves gaps in debugging support.

The author has examined several cross‑platform APIs:

libunwind
’s
_U_dyn_register
for naming functions and supplying unwind tables.
• GDB’s “jitreader” plugin (
__jit_debug_descriptor
,
__jit_debug_register_code
) for complete debug info (name, file, line).
• Linux perf’s JITDUMP format, which records machine‑code blobs with timestamps and optional source data.
Since September 2018 MoarVM has used Perf Map to list function names, addresses, and lengths, but this approach lacks an assembly view.

Additional possibilities include creating loadable ELF/DLLs and loading them via

dlopen
(providing full debugging support at the cost of I/O overhead) or exposing JIT functions to Valgrind client requests for callgrind/cachegrind.
The overarching aim is a single, cross‑platform solution that supplies naming, unwinding, source mapping, and disassembly for MoarVM’s JIT code—improving crash diagnostics, performance profiling, and the overall developer experience, and potentially serving as a model for other JIT runtimes.

本文

AOT コンパイラ

長い間、AOT(Ahead‑Of‑Time)コンパイルで生成されるマシンコードは、ターゲットシステムのさまざまな部分で使用することを想定したメタデータとともに出力されるのが当たり前でした。
関数名としてシンボルが付与されており、これによってインストラクションポインタから現在実行中の関数名や開始位置を取得できます。また、DLL・dylib・so といった動的ライブラリをロードした際に、そのシンボルがあれば呼び出したい関数を実際に呼ぶことも可能です。

さらにデバッグ情報として、行番号アノテーションがあります。これによりインストラクションポインタから関数名だけでなく、ファイル名と行番号までマッピングできます。
C++ のような例外機構を持つ言語では、スタック上の各フレームが投げられた例外をどのように処理すべきかを記述したテーブルが出力されます。アンウインド時には、そのテーブルがランタイムライブラリに対し「正しくスタックフレームを破棄するために何をすべきか」を伝え、リソース解放やデストラクタの実行などを行います。

MoarVM は C で書かれているので、C++ スタイルの例外は使いません。代わりに

longjmp
MVM_exception_throw_adhoc
経由)を利用して、呼び出しスタックの奥からインタプリタループへ戻ります。Windows では MSVC の変更により
longjmp
が常にフレーム単位で完全にアンウインドされるようになりました。純粋な C コードなら問題ありませんが、MoarVM の JIT は
longjmp
が発生したときにスタック上にフレームを残すことがあります。その際に JIT にはアンウインド情報が無いためクラッシュしてしまいました。

私は必要なアンウインド情報を WinAPI(

RtlAddFunctionTable
)へ登録する修正を行いました。Patrick Böker(Lazymio に感謝)の簡易パッチも機能します;彼のプルリクエストをご覧ください。


JIT がシステムに伝えるべき情報

API何を提供するか備考
RtlAddFunctionTable
Windows 用アンウインド情報シンボル名は含まれない
libunwind::_U_dyn_register
シンボル名+アンウインドテーブル自分のスタックだけを歩く場合に有効
GDB “jitreader”完全なデバッグ情報(名前・ファイル・行)手動で plumbing 必要、重い
JITDUMP フォーマットシンボル名+アンウインドテーブル+行番号
perf inject
で後処理が必要
Perf Map簡易テキスト:アドレス・サイズ・名前最も簡単;アセンブリは表示できない

速くてシンプル:Perf Map

“Perf Map” ファイルは予測可能なパスにある単一のテキストファイルです。
各行は次の形式で構成されます。

<address> <size> <function_name>

perf report
はこれを利用して関数名とソースファイル名を出力できますが、実際のアセンブリコードを表示することはできません。


高度:RtlAddFunctionTable / libunwind

両 API は似ています。フレームごとのアンウインド方法を記述したテーブルを登録します。
Windows では

RtlAddFunctionTable
、Linux では
_U_dyn_register
を使用します。アドレス空間とオフセットの取り扱いには注意が必要です。


強力だが冗長:GDB JIT Reader

GDB はグローバルシンボル

__jit_debug_descriptor
を調べます。
__jit_debug_register_code
を呼び出すと、JIT のデバッグ情報を含むメモリブロック(symfile)を渡します。
バイト読み取り関数、オブジェクト作成関数、シンボルテーブル・ブロック・行マッピングの実装が必要です。

GDB プラグインは JIT コードをデバッグセッションに注入し、ファイル/ライン情報付きでバックトレースできるようにします:

#6  0x00007ffff746a483 in MVM_io_write_bytes ... at src/io/io.c:178
#7  0x00007ffff575cb3e in spurt () ... at SETTING::src/core.c/IO/Handle.rakumod:7

JITDUMP フォーマット

JITDUMP は

perf
が理解するバイナリフォーマットです。

  1. ファイル(通常は実行ファイルの隣)を開く。
  2. モノトニッククロック値を含むヘッダーを書き込む。
  3. 各コードブロックについて、アドレス・サイズ・マシンコード全体とタイムスタンプを前置して書き込む。

その後、次のように実行します:

perf record -k 1 -e cpu-clock ./your_program
perf inject --jit your_jitdump_file perf.data > perf.jit.data

perf report
は JIT コンパイルされた関数のディスアセンブルを表示できるようになります。


その他ツール

  • Valgrind – クライアントリクエストでメモリ使用量、カスタムアロケータ等に注釈を付けられます。
    Callgrind/Cachedgrind の可視化には便利ですが、ドキュメントは乏しいです。

結論

JIT からデバッグ・アンウインド情報を露出する方法はいくつかあります:

  • Perf Map(シンプルでアセンブリは表示不可)
  • RtlAddFunctionTable /
    _U_dyn_register
    (アンウインドテーブルのみ)
  • GDB jitreader(完全なデバッグ情報、設計が重い)
  • JITDUMP(perf 統合、後処理必要)

統一的な解決策はまだありません。ニーズに合わせて最適なものを選択してください。

ご意見やソリューションがあれば、 libera.chat の

timo
か Fediverse でお気軽にどうぞ。

同じ日のほかのニュース

一覧に戻る →

2026/03/15 7:10

**アゲルス・リナックス ― 時代を超えて使えるソフトウェア** このソフトウェアは、年齢や経験に関係なく「時代を越えた使いやすさ」と柔軟性を重視するユーザー向けに設計されています。

## Japanese Translation: --- ## Summary Ageless Linux は意図的にカリフォルニア州の AB 1043 年齢確認法を拒否し、監視への抗議として Debian ベースのディストリビューションを位置付けつつ、オペレーティングシステムプロバイダーであり続けます。プロジェクトは標準の `/etc/os-release` ファイルを Bash スクリプト経由で「Ageless Linux」に置き換え、通常モードでも **“flagrant” モード** でも年齢確認 API を提供しません。「flagrant」 モードでは `/etc/ageless/REFUSAL` ファイルをインストールし、§ 1798.501(a)(1)–(a)(2) に対する完全かつ意図的な非準拠を明示的に宣言し、執行措置を促します。 ウェブサイトには子供、学校、図書館、および USB ドライブや Raspberry Pi Pico デバイスを通じて OS を配布するための **詳細なガイダンス** が含まれており、これらはすべて AB 1043 の下でオペレーティングシステムプロバイダー活動に該当します。また、ディストリビューションが年齢データを収集しないため「影響を受ける子供」を特定できず、影響を受ける子供ごとの罰金を算出できないことも説明しています。 Ageless Linux は暗号的に不可能であることとプライバシー懸念を理由に年齢確認を決して実装しないと主張し、Apple、Google、Microsoft などの大手テック企業が最小限のコストで AB 1043 を満たすケースとは対照的です。プロジェクトの FAQ は法的問題、コンプライアンス状況、および州最高検事への罰金可能性に関する一般的な質問に対応しています。 最後に Ageless Linux は裁判記録を取得するために、Raspberry Pi または USB ドライブを子供へ配布したことによる **$7,500 の罰金** をカリフォルニア州最高検事に請求し、AB 1043 が小規模オープンソースプロジェクトにどのように適用されるかを明確にすることを目的としています。サイトには法的問い合わせや報道関係者向けの連絡先情報(John McCardle、BDFL、FFwF Robotics LLC)が掲載されています。 ---

2026/03/15 6:27

**Show HN:Han – Rustで書かれた韓国語プログラミング言語**

## Japanese Translation: ## 要約 ハンは静的型付けでコンパイルされるプログラミング言語で、キーワードはすべて韓国語で記述されています(例:**함수**、**만약**、**반복**、**변수**)。コンパイラはRustで実装され、LLVM IRを生成し、clangがそれをネイティブバイナリに変換します。ツリー走査型インタープリタ(`hgl interpret`)により、すぐに実行して迅速な試験が可能です。 ハンの型システムは静的で、5つのプリミティブ型を持ちます—정수 (int)、실수 (float)、문자열 (string)、불 (bool)、그리고 없음 (void)。また配列・構造体・クロージャ・パターンマッチング・エラーハンドリング・ファイルI/O・フォーマット文字列・モジュール・ジェネリクス、組み込み数学関数もサポートしています。現在、配列と構造体はインタープリタのみで扱われており、コンパイラの完全なサポートは計画中です。 開発者はハンを REPL(`hgl repl`)、LSP サーバー(`hgl lsp`)によるエディター上のホバー/補完、およびさまざまな CLI コマンド:`interpret`、`build`、`run`、`repl` で操作できます。VS Code 統合は `editors/vscode` ディレクトリにあります。インストールには Rust(≥1.70)と clang が必要で、他の外部コンパイラ依存はありません。 現在の制限としては、タプル・列挙型・非同期/並行処理・ネットワーキング・サブプロセス、および配列/構造体の完全なコンパイルサポートが欠如しています。これらのギャップは今後の開発優先事項を示しています。

2026/03/15 8:10

エアバスは無人戦闘機を二機開発中です。

## Japanese Translation: Airbus は、2029 年までにドイツ空軍へ運用可能な無人協調戦闘機(UCCA)を納入する予定であり、これは Kratos Defense & Security Solutions の Valkyrie プラットフォーム上に構築され、Airbus の Multiplatform Autonomous Reconfigurable and Secure (MARS) ミッションシステムと AI‑有効化された MindShare ソフトウェアを備えています。 MARS システムは、人有人機と無人機の全グループを動的および非動的ミッションで統合して調整することができます。 **主要技術仕様:** - 元の UCCA は長さ 9.1 m、翼幅 8.2 m、航続距離 >5,000 km、MTOW 約 3 t、最大高度 45,000 ft。初飛行は 2019 年に実施されました。 - ドイツ版の初飛行は 2026 年に予定されています。 このパートナーシップには、Airbus と Rafael が Eurofighter コマンド機上で Litening 5 Advanced Targeting Pod をアップグレードし、クロスプラットフォーム接続性と戦闘致死率を向上させる作業も含まれます。 Airbus のエグゼクティブ・マーコ・ガンブラッハトは、「信頼できる主権的な戦闘能力を手頃な価格で提供する」ことの重要性を強調し、Kratos のスティーブ・フェンドリーは「ミッション化された Valkyrie は単独でも、チームとしても、人有人機と無人機の協同作戦においても利用可能である」と述べています。 この取引はドイツにタイムリーかつ大量展開が可能なドローンソリューションを提供し、AI 主導型多プラットフォーム戦闘システムへのより広範な転換を示しています。

**タイトル** 「JITで生成したコードを世に知れ渡らせる ― その手段を数え上げてみよう」 | そっか~ニュース