tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

コンピュータでプログラムが動く仕組み

コンピュータでプログラムが動く仕組み(ざっくり理解)

  • プログラムはメモリ上で命令の列として書かれている
  • メモリ上にある命令をCPUが順番に読み出し、演算を行い結果をメモリに出力する

少し詳しい説明と補足

コンピュータの概要

コンピュータとは、与えられた手順に沿って計算を行う機械のこと。コンピュータは5つの装置から構成される。5つの装置とその実例は次の通り。

  1. 制御装置:CPU(中央処理装置)
  2. 演算装置:CPU(中央処理装置)
  3. 記憶装置:メモリ(主記憶装置)、ハードディスクやSSDなど(補助記憶装置)
  4. 入力装置:キーボードやマウスなど
  5. 出力装置:モニタなど

プログラムの概要

プログラムとは、コンピュータに対する命令を記述したもの。簡単な計算を行うもの、Webアプリケーション、機械学習を行うもの、オペレーティングシステムBIOSなど様々なものがあるが、これらはすべてプログラムといえる。

プログラミング言語のGOで2つの数を足して標準出力に表示するプログラムのソースコード

package main

import "fmt"

func main() {
    a := 2
    b := 3
    fmt.Println(a + b)
}

実行結果(Windows上で実行しています)

$ go build .\hello.go
$ ./hello.exe
5
$ 

プログラムは実行されると*1、メモリ上に命令の列として展開されて、CPUによりその命令に沿って演算が行われる。

ソースコードとネイティブコード

「プログラムの概要」で挙げたプログラムは人間が読み書きしやすい形式になっている。このような形式で書かれているプログラムをソースコードと呼ぶ。しかし、メモリ上に展開されている命令列はソースコードそのままの形ではなく、コンピュータが読むことができる数字の列になっている。この数字の列をネイティブコード(または機械語)と呼ぶ*2

ネイティブコードは CPUの種類ごとに固有の形式である*3。CPUごとに使える命令が決まっており(使える命令の一式を命令セットと呼ぶ)、そのCPUで使える命令で表現したものがネイティブコードのため、必然的にネイティブコードはCPUの種類ごとになる。言い換えると、同じソースコードから返還されたネイティブコードでもCPUが違えば異なる命令列となる。

ソースコードをネイティブコードに変換する手段は、ソースコードを記述するプログラミング言語に依存する*4C言語やGO言語などの場合はコンパイラというソフトウェアがソースコードからネイティブコードへの変換を行う。

まとめ

プログラムは人間の読み書きできる形式のソースコードからコンパイラ等により、コンピュータが読める命令の列(=ネイティブコード)に変換される。プログラムが実行されるとメモリ上にネイティブコードが展開され、CPUは順番に命令の列を読み込み演算を行い、結果をメモリに格納する。これによって、コンピュータでプログラムが実行できる。

参考にしたもの

プログラムが動く仕組みについて

第1話 プログラムが動く仕組み - 6さいからのプログラミング

CPUについて

【PC基礎】CPU基礎 8vivid.net xtech.nikkei.com

コンピュータそのものについて

コンピュータの構成 | ITの基礎知識|ITパスポート・基本情報 e-words.jp

メモリについて

e-words.jp

関連リンク

tanke25616429.hatenablog.com

*1: 例では./hello.exeと書いてEnterを押した瞬間に実行される。

*2:機械語の対義語を高級言語と呼んでいることも見たことある気がするが、高級言語の反対は低級言語すなわちアセンブリ言語、というのが妥当な気がする。なので本記事では機械語とネイティブコードを同義とし、対義語をソースコードと呼んだ。

*3:種類、というと曖昧だがアーキテクチャごとに固有ということ。アーキテクチャの種類としてはx86_64とか。

*4:正確には、言語処理系に依存する、としたほうがよいかもしれない。参考: http://www.hpcs.cs.tsukuba.ac.jp/~msato/lecture-note/comp-lecture/note1.html