kzk0829’s blog

機械学習の学習のアウトプット+技術的な事+ポエム

オブジェクト指向でなぜ作るのか 第5章を読んだ

はじめに

kzk0829.hatenablog.com

これの続き

メモリの仕組みの理解はプログラマのたしなみ

  • 比較的新しく作られた言語は、メモリのことを意識しなくて済む
    • ただ、何が行われて動いているか理解していないと、途方にくれるかもしれない
    • だから最低限理解しておく必要があるよという章

コンパイラインタプリタ

  - コンパイル言語はコンパイラソースコード機械語に変換して実行を行う - インタプリタ言語は実行時にソースコードの解釈を行う

まあこの辺は当たり前の前提知識という感じ。
個人的にはコンパイル言語の方が好き。

上記以外に中間コード方式というのもある。
コンパイルはするが、専用のインタプリタ上で実行することで異なる実行環境でも動作する。(JVM上のJavaなど)
JavaJVM上で動作することは知っていたが、中間コード方式ということは知らなかった。

CPUは複数のスレッドを同時実行する

  • スレッドとはプロセスよりも小さな単位
  • スレッドは一つの作業を最初から最後まで一気に行うわけではなく、中断して他のスレッドの作業を実行する。
  • これをマルチスレッドという。

この辺も最低限は知っていた。
マルチスレッドができる理由は、全体効率を上げるため。CPUのリソースを効率よく使用することができる。

静的領域、ヒープ領域、スタック領域で管理する

メモリの使い方について。

  • メモリの領域は基本的に静的領域ヒープ領域スタック領域の3つの領域で管理する。

静的領域について

  • プログラムの開始時に確保され、プログラムが終了するまで配置が固定される領域のこと
  • 静的な変数、つまりグローバル変数とプログラムの命令を実行可能な形式に変換したコードが配置される

ヒープ領域について

  • プログラムの実行時に動的に確保するメモリ領域のこと
  • 必要に応じてアプリケーションに割り当てる

スタック領域について

  • スレッドの制御のために使うメモリ領域のこと
  • スレッドに一つずつ用意される
  • メソッドの引数やローカル変数、戻り値などが格納される

この辺の領域については曖昧な知識だったので、改めて確認することができてよかった。
ここまで説明されてきた、内容はあくまで常識とのこと。
心に留めておきたい。

OOPの特徴はメモリの使い方にあり

ここからはOOP固有の話

クラス情報はクラスにつき1つだけロードされる

  • 同じクラスから作られた異なるインスタンスであっても、メソッドに書かれたコード情報同じため、1つのロードが行われる
  • このクラス情報がロードされる領域は静的領域

インスタンス生成のたびにヒープ領域が使われる

  • 作成したインスタンスは全てヒープ領域に格納される
  • プログラマは、」有限なメモリ領域であるヒープ領域を大量に使って動くことを理解しておくべき

変数にはインスタンスのポインタが格納される

  • 作成したインスタンスを格納する変数には、ヒープ領域に作成されたインスタンスのポインタが格納される
  • ポインタはメモリ領域の場所を示す情報
  • javaでは変数のコピーに注意が必要
    • 変数にはポインタが入るため

まとめ

この章は結構ボリュームがあった。
なんとなくで知っていたことや、意外と知らなかった知識を分かりやすいJavaのコード例と、図で示してくれていたので、とても勉強になった。
今まではあまりなかったが、これからはちょっとはメモリのことを意識してコードを書いていきたい。