コンパイラの原理

16902 ワード

一、機械言語


マシン言語(machine language)は命令セットの体系である.このコマンドセットは、マシンコード(machine code)と呼ばれ、コンピュータのCPUが直接解読できるデータです.
機械言語はバイナリであると理解できる

二、ソースコード


ソースコード例ソースコード(source code)とは、コンパイルされていない一定のプログラム設計言語仕様に従って書かれたテキストファイルを指す.ソースコード(ソースプログラムとも呼ばれる)は、一連の人間が読むことができるコンピュータ言語命令を指す.

三、プリプロセッサ


プリプロセッサは、本格的なコンパイルが開始される前にコンパイラによって呼び出される独立したプログラムです.プリプロセッサは、注釈を削除したり、他のファイルを含んだり、マクロを実行したりすることができます(マクロmacroは重複文字の短い説明です).プリプロセッサは、FORTRANにRatforプリプロセッサを提供するなどの追加の機能を提供する追加のソフトウェアとして、Cのような言語によって要求されるか、または後で使用されることができる.

四、目標コード(目標ファイル)


1)ソースコードをコンパイルした後、CPUが直接認識できるバイナリコードを指す.
  2)
ターゲットコード(objectcode)とは、コンピュータ科学におけるコンパイラまたはアセンブリがソースコードを処理した後に生成されるコードを指し、一般的にマシンコードまたはマシン言語に近いコードから構成される.[1]ターゲットファイル(objectfile)は、ターゲットコードを格納するコンピュータファイルであり、バイナリファイル(binaries)と呼ばれることが多い.
ターゲットファイルには
マシンコード(コンピュータ中央プロセッサによって直接実行可能)及び
コードは、リンクやデバッグに使用されるプログラムシンボル(変数や関数の名前)などの再配置情報など、実行時に使用されるデータに加えて、他のデバッグ情報も含まれます.[2]ターゲットファイルはソースファイルからプログラムファイルを生成するプロセスの中間生成物であり、リンクはターゲットファイルをリンクすることによって実行可能ファイルまたはライブラリファイルを生成する.ターゲット・ファイルの唯一の要素はマシン・コードです.たとえば、組み込みシステム用のターゲット・ファイルにはマシン・コードのみが含まれる場合があります.
 

五、リンク


 
リンク(Linker)はプログラムで、
コンパイラまたはアセンブリによって生成された1つ以上のターゲットファイルをライブラリに追加して実行可能ファイルにリンクします.
ターゲットファイルは、マシンコードとリンクが使用可能な情報を含むプログラムモジュールです.簡単に言えば、リンクの仕事は未定義のシンボル参照を解析し、ターゲットファイルのプレースホルダをシンボルのアドレスに置き換えることです.リンクはまた、プログラム内の各ターゲットファイルのアドレス空間の組織を完了し、再配置作業に関連する可能性があります.

六、符号表


1)GCCコマンドのobjdump


objdumpは、ターゲットファイルまたは実行可能なターゲットファイルを表示する構成のGCCツールです
次の3つのコマンドは、ターゲットファイルとソースコードの関係を探索するのが好きな友人に十分です.Objdump-x objは、ある分類情報の形でターゲットファイルのデータ組織(いくつかのブロックに分けられる)を出力<このファイルが調べられるすべてのダイナミックライブラリ>objdump-t obj出力ターゲットファイルのシンボルテーブル()objdump-h obj出力ターゲットファイルのすべてのセグメントを要約()

2)objdump例


コードcpp
  1 #include<iostream>

  2 int main()

  3 {

  4         std::cout<<"ztao"<<std::endl;

  5         return 0;

  6 }

シンボルテーブル
[ztteng@ztteng 002]$ objdump -t ztao



ztao:     file format elf32-i386



SYMBOL TABLE:

08048134 l    d  .interp        00000000              .interp

08048148 l    d  .note.ABI-tag  00000000              .note.ABI-tag

08048168 l    d  .note.gnu.build-id     00000000              .note.gnu.build-id

0804818c l    d  .gnu.hash      00000000              .gnu.hash

080481c0 l    d  .dynsym        00000000              .dynsym

08048290 l    d  .dynstr        00000000              .dynstr

08048414 l    d  .gnu.version   00000000              .gnu.version

08048430 l    d  .gnu.version_r 00000000              .gnu.version_r

08048490 l    d  .rel.dyn       00000000              .rel.dyn

080484a0 l    d  .rel.plt       00000000              .rel.plt

080484e8 l    d  .init  00000000              .init

08048518 l    d  .plt   00000000              .plt

080485c0 l    d  .text  00000000              .text

080487ac l    d  .fini  00000000              .fini

080487c8 l    d  .rodata        00000000              .rodata

080487dc l    d  .eh_frame_hdr  00000000              .eh_frame_hdr

08048818 l    d  .eh_frame      00000000              .eh_frame

08049910 l    d  .ctors 00000000              .ctors

0804991c l    d  .dtors 00000000              .dtors

08049924 l    d  .jcr   00000000              .jcr

