プログラムはなぜ動くのか 知っておきたいプログラミングの基礎 第2版

os CPU データ構造 メモリー

2018-06-24 23:56:28

プログラムはなぜ動くのか 知っておきたいプログラミングの基礎 第2版

  • 第1章 プログラマにとってCPUとは
  • 第2章 データを2進数でイメージしよう
  • 第3章 コンピュータが小数点数の計算を間違える理由
  • 第4章 四角いメモリーを丸く使う
  • 第5章 メモリーとディスクの親密な関係
  • 第6章 自分でデータを圧縮してみよう
  • 第7章 プログラムはどんな環境で動くのか
  • 第8章 ソース・ファイルから実行可能ファイルができるまで
  • 第9章 OSとアプリケーションの関係
  • 第10章 アセンブリ言語からプログラムの本当の姿を知る
  • 第11章 ハードウエアを制御する方法
  • 第12章 コンピュータに「考え」させるためには

第1章 プログラマにとってCPUとは

  • 問題
    • プログラムとは?
      • コンピューターに実行させる処理の順番を示すもの
    • プログラムの中には、何が含まれるか?
      • 命令とデータ
    • マシン語とは?
      • CPUが直接解釈できる言語
    • 実行時のプログラムが格納されている場所
      • メモリー(メイン・メモリー)
    • メモリーのアドレスとは?
      • メモリー上で命令やデータが格納されている場所を示す値
    • コンピューターの構成要素の中で、プログラムを解釈・実行する装置
      • CPU

CPUの中身をのぞいてみよう

p.13

  • CPU
    • Central Processing Unit
    • ON/OFF水地の機能を持った素子であるトランジスタから構成されている
    • CPUの内部
      • レジスタ
        • 命令やデータを格納する一種のメモリ
      • 制御装置
        • メモリー上の命令やデータを呼び出す
        • 命令の実行結果に応じてコンピュータ全体を制御
      • 演算装置
        • メモリーからレジスタに読み出されたデータを演算
      • クロック
        • CPUが動作するタイミングとなるクロック信号を発生させる
          • クロック周波数が大きいほどCPUの動作は高速

第2章 データを2進数でイメージしよう

コンピュータが情報を2進数で取り扱う理由

p.33

  • IC
    • Integrated Circuit(集積回路)
    • ICが持つピン
      • 直流電圧が0Vか+5V(5V以下を扱うICもある)しか流れない。(ハイインピーダンスは考慮しないものとする)
        • 2つの状態しか表せない
          • ICの状態が2進数に合う
        • ハイインピーダンス
            - 電気信号を受け入れない状態

ところで2進数とは?

p.35

  • 重み
    • 10進数の39
    • 3×10と9×1
    • 10や1を重みという
    • 10進数の場合の重みは1桁目10の0乗、2桁目10の1乗、3桁目10の2乗...
    • 2進数
    • 1桁目2の0乗、2桁目2の1乗、3桁目3の2乗...
    • 基数
    • 〇〇の☓☓乗の〇〇の部分のこと
    • 重み
    • 2進数の39
    • 00100111
    • (0×128)+(0×64)+(1×32)+(0×16)+(0×8)+(1×4)+(1×2)+(1×1)=39

第4章 四角いメモリーを丸く使う

  • 問題
    • アドレス信号ピンを10本持ったメモリーICで指定できるアドレスの範囲は?
      • 2進数で0000000000~1111111111
      • 10進数で0~1023
    • 高水準言語のデータ型は何を表すものか?
      • メモリー領域を専有するサイズとそこに格納されるデータの形式
    • 32ビットでメモリー・アドレスを表す環境では、ポインタとなる変数のサイズは何ビットか?
      • 32ビット
    • 物理的なメモリーの構造と同様なのは、何バイトのデータ型か?
      • 1バイト
    • LIFO方式でデータを読み書きする構造を何というか?
      • スタック
    • データの大小に応じてリストが2方向に枝分かれするデータ構造を何と呼ぶか?
      • 2分探索木(バイナリー・サーチ・ツリー)

スタックとキュー、さらにリング・バッファ

p.83

  • スタック
    • LIFO(Last In First Out)
  • キュー
    • FIFO(First In First Out)

