Ch1.2 Programs Are Translated by Other Programs into Different Forms


1.2 Programs Are Translated by Other Programs into Different Forms


ハロープログラムは高度なCプログラムとして旅を開始します.Cプログラムは人間に読まれ理解されるからだ.しかし、hello.cをシステムで実行するためには、単一のC文は、他のプログラムによってlow-level machine-languageの構築に変換されなければならない.これらのコンストラクションはexecutable object program形式でパッケージ化され、バイナリディスクファイルとして格納されます.オブジェクトプログラムはexecutable object fileと呼ばれます.
UNIXシステムからソースファイルからオブジェクトファイルへの変換はcompiler driverによって実行される.
linux> gcc -o hello hello.c
ここで、GCCコンパイラドライバはhelloです.cソースファイルを読み出し、helloと呼ばれる実行可能オブジェクトファイルに変換する.この遷移は、連続する4つのステップから構成されます.この4つのステップを行うプログラム(プリプロセッサ、コンパイラ、アセンブリ、およびリンク)を合わせてcompliation systemと呼ぶ.
  • 前処理フェーズ:プリプロセッサは「#」で始まる指示に従って変更されます.例えば、hello.c プログラムの#include <stdio.h>コマンドは、フロントプロセッサにシステムヘッダファイルのstdio.hの内容を読み取り、プログラムtextに挿入するように要求する.結果は異なる形式のCプログラムであり、通常は.i接尾辞を有する.
  • コンパイルフェーズ:コンパイラ(cc 1)は、hello.iテキストファイルをコンポーネントを含むhello.sテキストファイルに変換する.hello.sファイルには、この定義を持つmain関数が含まれます.
  • 1 main:
    2	subq $8, %rsp
    3	movl $.LCO, %edi
    4	call puts
    5	movl $0, %eax
    6	addq $8, %rsp
    7	ret
    2〜7各ラインは、低レベルのマシン言語構築を記述する.コンポーネントは非常に役立ちます.コンポーネントは、他のコンパイラやその他の高度な言語に共通言語を提供するためです.たとえば、Cコンパイラとポートは同じコンポーネント結果ファイルを作成します.
  • Assemblyフェーズ:次に、アセンブリ(as)はhelloです.sを機械構築に変換します.マシンビルダーは、relocatable objectの形式で結合され、結果を対象ファイルhello.oとして保存する.このファイルは、エンコードされたプライマリ関数で構築された17バイトを含むバイナリファイルです.もし私たちがhelloだったらテキストエディタを使用してoファイルを表示しようとすると、認識できない可能性があります.
  • リンクフェーズ:helloプログラムは、すべてのCコンパイラが提供するC標準ライブラリの一部であるprintf関数を呼び出すことに注意してください.printf関数は、事前にコンパイルされたprintf.oオブジェクトファイルにあります.このセクションはhello.oプログラムにマージする必要があります.リンカーはこの合併を実行した.結果はhelloファイルで、これは実行可能オブジェクトファイルです.この実行可能オブジェクトファイルはメモリにロードされ、システムによって実行される準備ができています.