okinawa

勉強メモ

プログラムはなぜ動くのかを読んだメモ

 

私が読んだのは第2版。

www.nikkeibp.co.jp

 

型宣言はメモリ領域の確保

charは1バイト型

shortは2バイト型

longは4バイト型

型宣言すると上記のメモリ領域が確保される。

C言語のポインタ

ポインタはデータ型を意識すると理解しやすい。

ポインタ宣言はWindows用プログラムの場合、32ビットのメモリ領域を確保する。

 

char *d; // charのポインタ宣言。32ビットメモリ領域。

short *e; // shortのポインタ宣言。32ビットメモリ領域。

long *f; // long型のポインタ宣言。32ビットメモリ領域。

 

どの型で宣言してもポインタはメモリ領域を32ビット確保する。

じゃあ何が違うのか?

ポインタに格納されたアドレスから一度に何バイトのデータを読み書きするかが違う。

charなら1バイトずつ読み書き。

shortなら2バイトずつ読み書き。

longなら4バイトずつ読み書き。

 

Java機械語に変換されるまで

ソースコード(sample.java)→バイトコード(sample.class)
→ネイティブコード(ここでJava仮想マシンが各OSに合わせる)

ちなみにCPUの種類が変わればネイティブコードの種類も変わる。
x86/x64/AMD64とか色々あるらしい。

 

 32bitCPUと64bitCPU

32bitCPUが4GB以上のメモリを認識できないのは2の32乗が4GBだから。

64bitは128TB。

128TBのメモリが普及するのはいつ頃だろう。

 

リンク・リンカーとは

ソースコードには書かれていないが必要なものを取ってくる処理。
たとえばSystem.out.println()とソースに書いたとする。
しかし、そのソース内にはprinlnメソッドの処理内容は書かれていない。
なので、必要なソースを取ってきて結合する。
ちなみに不要な記述を削除するのもやっているらしい。

ソースコード(sample.java)→リンク→バイトコード(sample.class)→ネイティブコード→.exeファイル

 

.exeと.dllの違い

.exeは特定のアプリケーションの実行ファイル。
.dllは複数のアプリケーションの実行時に呼び出されるファイル。色々な関数とかが入っているらしい。
ダイナミックリンクライブラリだからライブラリだったんですねえ。

DLLファイル(Dynamic Link Library)とは - IT用語辞典 e-Words

 

インタプリタコンパイル

インタプリタ:実行時にソースコードの内容を1行ずつ解釈して処理する。
コンパイラ:実行前にソースコード全体を解釈して処理する。

 

ビルドとは

コンパイルとリンクを行うこと。

 

システムコール

OSのカーネル機能の呼び出し。

カーネルとはアプリケーションとハードウェアの架け橋。

 

例:printf
printf→OSに対してシステムコール→OSがハードウェアを制御→ディスプレイに文字列表示


windowsではシステムコールのことをAPIと言うらしい。

ハードウェア制御のときだけシステムコールされる?

 

ハードウェア視点でのプログラム処理の流れ

補助記憶装置(HDD/SSDなど)にある高級言語がネイティブコードに変換される
→ネイティブコードが主記憶装置(メモリ)に格納される
→CPUがメモリから命令やデータを読み出し、CPU内部のレジスタに格納して処理する

 


レジスタとは

レジスタとは、マイクロプロセッサ(MPU/CPU)内部にある、演算や実行状態の保持に用いる記憶素子。

最も高速な記憶装置だが、一般的なCPU製品で数個から数十個(容量に換算して数十バイト程度)と数が限られる。

GPUなど特殊なプロセッサでは数万個(数百キロバイト)のレジスタを内蔵するものもある。

 レジスタ(register)とは - IT用語辞典 e-Words