第5章 メモリーとディスクの親密な関係

  • 問題
    • ストアド・プログラム方式とは?
    • 記憶装置にプログラムを格納し、逐次実行する方式
    • メモリーを使ってディスクのアクセス速度を向上させることを何と呼ぶか?
    • ディスク・キャッシュ
    • ディスクの一部を仮想的にメモリーとして使う仕組みを何と呼ぶか?
    • 仮想記憶(仮想メモリー)
    • プログラムのEXEファイルの中に、関数を静的に結合することを何と呼ぶか?
      • DLL(Dynamic Link Library)
      • 関数を結合する方式
      • スタティック・リンク
      • ダイナミック・リンク
    • Windowsパソコンにおいて、一般的なハード・ディスクの1セクターは何バイトか?
    • 512バイト
    • セクターはディスクの物理的な記憶単位

メモリーに読み出さないと実行できない

p.97

  • プログラムはメモリーにロードされてから実行される

ディスク・アクセスを高速化する「ディスク・キャッシュ」

p.99

  • データを利用するアプリケーション
    • データを初めて読み出すときはディスクから読み出す(低速)
    • ディスクから読み出されたデータをメモリーの一部に保存(ディスク・キャッシュ)
    • 同じデータを再度読み出す場合はメモリーから読み出す(高速)

ディスクをメモリの一部として使う「仮想記憶」

p.100

  • 仮想記憶
    • ディスクの一部を仮想的にメモリーとして使う
    • メモリーが不足している状態でもプログラムの実行が可能
      • 実際に実行するプログラムの部分はメモリ上に存在する必要がある
      • メモリ(実メモリまたは物理メモリと呼ぶ)とディスク上の仮想メモリの内容を部分的に置き換えながら(スワップしながら)プログラムを実行する必要がある
      • 仮想記憶の手法
        • ページング方式
          • ページイン
            • ディスクの内容をメモリに読み出すこと
          • ページアウト
            • メモリーの内容をディスクに書き込むこと
        • セグメント方式
          • 実行されるプログラムを処理やデータの集合などの単位にまとめたセグメントに分割
          • セグメント単位でメモリーとディスク間の置き換えを実行

ディスクの物理構造も見ておこう

p.108

  • ディスクの領域の区切り方
    • セクター方式
      • 固定長の領域に区切る
      • トラック
        • ディスクの表面を同心円状に区切った領域
      • セクター
        • トラックを固定長サイズに区切った領域
           - Wikipedia)
      • クラスタ
        • 論理的にディスクを読み書きする単位
    • バリアブル方式
      • 可変長の領域に区切る

第6章 自分でデータを圧縮してみよう

  • 問題
    • ファイルにデータが記憶される基本単位は?
    • Shift JISにおける半角英数の1文字は何バイト?
      • 1バイト(8ビット)

ファイルにはバイト単位で記録する

p.115

  • ファイルに書くのされるデータ単位
    • バイト

第7章 プログラムはどんな環境で動くのか

  • 問題
    • アプリケーションの動作環境は何で示されるか?
      • OSとコンピュータ本体(ハードウェア)の種類

第8章 ソース・ファイルから実行可能ファイルができるまで

  • 問題
    • CPUが解釈・実行できる形式のプログラムを何コードと呼ぶか?
      • ネイティブコード
    • プログラムの実行時に、データやオブジェクトのために動的に確保されるメモリー領域を何と呼ぶか?
      • ヒープ

ロード時に作られるスタックとヒープ 

p.165

  • スタック
    • 関数内部で一時的にしようされる変数(ローカル変数など)や、関数を呼び出すときの引数を格納するためのメモリー領域
  • ヒープ
    • プログラムの実行時に任意のデータやオブジェクトを格納するためのメモリー領域

ちょっと高度なQ&A

p.167

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

第9章 OSとアプリケーションの関係

  • 問題
    • モニター・プログラムの主な機能は何か?
      • プログラムのロードと実行
    • OSの上で動作するプログラムのことを何と呼ぶか?
      • アプリケーションまたは応用プログラム
    • OSが提供する機能を呼び出すことを何と呼ぶか?
      • システムコール

第10章 アセンブリ言語からプログラムの本当の姿を知る

  • 問題
    • ネイティブコードの命令にその機能を表す英語の略称をつけたものを何と呼ぶか?
      • ニーモニック
    • アセンブリ言語のソースコードをネイティブコードに変換すること何と呼ぶか?
      • アセンブル
      • 逆は逆アセンブル
    • アセンブリ言語におけるセグメントとは何か?
      • プログラムを構成する命令やデータをまとめたグループのこと