プログラムはなぜ動くのか(後編)

プログラムはなぜ動くのか

 

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

 

■ランレングス法

・文字が何回連続したとかで圧縮する。

 →画像ファイルとかはいいけど、文字ファイルとかだとサイズが大きくなることも。

 

■ハフマン法(LHA)

・文字が多く使われている文字に、少ないバイナリーを割り当てる。

 例えば、文章中にあが最多で10回だったから、「10」を割り当てる。

 通常なら1バイトとかだが、これなら2ビットで済む。

・ハフマン木によって判別。詳しくは調べて。

 

 

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

 

■CPUはそのCPU固有のマシン言語しか解釈できない

マシン語になっているプログラムを「ネイティブ・コード」、C言語などで作成したプログラムを「ソース・コード」と呼ぶ。

・「ソース・コード」→コンパイル→「ネイティブ・コード」

 

■OSによってCPU以外の違いが吸収される

Windows 以前のMS-DOS では、アプリケーションはマシン毎に作られる必要があった。というのも、OSの機能を利用できるときと、直接ハードウェアを制御する必要があるときがあったから。

・ただし、Windows OS自体は、CPU毎に固有のマシン語が使われているため、それぞれ作れられなければならない。

 

FreeBSD

UNIX 系のOS

Ports という仕組みを用いることで、異なるCPUでも同じネイティブコードを再利用できる。アプリケーションのソースコードを現在のハードウェアに合わせてコンパイルして、確実に実行できるソースコードを取得。目的のアプリケーションのソースコードがハードディスク上になければ、自動的にFTPを使って取得。

 

エミュレータ

・マシンのOSとは異なるOSを使える。仮想環境のこと?

 

Java 仮想マシン

Java ソースコード → バイトコード → Java 仮想マシン(CPU毎に異なる) → ネイティブ・コード

 

BIOS とブート・ストラップ

BIOSBasic Input/Output System )

 ーROMに記憶され、あらかじめコンピュータ本体に内蔵されているプログラム。

  キーボード、ディスク、グラフィックス・ボードなどの基本制御プラグラムに加

  えて、「ブート・ストラップ・ローダー」を起動する機能を持っている。

・ブート・ストラップ・ローダー

 ーハード・ディスクなどに記憶されたOSをメモリにロードして実行する機能。

 

 

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

 

コンパイラ

・各言語用のコンパイラがソース・コードをマシン言語に翻訳する。

・どの言語用か、どのCPU用か、どの環境で使うのかによって異なったコンパイラが必要。

 

■実行可能ファイルの生成

・ソースファイル → (コンパイル) → オブジェクト・ファイル + スタートアップ + ライブラリファイル + インポートライブラリ → (リンク) → 実行可能ファイル

・オブジェクトファイルとは、データと処理の集合体でネイティブ・コードだが未完成である。というのも、外部シンボルが未解決であるから。

・外部シンボル(他オブジェクト・ファイル内にある関数や変数)の解決には、スタートアップやライブラリ・ファイルを結合する必要がある。

・スタートアップ ー 全てのプログラムの先頭に結合する共通的な処理が記述されたオブジェクトファイル。

・ライブラリファイル - 複数のオブジェクトファイルをまとめて1つのファイルに格納したもの。リンカーで指定すると、必要なオブジェクトファイルだけを抽出して、他のオブジェクトファイルと結合して実行可能ファイルを生成する。

・インポートライブラリ - DLLファイルが格納されているフォルダ情報だけが存在する。プログラム実行時に関数が結合されるというダイナミックリンクが行われる。( ↔ スタティックリンク ー オブジェクトファイルの場所情報ではなく、実体が直接実行可能ファイルに結合される形式)

 

■実行可能ファイルの実行

・EXEファイルのメモリー・アドレスはどうなっている?

 EXEファイルの中で、変数や関数に仮のメモリー・アドレスが与えられ、実行時に実際のメモリー・アドレスに変換される。

 EXEファイルの先頭にメモリー・アドレスの変換が必要な部分を示す情報である再配置情報がリンカーによって付加してされており、それを参照する。

 再配置情報は相対アドレスとなっている。

・ロードされたプログラムは、変数、関数、スタック、ヒープのための4つの領域からなっている。

・スタック - ローカル変数や関数呼び出しの引数を格納するためのデータ領域。関数処理の前後で確保・解放が暗黙的に行われる。

