Upgrade to Pro — share decks privately, control downloads, hide ads and more …

chibiccをCILに移植した結果 (NGK2025S版)

chibiccをCILに移植した結果 (NGK2025S版)

NGK2025S (名古屋合同懇親会) で発表する内容です。
セッションはLTで5分なので、非常に短時間で、詳細は全く解説出来ていません。そのため、詳細に興味がある場合は、スライド内にもあるように「第9回Center CLR勉強会」にご参加ください。

NGK2025S: https://ngk.connpass.com/event/334796/
第9回Center CLR勉強会: https://centerclr.connpass.com/event/341192/

chibicc-cil (YouTubeリスト): https://www.youtube.com/playlist?list=PLL43LzwbRhvRL2PkpewoRv0AFVobTtZGt

GitHub: https://github.com/kekyo/chibicc-cil-build/

Kouji Matsui

January 18, 2025
Tweet

More Decks by Kouji Matsui

Other Decks in Programming

Transcript

  1. (c) 2025 Kouji Matsui Kouji Matsui – kozy, kekyo NAGOYA

    city, AICHI pref., JP https://github.com/kekyo https://mi.kekyo.net/@kekyo Center CLR organizer. .NET OSS: IL2C RelaxVersioner Epoxy GitReader FlashCap etc… Bicycle rider
  2. (c) 2025 Kouji Matsui Attention! スライドはアップします。 この発表の詳細は、後日「第9回 Center CLR 勉強会」でやります。

    質疑応答がある場合は、是非ご参加ください。 connpass: https://centerclr.connpass.com/ Discord: https://discord.gg/JMA4uzNUKj
  3. (c) 2025 Kouji Matsui (c) 2025 Kouji Matsui Agenda chibiccとは

    chibicc-cilとは 移植の過程 移植した結果 ラスボス
  4. (c) 2025 Kouji Matsui chibiccとは Rui Ueyama氏のプロジェクト “A small C

    compiler” https://github.com/rui314/chibicc chibicc は、C11 のほとんどの機能を実装した、もう 1 つの小さな C コ ンパイラです。 他の小さなコンパイラと同様に、おそらく「おもちゃのコンパイラ」のカ テゴリに分類されるかもしれませんが、chibicc は、コンパイルされたプ ログラムに変更を加えることなく、Git、 SQLite、 libpng、chibicc 自体 を含むいくつかの実際のプログラムをコンパイルできます。
  5. (c) 2025 Kouji Matsui (c) 2025 Kouji Matsui Agenda chibiccとは

    chibicc-cilとは 移植の過程 移植した結果 ラスボス
  6. (c) 2025 Kouji Matsui .NET/.NET Core/.NET Frameworkで使われる、CIL (Common Intemediate Language)の事です。

    CILは.NETにおけるJava Bytecodeのような中間言語仕様で、 ECMA-335で定義されています。 https://ecma-international.org/publications-and- standards/standards/ecma-335/ CILとは
  7. (c) 2025 Kouji Matsui (c) 2025 Kouji Matsui Agenda chibiccとは

    chibicc-cilとは 移植の過程 移植した結果 ラスボス
  8. (c) 2025 Kouji Matsui 移植の過程 CILレベルではメタデータがあるので、単純すぎるC言語関数との整合性を 持たせることを考える必要がある: ◦ ポインタの扱いはCILにポインタ型があるので、1:1で対応できる。 ◦

    しかし、ポインタは実行時環境で32/64bitが決定されるので、コンパイル時にサイズが確定できない(intptr_tが実行時 にサイズ決定される感じ) ◦ この機能(問題?)のため、構造体オフセット計算やsizeofの扱いなど、元のchibiccでは素直な実装だったところも複雑化。 ◦ CILには構造体(ValueType)が存在するので、C言語構造体はだいたい1:1に対応出来る。 ◦ 共用体に対応するものは無いので、ValueTypeで代用する。どちらにしてもchibiccは自力でオフセット計算を行うので、 CIL側でそれっぽくメタデータ生成(フィールド群定義)を行うけど、ガン無視でポインタ演算でアクセスする。 ◦ CILにはP/Invokeという、ネイティブライブラリ(*.so)を呼び出せる機能があるので、これを使えばシームレスにネイ ティブライブラリと結合できるかも? (少なくともC#よりは簡単に) ◦ CILアセンブラは.NET標準のilasmがあるけど、これが色々扱いにくい。CILアセンブラ作るのはそれほど難易度が高い わけではないので、chibiccのバックエンドとして扱いやすいchibiasを作るか… ◦ P/Invokeでネイティブライブラリをリンクできるようなナチュラルさを実現するには、リンカ側でコード生成能力とか 多少必要になるかもしれない… ◦ POSIX環境処理系として違和感を与えたくないので、普通に想定されるldやarも必要だよね… うんたらかんたら…
  9. (c) 2025 Kouji Matsui (c) 2025 Kouji Matsui Agenda chibiccとは

    chibicc-cil 移植の過程 移植した結果 ラスボス
  10. (c) 2025 Kouji Matsui 移植した結果 最初の山場(セルフホスト試行・総コミット316個の約半分ぐ らい) Stage1(gccでビルドしたchibicc-cil) Stage2(Stage1 chibicc-cilを使ってビルドしたchibicc-cil)

    Stage3(Stage2 chibicc-cilを使ってビルドしたchibicc-cil) でテスト結果が一致する事を確認!! chibiccはC言語で書かれているので 自分自身をコンパイルできる
  11. (c) 2025 Kouji Matsui 移植した結果 そして… chibicc: 305/316 chibicc-cil: 367

    増えているのはCILへの 対応分です。 移植 残り11コミット
  12. (c) 2025 Kouji Matsui 移植した結果 ◦ ポインタサイズ: 32/64bitの計算を実行時に行うために、計算式をそのままemitすると非常に効率の悪いコードにな る(100倍近く遅いことも) ◦

    関数ポインタを構造体のメタデータに出力すると、ランタイムに無視される ◦ ランタイムはスタックマシンなので、関数の戻り値がvoidの場合にこれを考慮に入れる必要があるが、元のchibicc はそうではない。 ◦ newlibが複素数型への対応を要求する。 ◦ C言語の配列は、ValueType arrayに相当するが、対応するCILの型が無い。 ◦ VLA (Variable length array)への対応。スタックマシンだとこれを安全に対応するのは非常に難しい。 ◦ 全く同じ構造体型が、CILメタデータ上では区別されてしまう。C言語では構造体のアイデンティティはヘッダファ イルの定義が全て。 ◦ アライメントの指定と計算。ランタイムがどのように配置するのかは不透明なので。 ◦ MMX, SSE, AVXなどのintrinsic ◦ まともなデバッグ情報を出したい ◦ ランタイムライブラリの用意 ◦ 関数の可変引数への対応(vararg) ◦ POSIXシグナル・スレッドの扱い
  13. (c) 2025 Kouji Matsui (c) 2025 Kouji Matsui Agenda chibiccとは

    chibicc-cil 移植の過程 移植した結果 ラスボス
  14. (c) 2025 Kouji Matsui ラスボス libc呼び出し可能にするには、関数の可変引数への対応が必要 ◦ CILのvarargメタデータと専用命令を使うようにする。これのemitは chibildで行う必要がある。 ◦

    最初、varargを使うもうまく動かない事があった。これはnetstandard TFMでのみ発生し、.NETランタイムのissueにも上がっていない問題で、 どうしようもないことから、vararg命令を使わず独自の実装で回避。こ れは動作した。 ◦ しかし、P/Invokeでネイティブライブラリの可変引数関数を呼び出した りコールバックで呼び出し可能にするには、やはり.NETランタイムが varargを処理できる必要がある…
  15. (c) 2025 Kouji Matsui ラスボス “Initial thoughts on Native Vararg

    support on Unix platforms for RyuJit” https://github.com/dotnet/runtime/issues/10478 意訳: 「varargはWindowsにしか対応してないよーん」 うそだ!うそだと言ってくれ…!!!
  16. (c) 2025 Kouji Matsui ご清聴ありがとうございました! 成果物を公開します: ◦ chibicc-cil-build: https://github.com/kekyo/chibicc-cil-build この発表の詳細は、後日「第9回

    Center CLR勉強会」でやります。質疑 応答がある場合は、是非ご参加ください。 類似プロジェクト: Cesium(ForNeVerさん/JBの中の人) 同じ問題がIssueで上がっています(もちろん未解決) https://github.com/ForNeVeR/Cesium