2012-04-29 29 views
-1

これは、このようなことのために適切な場所であれば、私は知りませんが、私はGCCフロントエンド/バックエンドアーキテクチャのいくつかの側面についての好奇心:GCC技術的な詳細

  1. 私が知っています私は.oのファイルをCのコードからコンパイルしてC++のコードにリンクすることができます。私はそれを他の方法でもできると思います。 2つの言語が似ているか、GCCのバックエンドが実際には言語に依存しないため、これは機能しますか?これはADAコードでも機能しますか? (私はADAを知らないので、それが意味をなさないか、それとも "機能"を持っているのか分かりませんが、質問は理解されます。 "パスカル"または "自分の習慣言語フロントエンド ")
  2. ガベージコレクションはどこで実装されますか?たとえば、Javaフロントエンドなどです。私が理解していることは、JVMのバックエンドにコンパイルする場合、 "プラットフォーム"がGCを処理するため、フロントエンドはそれについて何もする必要はありませんが、ネイティブコードにコンパイルする場合、フロントエンドガベージコレクションGENERICコードをバックエンドに送信するか、バックエンドにガベージコレクションコードを生成するように指示するフラグをオンにしますか?最初の方がわかりやすいですが、それはフロントエンドがターゲットに基づいて異なる出力を生成することを意味します。これは、GCCのフロントエンド/バックエンドアーキテクチャのポイントを見逃しているようです。
  3. 言語固有のライブラリはどこに行きますか?たとえば、標準のJavaクラスや標準のCヘッダーなどです。それらが最後にリンクされている場合、Cプログラムは理論的にはJavaライブラリなどの関数をそれを別のリンクされたライブラリとして呼び出すことができますか?

答えて

1
  1. はい、バックエンドは、少なくとも合理的に言語に依存しません。はい、それはAdaで動作します。
  2. GCJは、ランタイムライブラリを使用するネイティブコードを生成します。ガベージコレクタは、ランタイムライブラリの一部です。
  3. GCJはCNIを実装しています。これにより、Javaコードでネイティブメソッドとして使用できるコードをC++で記述することができますが、これを行うことができるのは、偶発的な副産物ではなく、設計した結果です。同じバックエンドを使用します。
0
  1. 規則を呼び出すと互換性がありますので、それは可能ですが、名前の符号化は、(Cで無マングリング)異なっています。 C++からC関数を呼び出すには、extern "C"と宣言する必要があります。また、C++の関数をCから呼び出すには、名前を混乱させて宣言する必要があります(追加の引数または別の型の引数でも構いません)。呼び出し側のFortranコードは場合によっては可能ですが、引き数の引き渡し規約が異なります(Fortranではrefを渡します)。 実際にはC++からC(cfront)へのコンバータとFortranからc(f2c)へのコンバータがあり、それらのいくつかのソリューションが引き続き使用されています。

  2. 実行時ライブラリにガベージコレクションが実装されています。ベーム。バックエンドは、選択したGCライブラリと互換性のあるオブジェクトを生成する必要があります。

  3. コンパイラドライバ(g ++、gfortran、..)は、リンクステップに言語固有のライブラリを追加します。

関連する問題