コンパイルターゲットとは正確には何ですか?


17

私はこの言葉を聞き続け、すべてのグーグル検索はコンパイラに関する記事に私を導きます。コンパイルターゲットという用語の意味を理解したいだけです:|

更新:コンテキストを与えるために:Webアセンブリは、C、C ++、Rustなどの他の言語のコンパイルターゲットであると言われました。


コンパイラに関する記事を読むことをお勧めします。

4
コンパイラに関する記事では、これを既に知っていることを前提としています。それは合理的な質問です。
カールビーレフェルト

ウィキペディアスタイルの記事についてもっと考えていました。そして、私は質問が合理的であることに同意します。これは単なる提案であり、批判ではありません。

4
質問は理にかなっていますが、うまく書かれていません。「ターゲット」という用語にはさまざまな意味があります。そのため、それを聞いたり読んだりする際に、参考文献やより多くの文脈を与えることをお勧めします。
ドックブラウン

@DocBrown多くの文脈で聞いたことがありますが、最近ではWebアセンブリが他の言語のコンパイルターゲットであるという文脈で聞いています。
ScionOfBytes

回答:


17

コンパイラは、本質的に、ある言語で入力を受け取り、別の言語で出力を生成する翻訳者です。たとえば、Eiffel SoftwareのコンパイラはEiffel言語の入力を受け取り、Cを生成します。IntelのGCCはC言語の入力を読み取り、x86アセンブリを生成します。Intel用のGASアセンブラーは、x86アセンブリーを受け取り、x86オブジェクトコードを生成します。これらの3つはすべて技術的にはコンパイラです。

形式に関係なく、コンパイラーによって読み取られる入力はソースと呼ばれ、出力はターゲットと呼ばれます。後者の用語は、その定義の1つである「意図した結果」から取られています。

コンパイラの大部分は、特定のプロセッサまたはアーキテクチャのアセンブリコードまたはオブジェクトコードを生成するように設計されています。そのため、ターゲットは出力形式ではなくアーキテクチャ自体を参照するためによく使用されます。

コンパイラのターゲットは、実行するアーキテクチャと同じである必要はありません。また、それが発生する場合、プログラムはクロスコンパイラと呼ばれます。(たとえば、GCCをビルドしてx86システムで実行し、CをARMアセンブリにコンパイルできます。)

さらに、コマンドラインのスイッチなどの入力に応じて、異なるターゲットの出力を生成できる単一のコンパイラがあります。これらはマルチターゲットコンパイラと呼ばれます。


2
サイドノートとして、この用語はビルドシステムのコンテキストでより一般化された形式でも使用されることに言及する価値があるかもしれません-ターゲットはビルドステップからの出力であり、必ずしもコンパイルアクションである必要はありませんインストーラーの作成)。
-BartoszKP

2
コンパイラはフィルターではなく翻訳者です。

1
@Birfl。明らかに。「tr」は、フィルターではなく翻訳を意味します。フィルタは翻訳者ではありません。これは明らかです。

2
@Birfl:ウィキペディアでは行きません。別のssysから1つのストリームを生成するだけです。フィルタとトランスレータの違いは非常によく知られています。述語に基づいて、フィルターが含まれる/除外される。変形しません。偶数のリストを偶数でフィルタリングしますか?変換されていない偶数の整数を取得します。incを使用して同じリストを翻訳すると、元のリストの変換されたバージョンが得られます。

1
コンパイルのアカウントは、「フィルター」という用語を除いて問題ありません。

4

翻訳では、言語が英語のような自然言語であろうと、Cのような人工言語であろうと、用語ソースターゲットを使用して、翻訳システムの入力出力について話します。自然言語翻訳では、システムは2つの言語間で翻訳できる有能な人間の脳です。プログラミング言語では、コンパイラーです。

したがって、コンパイラのソースはプログラミング言語(C)であり、ターゲットはバイトコード(マシンレベルの命令)です。異なるシステム(CPUアーキテクチャ)は異なる命令セット(ARM、MIPSなど)を持っているため、コンパイルでターゲットを使用することがよくあります。コンパイラは正しい命令(バイトコード)を作成できるように、どの命令セットがターゲットであるかを知る必要があります。


0

WebAssembyは最新かつ最高のもので、c / c ++コードをバイナリ形式に変換します。

  • WebAssemblyは、一般的なハードウェアを活用してネイティブの速度で実行することを目指しています。Webプラットフォームと統合するように設計されています。

これは、アプリケーションの1つを見ることができるリンク、マシンコードで単純な階乗プログラムを変換する速度です。

この獣、https://godbolt.org/を確認してください

このサンプルプログラムを使用して、そのサイトで実行し、アセンブリを確認できます。

# include<stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • モバイルおよびIoTを含む幅広いプラットフォームで利用可能な一般的なハードウェア機能を活用して、ネイティブの速度で実行するようにコンパイルできるコンパイルターゲットとして機能する、ポータブルでサイズおよびロード時間効率の良いバイナリ形式を定義します。

ホストとターゲットに関する基本情報、プログラミング言語を10101010に翻訳する方法。

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. GCCは、C / C ++コードをアセンブリコードに変換します。「アセンブラ」と呼ばれるツールはアセンブリコードをマシンコードに変換し、「リンカー」と呼ばれるツールは複数のマシンコードファイルを1つの実行可能ファイル(Windowsでは.EXE)ファイルに接続します。これらのコンパイラのほとんどでは、結果のアセンブラコードをファイルに書き込むことができるため、アセンブラコードを確認したり変更したりできます。

  2. アセンブラとリンカはツールチェーンの一部であり、通常、コンパイラとともに提供されます。

  3. ただし、一部のコンパイラ(Microsoftなど)は、C / C ++コードを機械語に直接変換するため、アセンブラーは不要です。これらのコンパイラの多くはアセンブラコードを作成できないため、アセンブラコードをファイルに書き込むことはできません。

ちなみに、.EXEファイルを直接作成するコンパイラー(C / C ++用ではなく、他のプログラミング言語用)もあり、リンカーは不要です。

WebAssembly:https : //github.com/WebAssembly/design

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.