LoginSignup
1
1

More than 1 year has passed since last update.

ソースコードがネイティブコード(機械語)になるまで

Last updated at Posted at 2021-10-18

概要

記述したプログラム(ソースコード)がコンピュータで実行可能なネイティブコード(機械語)になるまでのイメージをまとめました。

詳細なことを細かく、というよりは図を用いながらイメージを掴めることに主眼をおいています!
(コンパイル言語を想定して書いています)

「プログラムはなぜ動くのか」を要約した内容になります。

目次

  • 前提:コンピュータはネイティブコードしか実行できない
  • ソースコードが実行可能なネイティブコードになるまで
  • 余談

前提:コンピュータはネイティブコードしか実行できない

ネイティブコードとは?
・0,1ですべての命令、データが表現されている
・CPUが実行できる単純な命令レベル(加算、データ読込等)まで分解されている
・windowsなら.exeの拡張子のファイルの中身
参考サイト

ネイティブコードのイメージ↓
スクリーンショット 2021-10-16 9.12.31.png

どんな言語でも最終的にはネイティブコードに変換されてCPUに実行される。
スクリーンショット 2021-10-16 9.28.12.png

ソースコードが実行可能なネイティブコードになるまで

スクリーンショット 2021-10-16 10.09.54.png

①C言語を例にすると、まずsample.cというソースコードを書いたとします。
ネイティブコードにしないとCPUが理解できないのでソースコードをネイティブコードに変換する必要があります。

②そこでコンパイラというソフトウェアを使ってネイティブコードに変換(コンパイル)します。

③すると、sample.objというファイルができます。
ただ、sample.objはネイティブコードになってはいますが、このままではCPUで実行できません:sweat_smile:

なぜなら、外部で定義されている情報が入っていないからです。

たとえば、sample.cではライブラリAからlibraryA_functionという関数をインポートして使っていたとします。
そしてlibraryA_functionはライブラリの中のlibrary2.objというファイルに定義されているとします。

sample.objにはlibraryA_functionに関するネイティブコードが入っていないのでCPUはこのファイルを実行できません。

④そこで、リンカ(linker)というソフトウェアを使って、実行のために必要なファイル、今回の例でいうとlibrary2.objをsample.objに連結させます。

⑤実行可能なファイルであるsample.exeができます:raised_hands:

余談

余談1
CPUの種類が違えば、ネイティブコードの種類も違います。
例えば、同じソースコードをコンパイルしてもx84とarmではそれぞれ違うネイティブコードになります。

余談2
ネイティブコード(機械語)は0,1で表現されていて人間には理解できませんが、機械語の命令に1対1で文字や記号を割り当てて人間に理解できるようにしているアセンブリ言語というものがあります。

compiler-explorerというサイトでは高水準言語(C言語など)をアセンブリ言語に変換して表示してくれます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1