対象読者
再○○プログラムって、何個もあってややこし~!って思いますよね。
今回の目標は、わかりやすくを重視しつつモヤモヤを払拭し、逆に問題が出題されたらラッキーっと思えるまでに違いを明確にすることです。
曖昧な概念は、たとえ話などを用いてイメージしやすいようにしているので、IT初心者でも理解できるよう担っています。
(例:再入可能プログラム(Reentrant Program)のイメージとしては、同じドアを複数の人が同時に使っても問題がないよーってこと=複数同時入場OK!。etc..)
では、前置きはここまでにして早速やっていきましょう!
再帰的プログラム(Recursive Program)
- 再帰的プログラムのイメージはマトリョーシカに例えられる。マトリョーシカは、中に同じ形の小さな人形が入っており、それぞれが自分自身と同じ形をしている。同様に、再帰的プログラムは、自分自身の中に似たような問題を解くための小さなプログラムを含んでる。(マトリョーシカ)
- 再帰的プログラムは、自身の定義内で自身を呼び出すプログラム(自己参照)
- 問題を小さなサブ問題に分割する再帰的なアプローチは、同様の問題に対して再利用できる柔軟性を提供する
- プログラムの実装がシンプルになる
- 木構造やグラフなどの再帰的なデータ構造に適する
- スタックオーバーフローの発生(過度な呼び出しはNG)
スタックオーバーフロー:再帰呼び出しが深い場合、スタック領域の制限に達すること - 再帰的な呼び出しは、ループに比べて実行速度が低下する
再入可能プログラム(Reentrant Program)
- 再入可能プログラム(Reentrant Program)のイメージとしては、同じドアを複数の人が同時に使っても問題がないよーってこと。(複数同時入場OK!)
- 再入可能プログラムは共有されるリソースに対する競合状態を避けられる
→排他制御が不要 - 副作用を最小限に抑える
副作用:プログラムの実行によって、そのプログラム以外の部分に影響を与えること - 複数のスレッドから同時に呼び出されても正しく動作できる性質(スレッドセーフ)
スレッド:プログラム内での実行最小単位 - マルチスレッドや並列プログラミング環境に適する
- ライブラリ関数やAPIなどの複数のプログラムから呼び出されるものに適す
- 割り込みハンドラは再入可能が必須
割り込みハンドラ: ハードウェアやソフトウェアからの割り込み信号を受け取り、それに応答するための特別なプログラム - 再入可能プログラムでは、状態を分離して扱う
→グローバル変数や静的変数などの共有状態を避ける - 再入可能性を確保するにはプログラムの実装が複雑になる場合がある
- 再入可能性を確保するために追加の処理が必要
→それがパフォーマンスの低下を誘発する
再配置可能プログラム(Relocatable Program)
- 再配置可能プログラムのイメージは仕事場を移動するトラックで例えられる。トラックは、異なる場所に移動しても同じように仕事を遂行できる。同様に再配置可能プログラムはメモリ上のアドレスが変わっても正常に動作する。(仕事場を移動するトラック)
- 再配置可能プログラムは、プログラムの実行位置が自由に変更できるプログラム
- メモリ管理に有効
→再配置することでメモリの断片化を最小限に抑えられる - プログラムが異なる環境やアーキテクチャで実行される場合でも対応可能(移植性)
- コンパイル時に利用される
- 他のプログラムやライブラリとのリンク時に利用される
- 実行時にアドレス再配置が行われるため、実行オーバーヘッドが発生する
- 悪意のある攻撃者がメモリの特定の領域を狙うセキュリティリスクがある
→アドレス再配置が可能であるために発生 - 位置非依存性をもつ
- リロケーションレジスタで再配置する
- 動的リンカブルプログラムである
- アドレス再配置テーブルを参照して、再配置する場所を見つける
関連用語:
- 位置非依存性:
プログラムのアドレスが静的に固定されておらず、実行時にメモリ内での配置が自由に変更できる性質
→再配置可能プログラムはどこでも実行できるため、移植性が高まりまる - アドレス再配置テーブル:
再配置可能プログラムの実行位置がどこにあるかを示すテーブル
→プログラムがメモリにロードされる際に参照して、プログラム内のアドレスを再配置する - リロケーションレジスタ:
プログラムをメモリにロードする際に、アドレスの再配置を行うためのレジスター
→プログラムの実行位置を変更できる - 動的リンカブルプログラム:
実行時に他のプログラムやライブラリとリンクされるプログラム
→必要なライブラリやリソースが必要なときに動的にロードし、実行できる
再使用可能プログラム(Reusable Program)
- 再使用可能プログラム(Reusable Program)のイメージとしては、1度作ったらそれを何度でも再利用できちゃうよってこと。(作ったら使い倒すリサイクル精神)
- または、再使用可能プログラムのイメージは特注の工具。特定の家具を組み立てる際に使用する特注の工具は、その家具を作る目的に特化している。この工具は、他の用途には再利用できないが、特定の目的に特化して効率的に使用できる。(特注の工具)
- 再使用可能プログラムは、特定のアプリケーションやシステムに依存しない(汎用性が高い)
- 機能ごとにモジュール化され、単一の機能を担当する関数やクラスに分割される
- 類似の機能を持つ異なるアプリケーションやシステムでコードを再利用できる
- 開発時間やコストを削減することがでる(開発の効率化)
→開発の初期段階から将来の再利用を見越して設計されることもある - 他のコンポーネントやシステムとの間で独立して動作する
- パラメータや引数を変更することで、異なる状況や要件に対応できる(柔軟性)
- 類似の機能が複数の場所で必要とされる場合に適する
- 汎用的なライブラリやフレームワークとして提供される
- ドキュメント化が必要
→適切にドキュメント化されていないと、正しく利用することが難しい
おまけ:再利用可能プログラム(Reused Program)
では、おまけに再使用可能プログラムと勘違いしやすい、再利用可能プログラムについてやっていきます。
- メリット・デメリットは再使用可能プログラムと同じ
- 再利用可能なプログラムは特定の目的に特化しているわけではない
↔再使用可能プログラムは特定の目的に特化している - 再利用可能プログラム(Reusable Program)のイメージとしては、例えば、料理をする際に使うフォークは、食事をするたびに再利用する。それは多くの場面で汎用的に使用できるが、特定の目的に特化しているわけではない(フォーク)
関係性まとめ
では、さいごに再帰的プログラム・再入可能プログラム・再使用可能プログラム・再配置可能プログラムの関係性をまとめていきます。
一般的に以下の関係が成り立ちます。
しかし、あくまでも一般的なので例外もあります。
- 再帰的なコードは再入可能である場合がありますが、必ずしも再入可能であるとは限りません。
- 再入可能(複数同時入場)なコードは再使用可能(特注工具)であり、再利用可能な関数やモジュールは再入可能であることが一般的です。
- 再使用可能なコードは再配置可能である場合がありますが、必ずしも再配置可能であるとは限りません。
- 再配置可能なコードは、どこでも実行可能な性質を持ち、再利用可能(≒再使用可能)なコードとして再使用可能である場合があります。
おわりに
今回で、再○○プログラムについて少しでも理解の役に立てたら幸いです。わかりやすくを心がけましたが言葉足らずで、分かりにくいところがありましたら教えてください。