Open11
プログラムはなぜ動くのかメモ
1章
- メモリはCPUと制御チップを介してつながっている
- メモリは1バイト(8ビット)ごとにアドレスがついている
- CPUはこのアドレスをつかって命令やデータを呼び出したり、書き込んだりする。
- レジスタにメモリのデータやアドレスを保存して、演算をしている
- アセンブリ言語はレジスタに向かって命令を書いている
CPUを一言で説明するには・・
CPUはトランジスタやクロックなどの集まり。マシン語を解釈するところ。エンジニアとして大事なのは、レジスタ。レジスタはメモリのアドレスを保存して、メモリに書かれているデータの取得や、処理、書き込みなどを行う。
アセンブリ言語とは・・・
マシン語と一対一になった言語。アセンブリをマシン語に変換(アセンブル)して実行する。マシン語をアセンブリ語に変換することを逆アセンブルという。
2章 2進法
- 2進法は
- 掛け算や割り算の場合はshift演算が使われる
- 2進法のマイナスを表現するには補数が使われる。すべての値を反転し、+1した値。
3章 小数点以下の計算
- 10進法の小数点数には2進法で正しく表せないものがある
- 誤差は無視するか、いったん整数に直すことで回避する
4章 四角いメモリーを丸く使う
- 配列の添え字はインデックス・レジスタの値
- 添え字を指定しなくても配列として使う方法がある。ほとんどのプログラムはそうやってメモリを使っているスタックとキュー。
- スタック
- 後入れ先出し(後にいれたものを先に使う)
- キュー
- 先入れ先出し(入れた順番通りに使う)
- スタック
5章 ディスク
- メモリは小用量・高速、ディスクは大容量・低速
- ディスクのままプログラムを実行することはできない、メモリーにロードされてから実行
- 一度ディスクからメモリにロードしたもの
- 現在はハードディスクの性能が上がったためほとんど使われない
- 仮想メモリー
- ディスクの一部を仮想のメモリとして扱う
- 呼び出すときにはメモリとスワップしながら行う
- windowsでは4KBのページとしてメモリからディスクに書きだして使う
- メモリを節約する方法
- DLLファイルだとアプリ間でファイルを共有できる
- クリーンアップ
6章 圧縮
- データ×回数で表したものをランレングス法という
- ハフマン法
7章 プログラムはどんな環境で動くのか
- CPUはそのCPU専用のマシン語しか理解できない
- windows用アプリケーションは他のアプリがハードウェアを直接制御するのではなく、OS西礼を出して動かすため、ハードウェアを意識することなく動作することができた。
- windowsが広く使われるようになった理由
- しかし、CPUの違いは吸収できず、CPUごと用のアプリが必要だった
- アプリケーションからOSに指令を出すAPIがある
- エミュレータは異なるOS上で仮想的にOSを動かす
java
- javaはjavaで書かれたコードをバイトコードに変換し、javaVMでネイティブコードに変換し実行する
8章 コードが実行されるまで
- C言語→コンパイル→オブジェクトファイルが生成(ネイティブコードだが読めない)
- 関数ごとでオブジェクトファイルが作られるため、それを結合するためにリンクが行われる
- リンクする際はスタートアップファイルと、その他ライブラリを付けて行う
- リンカーは仮のメモリのアドレス情報を与えてあとから実際のアドレスと入れ替える
- ヒープはオブジェクトのデータを保存する領域
- スタックはローカル変数など、関数の内部で使われる一部のデータを保存するための領域
9章 OSとアプリケーション
- アプリの中で共通した処理をまとめたもの(文字入力やコンパイラなど)
- アプリケーションはOSに指令を出し、OSからハードウェア(メモリなど)を操作する
- OSの中の関数を呼び出すことをシステム・コールという
- 高級言語が関数を使うとき、一つまたは複数のシステムコールを内部的に行っている
- OSと高級言語がハードウェアを抽象化している
10章 アセンブリ言語
- C言語のコンパイラの多くはアセンブリ語にコンパイルしてからネイティブコードにアセンブルしている
- アセンブリ言語には命令(オペコード)と疑似命令がある
- 疑似命令はアセンブラに対しての指令
- アセンブリ言語の命令はオペコードとオペランド(ない場合もある)を合わせたもの
- オペコードが動詞、オペランドが目的語になる
11章
コンピューター本体や、周辺装置の電気特性を相互に変換するICをI/Oコントローラーという