19

LLVMシステムを調べており、GettingStartedのドキュメントを読みました。ただし、いくつかの命名法(およびclangの例の表現)はまだ少し混乱しています。次の用語とコマンドはすべてコンパイルプロセスの一部であり、誰かが私のためにそれらをもう少しよく説明できるのではないかと思っていました。

  • clang -Svs. clang -c(私は何をするのか知って-cいますが、結果はどのように異なりますか?)* (編集)
  • LLVMビットコードとLLVMIR(違いは何ですか?)
  • .llファイルと.bcファイル(それらは何ですか、どのように異なりますか?)
  • LLVMアセンブリコードネイティブアセンブリコード(違いはありますか?)

より高いレベルでは、コンパイルプロセス全体を理解しており、かなりうまく追跡できます。たとえば、「IR」が表示されることを期待しているが、代わりに「ビットコード」または「 LLVMアセンブリ」ということで、私はそれらをほとんど理解していないと思います。

4

1 に答える 1

30

Clangの使用法

一般に、ClangはGCCと同じコマンドラインオプションを受け入れます。-cオプション(コンパイルとアセンブルのみ、リンクしない)とオプション-S(コンパイルのみ、アセンブルまたはリンクしない)は、両方で同じことを意味します。

中間表現に関するLLVM用語

このサイトの私の別の答えから引用するには:

LLVM IRは通常、拡張子が.llのテキストファイルまたは拡張子が.bcのバイナリファイルのいずれかでディスクに保存されます。2つの間の変換は簡単で、bc- > llおよびll- > bcllvm-disに使用できます。バイナリ形式はメモリ効率が高く、テキスト形式は人間が読める形式です。llvm-as

さらに、一般的に使用されるエイリアスがいくつかあります。

  • .bcファイルに保存されているバイナリ形式はビットコードとも呼ばれます(一般的なIRにも「ビットコード」という用語が適用されることを時々耳にしますが)
  • IRはLLVMアセンブリまたはLLVMアセンブリ言語とも呼ばれます

いずれにせよ、それはすべて、潜在的に異なる表現の下で、同じことを意味します。

ネイティブアセンブリ

ネイティブアセンブリは、「アセンブリ」という用語を聞くときに多くの人が一般的に考えるものです。これは、ネイティブマシンバイナリにほぼ1:1でマッピングされる低レベル言語であり、LLVMアセンブリとは異なり、ネイティブアセンブリはターゲットに大きく依存します(例はx86アセンブリです) 。 、ARMアセンブリなど)。ネイティブアセンブリは、アセンブラを介してネイティブバイナリにアセンブルされます。LLVMにはアセンブラが含まれていますが、他のアセンブラを使用することもできます(例gas)。

ネイティブバイナリ(アセンブルプロセスの結果)はもちろん、コンピュータが実際に話す(唯一の)言語であり、リンクした後、メモリにロードしてハードウェアで直接実行できます。

于 2013-01-01T07:15:00.897 に答える