・ヒープ - プログラム実行時に任意のデータやオブジェクトを格納するためのメモリー領域。明示的にメモリー確保・解放を行う必要があるので、メモリー・リークに注意する必要がある。

 

■TIPS

コンパイラ ー 実行前にソースコード全体を解釈して処理する。

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

・分割コンパイル ー プログラム全体を複数のソースコードに分割して、別々にコンパイルして、最後に1つの実行可能ファイルにリンク。ソースコードが短くなるので、プログラムの管理がよういになる。

・DLLファイルのメリット ー DLLファイルの中にある関数は複数のプラグラムから共有されることで、メモリーとディスクを節約できる。関数の内容を修正しても、スタティックリンクを再度する必要がない。

ガベージコレクションGC) ー 処理が終わって不要となったヒープ領域のデータやオブジェクトを破棄し、メモリー領域を解放すること。

 

 

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

 

■システム・コール

・アプリケーションが、OSの機能を呼び出すこと。

・高水準言語では独自の関数名を用いて、それがコンパイルされるときに該当するOSの(複数の)システム・コールに変換するされる。

・直接システム・コールを呼び出すことが可能な高水準言語も存在するが、移植性が悪い。

 

■OSと高水準言語によってハードウェアが抽象化される

・OSの提供するシステム・コールによって、ハードウェアを直接制御する必要がなくなる。高水準言語を用いることで、システム・コールの存在を意識することがなくなる。

 

■WindowsOSの特徴

・32(64)ビットOSである ー Windowsがデータを処理する基本単位が32ビット。

APIという関数セットでシステム・コールを提供する ー APIはいくつかのDLLファイルとして提供される。

GUIマルチタスク機能、ミドルウェアを提供する。

WYSIWYG(What You See Is What You Get) - ディスプレイに表示されたものをそのまま印刷できること。

・プラグ&プレイによるデバイス・ドライバの自動設定ができる

 プラグ&プレイ ー 新しい装置を接続すると、すぐに使える仕組みのこと。

 デバイス・ドライバ ー OSの一部であり、ハードウェアとの基本的な入出力を行う機能を提供するもの。デバイス・ドライバと同時に、このハードウェアを利用するためのAPIが格納されているDLLファイルがインストールされることがあり、このAPIを利用してハードウェアを利用するアプリケーションを作成できる。

 

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

 

アセンブリ言語はネイティブ・コードと1対1に対応

ニーモニック ー マシン語を簡略化した英単語や記号の組み合わせに置換したもの。

アセンブラ ー アセンブリ言語をネイティブ・コードに変換するもの。

 

アセンブリ言語の構文は「オペコード + オペランド

・ 例) mov ebp, esp ー esp の値をebpに格納する。

・オペコード ー 命令の動作( mov など)

オペランド ー 目的語(データの格納先のメモリアドレスや値など)

 

 

ーー第11章 ハードウェアを制御する方法ーー

 

■ハードウェアとの入出力はIN命令とOUT命令で

・IN命令 ー 指定したポート番号のポートからデータを入力し、それをCPU内部のレジスタに格納する。

・OUT命令 ー CPUのレジスタに格納されているデータを指定したポート番号のポートに出力する。

・I / O コントローラ ー コンピュータ本体と周辺装置を接続するためのコネクタに接続され、本体と周辺装置の電気的特性を相互に変換するIC。電圧の違いやデジタルとアナログの違いなどを変換する。

・ポート ー I / O コントローラに内在するメモリー。入出力されるデータを一時的に格納する。

・ポート番号( I / O アドレス ) ー IN命令やOUT命令ではポート番号で指定したポートとCPUの間でデータの入出力を行う。

 

■周辺装置の割り込み要求

・割り込み処理 ー 現在実行中のプラグラムを中断して、他のプログラムに実行を写すために必要な仕組み。

IRQ( Interrupt Request ) ー 割り込み要求を行なった周辺装置を特定するための番号(ポート番号とは別の番号が使われる)。

 

■DMAによって大量のデータを短時間で転送できる。

・DMA( Direct Memory Access ) ー CPUを介さずに周辺装置が直接コンピュータのメインメモリーとデータ転送を行うこと。

・DMAチャネルによって、DMAを行う周辺装置の種類を識別する。

・I/Oポート番号、IRQ、DMAチャネルは周辺装置を識別するために必要。ただし、IRQとDMAチャネルはどの周辺装置にも必要なわけではない。