📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

155行目: 155行目:
*: <br>
*: <br>
*: 大規模なソフトウェアシステムの性能向上を目指す場合は、特に有用なツールである。
*: 大規模なソフトウェアシステムの性能向上を目指す場合は、特に有用なツールである。
<br><br>
== LLVMツールチェーン と GNUツールチェーンの比較 ==
<center>
{| class="wikitable"
! 項目 !! LLVM !! GNU
|-
! コンパイラ<br>フロントエンド
| Clang (C言語)<br>Clang++ (C++言語)
| gcc (C言語)<br>g++ (C++言語)
|-
! コンパイラ<br>バックエンド
| LLVM<br>(中間表現処理・最適化・コード生成)
| GCCバックエンド<br>(GCC内部に組み込まれている)
|-
! アセンブラ
| llvm-as
| as (GNU Assembler)
|-
! リンカ
| lld (LLVM Linker)
| ld (GNU Linker)
|-
! その他ツール
| llvm-objdump, llvm-ar, llvm-nm など
| objdump, ar, nm など<br>(binutilsに含まれる)
|-
! 設計思想
| モジュール化・ライブラリ指向<br>再利用可能
| 統合的・密結合
|-
! 他言語での利用
| Rust, Swift, Julia など<br>多数の言語で採用
| 主にC/C++/Fortran系
|}
</center>
<br>
<center>
{| class="wikitable" style="width:70%; text-align:center;"
|+ コンパイルからリンクまでの流れ
! style="width:15%; background-color:#e8e8e8;"| ステップ
! style="width:42.5%; background-color:#dae8fc;"| LLVMツールチェーン
! style="width:42.5%; background-color:#f8cecc;"| GNUツールチェーン
|-
! style="background-color:#fff2cc;"| 入力
| colspan="2" style="background-color:#fff2cc;"| ソースコード (.c, .cpp)
|-
! style="background-color:#e3f2fd;"| ① 解析
| style="background-color:#e3f2fd;"| Clang / Clang++<br><small>字句・構文・意味解析</small>
| style="background-color:#ffebee;"| gcc / g++<br><small>字句・構文・意味解析</small>
|-
! style="background-color:#f3e5f5;"| ② 中間表現
| style="background-color:#e3f2fd;"| LLVM IR<br><small>中間表現形式</small>
| style="background-color:#ffebee;"| gcc内部形式<br><small>RTL/GIMPLE</small>
|-
! style="background-color:#fff3e0;"| ③ 最適化
| style="background-color:#e3f2fd;"| LLVM Optimizer<br><small>各種最適化パス</small>
| style="background-color:#ffebee;"| gcc最適化<br><small>内部で最適化処理</small>
|-
! style="background-color:#e0f2f1;"| ④ コード生成
| style="background-color:#e3f2fd;"| LLVM Backend<br><small>機械語生成</small>
| style="background-color:#ffebee;"| gcc Backend<br><small>機械語生成</small>
|-
! style="background-color:#fce4ec;"| ⑤ アセンブル
| style="background-color:#e3f2fd;"| llvm-as<br><small>LLVM Assembler</small>
| style="background-color:#ffebee;"| as<br><small>GNU Assembler</small>
|-
! style="background-color:#f0f0f0;"| 中間生成物
| colspan="2" style="background-color:#f0f0f0;"| オブジェクトファイル (.o)
|-
! style="background-color:#e8f5e9;"| ⑥ リンク
| style="background-color:#e3f2fd;"| lld<br><small>LLVM Linker</small>
| style="background-color:#ffebee;"| ld<br><small>GNU Linker</small>
|-
! style="background-color:#c8e6c9;"| 出力
| colspan="2" style="background-color:#c8e6c9;"| 実行ファイル (a.out, .exe等)
|}
</center>
<br>
* LLVM
*: 各段階が独立したモジュールとして動作し、LLVM IRという共通の中間表現を使用
* GNU
*: フロントエンドからバックエンドまでgccの中で統合的に処理される
<br><br>
<br><br>