マインドマップギャラリー 「プログラムはどのように実行されるのか」
この本は、コンピュータの構成、CPU、二項演算、メモリ、オペレーティング システム、プログラムの実行、アセンブリ、ハードウェア制御、機械学習などをコンピュータ実務家に紹介し、読者がプログラムがどのようにさまざまなプロセスを経るのかを深く理解できるようにします。 『Running in Your Computer』は、コンピュータ愛好家や実務家にとって必読の人気科学書です。
2024-01-18 19:32:06 に編集されましたプログラムはどのように実行されるのでしょうか?
1.プログラムのプロセッサ:CPU
レジスタ、コントローラ、演算器、クロックの4つの部分で構成されます。電流信号を使用して接続します。
レジスタ: データと命令の一時的な保管場所
コントローラー: レジスタ内のデータと命令の読み取りを制御します。
クロック: プログラムタイミング
演算子: レジスタから読み取られたデータを操作します。
CPUはさまざまな機能レジスタの集合体です
レジスタは機械語のみを処理できます
機械語は高級プログラミング言語からコンパイルされたものです
レジスタ 1: プログラム カウンタ
アドレス命令を実行してプログラムの実行を決定する
レジスタ 2: フラグレジスタ
演算結果の保存 (正、負、ゼロ、オーバーフロー、パリティ)
関数呼び出し
これは、プログラム カウンタの値を関数の記憶アドレスに設定することによって実現されます。
スタックを使用して呼び出しアドレスと戻りアドレスを取得します
アレイストレージ
配列の内容を格納するにはベース レジスタを使用し、配列のインデックスを格納するにはインデックス レジスタを使用します。
2. データはバイナリで表現されます
バイナリ表現が使用される理由: コンピュータ内部では、合格または不合格の 2 つの状況を表すためにダイオードが使用されます。
2 進数の最小単位はビットであり、2 進数のビット数を表します。
バイナリの基本単位はバイトで、1バイトは8ビットです
バイナリ計算
2進数と10進数間の変換方法: 2進数のビットのべき乗の結果を加算して10進数を取得します
コンピューターでの 10 進数の演算は、計算のために 2 進数に変換されます。たとえば、2 進数を左に 1 桁シフトすることは、数値を 2 で乗算することと同じです。
コンピュータ内の減算は加算を使用して実装されます。ここでは「補数」を使用します。
2 進数の最上位ビットは符号ビットで、1 は負の数を表し、0 は正の数を表します。
負の数を表す場合は「補数」を使って計算する必要があります。
負の数を求めるには、まず 8 桁の 2 進数を使用して正の数を表し、次にすべての桁の数値を反転して、結果に 1 を加えます。
加算を計算する際、最上位ビットが計算範囲を超えるとオーバーフローとなり、オーバーフローした値はコンピュータによって自動的に破棄されます。
符号なし型は、すべて正の数である 2 進数です。 signed 型は、符号を表す最上位ビットを取り除き、n-1 ビットのみを残すため、正と負の値が半分を占めます。
論理右シフトと算術右シフトの違い
論理右シフト: 画像を右に移動し、左側の空いた位置を直接 0 で埋めることと同じです。
算術右シフト: 2 進数全体を右に移動し、空いた位置を 0 または 1 で埋めます。
値が 1 の補数で表される負の値の場合、右シフトして空いた最上位ビットに 1 を加算することで、1/2、1/4、1/8 などの数値演算を正しく実装できます。正の数の場合は、最上位ビットに 0 を追加するだけです。
2 進数を 16 進数に変換すると、長さが元の 1/4 に短縮され、より簡潔で明確になります。
先頭に 0x が付いているものは 16 進値を表します。
3. 浮動小数点数
2 進数を使用して小数を表現する場合、正確な表現を達成することは不可能であり、一定範囲の精度でしか除数を作成できません。
浮動小数点数の表現は IEEE 標準です
単精度浮動小数点数(32ビット)
符号部1、指数部8、仮数部23
倍精度浮動小数点数(64ビット)
符号部1、指数部11、仮数部52
表現方法:正規表現
エクセスシステム
EXCESS システムは、指数部で表される範囲の中央の値を 0 に設定することで、負の数を符号で表す必要がないように動作します。
4.記憶
メモリからデータを読み出すことができ、電源オフ情報は消えます。
データ信号ピンが 8 本あるため、8 ビットと 1 バイトを表現できます。
10 個のアドレス信号ピンがあり、1024 個の信号、つまり 1K を表すことができます。
データ型が異なると、同じ値であっても占有するメモリ サイズが異なります (したがって、プログラム内で変数の型を定義するときに各層の 8 ビットを無駄にしないようにするには、型の位置をできるだけコンパクトになるように調整する必要があります)メモリを使用します)
ポインタ
ポインタも変数です。表現するのはデータの値ではなく、データが格納されているメモリのアドレスです。ポインタを使用すると、指定したアドレスのデータを読み書きできます。
配列
メモリ内の連続したアドレスに格納されます。各データのアドレスを示すにはインデックスを使用します。
スタックとキュー
スタックとキューはデータへのアクセスにインデックスを使用しませんが、一定数の要素を含む配列の形式でメモリ領域を分割し、内部アクセスを実装できます。
スタック: 先入れ、後出し
キュー: 先入れ先出し (固定サイズのメモリ内で繰り返しアクセスできるリング バッファを使用)
リンクされたリスト
追加、削除、変更、確認がより便利になります
二分木
検索が簡単
メモリを節約する方法
DLL ファイルを共有して関数の重複ストレージを削減する
_stdcall を呼び出してプログラム ファイルのサイズを削減する
5. ディスク
ディスクに保存されているプログラムは、実行する前にメモリにロードする必要があります。プログラムの内容を解析して実行する役割を担う CPU は、プログラムを読み出す前に、内部プログラム カウンターを通じてメモリ アドレスを指定する必要があります。
ディスク キャッシュによりディスク アクセスが高速化されます
仮想メモリ: 実際にはディスク領域ですが、この領域は複数のページに分割されており、実行が必要なときにページの内容がメモリに継続的に読み込まれます。
コンピュータは通常、ディスクをセクタに分割し、ファイルがどれほど小さい場合でも、クラスタを排他的に占有する必要があります。
6. データを圧縮する
ファイルはバイト単位で保存されます
RLE圧縮アルゴリズム
ファイル内で繰り返されるコンテンツの割合が大きくない場合、ファイルが拡張される可能性があります。
ハフマンアルゴリズム
ハフマンアルゴリズムのポイントは、「複数回出現するデータは8ビット未満のバイト数で表現でき、あまり使われないデータは8ビットを超えるバイト数で表現できる」ということです。
ハフマン木を使用して各文字のコードをショートビットに高頻度、ロングビットに低頻度で配置し、各コードを二分木の葉ノードとして使用します。
可逆圧縮と非可逆圧縮
7. プログラム実行環境
動作環境: オペレーティング システムとコンピュータ ハードウェア
ソースコード -> ネイティブコード -> 実行
Windows は CPU 以外のハードウェアの違いを克服し、異なるモデルでも同じプログラムと互換性を持たせることができます。
異なる CPU は異なる機械語を使用するため、同じプログラムを他の CPU に移行する場合は、対応するネイティブ コードに再コンパイルするために CPU 固有のネイティブ コード コンパイラが必要になります。
仮想マシンを使用して他のオペレーティング システム環境を取得する
Virtual PC for MAC は、Macintosh のハードウェアを AT 互換コンピュータと同じにし、そのハードウェアに Windows をインストールできるようにします。
Java仮想マシン
Java仮想マシンはJavaのバイトコードを一つ一つネイティブコードに変換しながら動作します。
BIOS
BIOS は ROM に保存されており、コンピュータ ホストに事前に組み込まれているプログラムです。
BIOSには、キーボード、ディスク、グラフィックスカードなどの基本的な制御プログラムに加えて、「ブートプログラム」を起動する機能もあります。
8. ソースファイルから実行ファイルへ
実行するにはソース コードをネイティブ コードにコンパイルする必要があります
ネイティブ コードの本質は 16 進値のシーケンスです
コンパイラはソースコードをネイティブコードに変換する役割を果たします。
.c ファイルは、コンパイラによってコンパイルされた後、.obj ファイルになります。この時点では、プログラムはまだ実行できません。
コネクタは複数のターゲット ファイルを結合して EXE ファイルを生成します。このプロセスは、リンク コマンドを入力した後でのみ生成されます。
ライブラリ ファイルは複数のターゲット ファイルからパッケージ化されます。リンカは、リンク時にライブラリファイルを指定することで、その中から必要なオブジェクトファイルを抽出し、他のオブジェクトファイルとリンクしてEXEファイルを生成します。
Windows APIはプログラムアプリケーションのインターフェースです
API の本質は関数です。API のターゲット ファイルはダイナミック リンク ライブラリ (DLL) のライブラリ ファイルです (実際にターゲット ファイルを格納するのではなく、ターゲット ファイルへのリンクを提供するだけであり、これは自動的に取得するために使用されます)。プログラム実行時のターゲットファイル)
対象ファイル自体を含み、EXE ファイルに直接リンクできるライブラリ ファイルをスタティック リンク ライブラリと呼びます。
実行可能ファイルを実行するには変数と関数が必要です
EXE ファイルでは、変数や関数に割り当てられたメモリ アドレスは仮想であり、プログラムが実行されると、これらの仮想メモリ アドレスは実際のメモリ アドレスに変換されます。リンカは、メモリ アドレス変換が必要なさまざまな場所を EXE ファイルの先頭に記録します。この情報は再配置情報と呼ばれます。
メモリ上の領域構成:変数空間、関数空間、ヒープ空間、スタック空間
スタックは、関数内のローカル変数と、渡す必要があるパラメーターを格納するために使用されます。
スタック領域はコンパイラによって自動的に生成または解放されるため、手動操作は必要ありません。
ヒープは任意のデータを保存するために使用されます
ヒープ領域は手動での割り当てと解放 (malloc と free) (新規と削除) が必要です
9. オペレーティングシステム
自然
プログラムをロードして実行する機能を備えた監視プログラムです。
携帯性
高級プログラミング言語はソースコードを編集する際には共通の言語を使用しますが、異なるオペレーティングシステムでネイティブコードをコンパイルした後、プログラムはシステム内のシステム関数を呼び出します。これが移植性です。
ハードウェアの抽象化
オペレーティング システムと高級プログラミング言語がハードウェアを抽象化するため、プログラマーはシステム コールやハードウェアについて心配する必要がなくなります。
Windows オペレーティング システムの機能
32ビット版と64ビット版が利用可能
一連の API 関数を通じてシステム コールを提供する
GUIの使用
WYSIWYG 形式で出力を印刷する機能
マルチタスク機能を提供する
ネットワーク機能とデータベース機能を提供する
プラグ アンド プレイによるデバイス ドライバーの自動インストール
10. アセンブリ言語とネイティブコード
アセンブリ言語
アセンブリ言語では、ネイティブ コードの命令であるニーモニックが使用されます。
アセンブリ言語で書かれたソース コードは、実行する前にネイティブ マシン コードに変換する必要があります。
アセンブリ言語をネイティブコードに変換するプログラムがアセンブラであり、変換処理をアセンブリと呼びます。
ネイティブ言語をアセンブリ言語に変換することもできます。変換プロセスは逆アセンブリと呼ばれます。
C 言語コンパイラは、C 言語ソース コードをアセンブリ言語ソース コードに変換することもできます。
アセンブリ言語には 2 種類の命令があります
1. ネイティブ コードに変換される一般的な命令
2. アセンブラ専用の擬似命令
疑似命令は、アセンブラにプログラムの構造とアセンブリ方法を伝える役割を担うため、アセンブラ命令とも呼ばれます。
アセンブリ言語では、# 記号で始まるコメントは次のようになります。
文法
オペコード
コマンドの動作を示します
オペランド
命令の演算対象を示します。
プログラムを実行すると、レジスタ内にスタック空間が開かれ、呼び出された関数変数はこのスタックを使用します。スタック空間はプログラム終了後にクリアされます。
関数の呼び出し
スタックからパラメータを取得して操作を実行し、戻り値を eax レジスタに格納し、スタックから戻りターゲット アドレスを取得してプロセスを返します。
変数
グローバル変数
関数の外で宣言されているため、プログラム内のすべての関数がアクセスできます。
ローカル変数
関数内で宣言されているため、宣言されている関数内でのみアクセスできます。
サイクル
条件分岐
11. ハードウェアにアクセスする
プログラムはオペレーティング システムを通じてハードウェアにアクセスします
入出力命令
I/Oコントローラ = ポート
入出力データを一時的に保存する
区別するためにポート番号、つまりI/Oアドレスを使用します
in コマンドと out コマンドでポート番号が指定されていれば、I/O コントローラーにアクセスして入出力操作を完了できます。
割り込み処理
現在実行中のプログラムを一時停止し、他のプログラムを実行します
I/O コントローラが割り込み要求を発行し、CPU が割り込み処理を実行します。この間で割り込みコントローラが割り込み処理を CPU に引き渡して処理します。
DMA
CPU を介さずに外部デバイスとメモリ間で直接データを送信する方式で、ネットワークやディスクなどのデバイスでよく使用されます。
PIO
CPUを介して外部デバイスとメモリ間でデータを転送する方法はPIOと呼ばれます
文字や画像を表示する
データをビデオメモリに保存し、モニターに表示します
グラフィックス カードには独立したビデオ メモリと画像プロセッサ GPU が搭載されています。
12. 機械学習
コンセプト
プログラマは学習のためのプログラムを書くだけですが、そのプログラムの内容は、コンピュータに大量のデータを読み込ませ、そのデータの特徴を学習させて認識モデルを生成するというものです。
教師あり学習
教師あり学習とは、正解を含む大量のデータをコンピューターに提供することです。
ステップ
(1) 学習データと回答データを訓練データとテストデータに分割する
(2) 学習アルゴリズムを使用してトレーニングデータを学習し、モデルを生成します
(3) テストデータを使用してモデルの性能を評価する
機械学習アルゴリズム
サポートベクターマシン
道具
Python言語
機械学習関連のさまざまな機能を含むライブラリがPythonで提供されています
スクリプト モードでは、Python インタプリタを使用して、事前に作成されたソース コードを解釈して実行します (スクリプト モード)
Python インタプリタを直接起動し、キーボードからプログラムを 1 行ずつ入力し、対話モードの実行を解釈します (対話モード) (機械学習はこのモードを使用します)
相互検証
相互検証は、トレーニング データとテスト データを継続的にローテーションする機械学習を実行する方法です。
学習データの種類によって学習モデルの認識率に偏りがあるかどうかを確認できます。