c++ファイルのコンパイルから実行へ


  • 基本ステップ
  • コンパイラ
  • リンク
  • 静的リンクと動的リンク
  • 静的リンク
  • ダイナミックリンク:
  • 区別


  • 基本手順
    前処理->コンパイル->アセンブリ->リンク
    プリコンパイル:ソースファイルhello.cと関連するヘッダファイルをプリコンパイラによってhello.iiファイルにコンパイルする(c言語では.cファイルを.iファイルにプリコンパイルする)
  • #defineを削除し、すべてのマクロ定義
  • を展開する.
  • 条件プリコンパイル命令を処理する、含まれるファイルをプリコンパイル命令の位置(再帰的プロセス)
  • に挿入する.
  • 注釈
  • を削除
  • 行番号、ファイル名表示
  • 保留#progmaコンパイラ命令
  • コンパイル:前処理されたファイルを一連の文法分析、文法分析、最適化した後、対応するアセンブリコードファイルを生成します.
    アセンブリ:アセンブリはアセンブリコードをマシンが実行できる命令に変換します.各アセンブリ文は、マシン命令に対応します..cファイルを.oターゲットファイルに変換します.
    リンク:.outファイルを取得します.シンボルで実現します.プログラムが複雑な場合、各ソースモジュールを独立してコンパイルし、要求に従って「組み立てる」ことを行います.この組み立てるプロセスはリンクです.
    コンパイラ
    高度な言語を機械言語に翻訳するツール.
    手順:スキャン→構文解析→意味解析→ソース最適化→コード生成→ターゲットファイル最適化
    リンク
    定義:プログラムが複雑な場合、各ソースモジュールを独立してコンパイルし、要求に従って「組み立てる」ことを行います.この組み立てるプロセスはリンクです.
    主な内容:各モジュール間の相互参照部分を処理し、各モジュール間を正しく接続できるようにする.
    アドレスと空間の割り当て、シンボルの決定、再配置を含む
    例:プログラムモジュールmain.cでは別のモジュールfunを用いる.cのfoo()関数はmain.c fun()関数を用いるたびに,この関数のアドレスを知る.しかし、各プログラムは単独でコンパイルされているため、コンパイラはfoo()のアドレスを知らないため、コンパイラは一時的にいくつかの記号で代替し、一時的にそれを棚上げし、リンクするまで待ってから、これらの命令のアドレスを修正します.リンクを使用すると、アドレスを知る必要がなく、他のモジュールの関数とグローバル変数を直接参照できます.
    静的リンクと動的リンク
    静的リンク
    リンクをコンパイルするときに必要な実行コードを呼び出しに直接コピーすることです.利点は、プログラムがパブリッシュされるときに不要な依存ライブラリ、つまりライブラリを持ってパブリッシュする必要がなくなり、プログラムは独立して実行できますが、ボリュームが比較的大きい可能性があります.利点コードのロード速度が速く、実行速度がダイナミックリンクより速いだけで、開発者のコンピュータが正しいlibファイルの欠点を保証して実行可能なファイルを生成することができ、同じコードコピーを含む可能性がある.
    ダイナミックリンク:
    コンパイル時に実行可能コードを直接コピーするのではなく、一連の記号とパラメータを記録することによって、プログラムの実行時またはロード時にこれらの情報をオペレーティングシステムに渡し、オペレーティングシステムは必要なダイナミックライブラリをメモリにロードし、プログラムは指定されたコードに実行する時、実行メモリにロードされたダイナミックライブラリ実行可能コードを共有する.最終的に実行時接続の目的を達成します.複数のプログラムが同じセグメントのコードを共有し、ディスクに複数のコピーを格納する必要がないという利点があります.欠点は、実行時にロードされるため、プログラムの前期実行性能に影響を与える可能性があります.
    利点メモリを節約し、ページ交換dllファイルとexeファイルの独立を減らすことができ、インタフェースが変わらないことを保証するだけで、dllファイルを交換することはexeに影響を与えず、メンテナンス性と拡張性を極めて高める異なるコンパイル言語は同じdllファイルで大規模なソフトウェア開発に適用することができ、開発過程が独立し、結合度が小さい.異なる開発者と開発組織者の間で開発とテストを容易にする.欠点プログラム依存dllファイルが存在しない場合、ダイナミックリンクをロードするとプログラムが終了し、エラーメッセージが表示され、実行時にダイナミックリンクプログラムのロードに失敗する速度が遅い
    区別する
  • 外部の関数(dllファイルorlibファイル)を複数回呼び出します.静的リンクには複数のコピーがあり、動的リンクには1つのコピー
  • しかありません.
  • 静的リンクではlibファイルの命令がexe実行ファイルに含まれ、動的リンクではdllファイルがexe実行ファイルに含まれる必要はなく、exeはいつでもこのdllファイルを動的にアンインストールして参照することができます.
  • 静的リンク・ライブラリには、他の動的リンク・ライブラリと静的ライブラリを含めることはできません.動的リンク・ライブラリには、他の動的リンク・ライブラリと静的ライブラリを含めることができます.