08049928 l    d  .dynamic       00000000              .dynamic

08049a08 l    d  .got   00000000              .got

08049a0c l    d  .got.plt       00000000              .got.plt

08049a3c l    d  .data  00000000              .data

08049a40 l    d  .bss   00000000              .bss

00000000 l    d  .comment       00000000              .comment

00000000 l    d  .debug_aranges 00000000              .debug_aranges

00000000 l    d  .debug_pubnames        00000000              .debug_pubnames

00000000 l    d  .debug_info    00000000              .debug_info

00000000 l    d  .debug_abbrev  00000000              .debug_abbrev

00000000 l    d  .debug_line    00000000              .debug_line

00000000 l    d  .debug_str     00000000              .debug_str

00000000 l    d  .debug_pubtypes        00000000              .debug_pubtypes

00000000 l    df *ABS*  00000000              crtstuff.c

08049910 l     O .ctors 00000000              __CTOR_LIST__

0804991c l     O .dtors 00000000              __DTOR_LIST__

08049924 l     O .jcr   00000000              __JCR_LIST__

080485f0 l     F .text  00000000              __do_global_dtors_aux

08049acc l     O .bss   00000001              completed.5963

08049ad0 l     O .bss   00000004              dtor_idx.5965

08048650 l     F .text  00000000              frame_dummy

00000000 l    df *ABS*  00000000              crtstuff.c

08049918 l     O .ctors 00000000              __CTOR_END__

0804890c l     O .eh_frame      00000000              __FRAME_END__

08049924 l     O .jcr   00000000              __JCR_END__

08048780 l     F .text  00000000              __do_global_ctors_aux

00000000 l    df *ABS*  00000000              ztao.cpp

08049ad4 l     O .bss   00000001              _ZStL8__ioinit

080486a8 l     F .text  00000040              _Z41__static_initialization_and_destruction_0ii

080486e8 l     F .text  0000001c              _GLOBAL__I_main

08049a0c l     O .got.plt       00000000              _GLOBAL_OFFSET_TABLE_

08049910 l       .ctors 00000000              __init_array_end

08049910 l       .ctors 00000000              __init_array_start

08049928 l     O .dynamic       00000000              _DYNAMIC

08049a3c  w      .data  00000000              data_start

00000000       F *UND*  00000000              __cxa_atexit@@GLIBC_2.1.3

08048710 g     F .text  00000005              __libc_csu_fini

080485c0 g     F .text  00000000              _start

00000000  w      *UND*  00000000              __gmon_start__

00000000  w      *UND*  00000000              _Jv_RegisterClasses

080487c8 g     O .rodata        00000004              _fp_hw

080487ac g     F .fini  00000000              _fini

00000000       F *UND*  00000000              _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4

00000000       F *UND*  00000000              __libc_start_main@@GLIBC_2.0

08048568       F *UND*  00000000              _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4

00000000       F *UND*  00000000              _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4

080487cc g     O .rodata        00000004              _IO_stdin_used

08049a3c g       .data  00000000              __data_start

08049a40 g     O .bss   0000008c              _ZSt4cout@@GLIBCXX_3.4

080487d0 g     O .rodata        00000000              .hidden __dso_handle

08049920 g     O .dtors 00000000              .hidden __DTOR_END__

08048720 g     F .text  0000005a              __libc_csu_init

08049a40 g       *ABS*  00000000              __bss_start

08049ad8 g       *ABS*  00000000              _end

00000000       F *UND*  00000000              _ZNSolsEPFRSoS_E@@GLIBCXX_3.4

08048598       F *UND*  00000000              _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4

08049a40 g       *ABS*  00000000              _edata

080485a8       F *UND*  00000000              __gxx_personality_v0@@CXXABI_1.3

0804877a g     F .text  00000000              .hidden __i686.get_pc_thunk.bx

08048674 g     F .text  00000034              main

080484e8 g     F .init  00000000              _init

 

七、コンパイラ


簡単に言えば、コンパイラは「高度な言語」を「機械言語(低レベル言語)」に翻訳するプログラムです.現代のコンパイラの主なワークフロー:ソースコード(source code)→プリプロセッサ(preprocessor)→コンパイラ(compiler)→ターゲットコード(object code)→リンク(Linker)→実行可能プログラム(executables)
コンパイラはアセンブリまたは高度なコンピュータ言語ソースプログラム(Source program)を入力としてターゲット言語(Target language)マシンコードの等価プログラムに翻訳する
 
 
 
 
 

八、C言語プログラムコンパイルのメモリ配分:


 
1.スタック領域(stack)--コンパイラは自動的に解放を割り当て、主に関数のパラメータ値、局所変数値などを格納する.
 
2.ヒープエリア(heap)--プログラマーによって割り当てられて解放される.
 
3.グローバルまたは静的領域--グローバル変数と静的変数を格納します.プログラム終了時にシステムによって解放され、グローバル初期化領域とグローバル未初期化領域に分けられる.
 
4.文字定数領域--定数文字列はこれに配置され、プログラムの終了時にシステムによって解放される.
 
5.プログラムコード領域