-1

これがこのようなものにとって適切な場所かどうかはわかりませんが、GCC フロントエンド/バックエンド アーキテクチャのいくつかの側面に興味があります。

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

2 に答える 2

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

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

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

于 2012-04-29T14:14:28.070 に答える