#概要
記述したプログラム(ソースコード)がコンピュータで実行可能なネイティブコード(機械語)になるまでのイメージをまとめました。
詳細なことを細かく、というよりは図を用いながらイメージを掴めることに主眼をおいています!
(コンパイル言語を想定して書いています)
「プログラムはなぜ動くのか」を要約した内容になります。
#目次
- 前提:コンピュータはネイティブコードしか実行できない
- ソースコードが実行可能なネイティブコードになるまで
- 余談
##前提:コンピュータはネイティブコードしか実行できない
ネイティブコードとは?
・0,1ですべての命令、データが表現されている
・CPUが実行できる単純な命令レベル(加算、データ読込等)まで分解されている
・windowsなら.exeの拡張子のファイルの中身
参考サイト
どんな言語でも最終的にはネイティブコードに変換されてCPUに実行される。
①C言語を例にすると、まずsample.cというソースコードを書いたとします。
ネイティブコードにしないとCPUが理解できないのでソースコードをネイティブコードに変換する必要があります。
②そこでコンパイラというソフトウェアを使ってネイティブコードに変換(コンパイル)します。
③すると、sample.objというファイルができます。
ただ、sample.objはネイティブコードになってはいますが、このままではCPUで実行できません
なぜなら、外部で定義されている情報が入っていないからです。
たとえば、sample.cではライブラリAからlibraryA_functionという関数をインポートして使っていたとします。
そしてlibraryA_functionはライブラリの中のlibrary2.objというファイルに定義されているとします。
sample.objにはlibraryA_functionに関するネイティブコードが入っていないのでCPUはこのファイルを実行できません。
④そこで、リンカ(linker)というソフトウェアを使って、実行のために必要なファイル、今回の例でいうとlibrary2.objをsample.objに連結させます。
⑤実行可能なファイルであるsample.exeができます
##余談
余談1
CPUの種類が違えば、ネイティブコードの種類も違います。
例えば、同じソースコードをコンパイルしてもx84とarmではそれぞれ違うネイティブコードになります。
余談2
ネイティブコード(機械語)は0,1で表現されていて人間には理解できませんが、機械語の命令に1対1で文字や記号を割り当てて人間に理解できるようにしているアセンブリ言語というものがあります。
compiler-explorerというサイトでは高水準言語(C言語など)をアセンブリ言語に変換して表示してくれます。