情報技術やコンピュータ科学では、システムが過去の出来事やユーザーの操作を記憶するように設計されている場合、そのシステムはステートフルであると説明されます。 [ 1 ]記憶された情報はシステムの状態と呼ばれます。
システムが取り得る状態の集合は、そのシステムの「状態空間」と呼ばれます。離散システムでは、状態空間は可算であり、多くの場合有限です。システムの内部動作、あるいは環境との相互作用は、入力の受け入れや出力の生成など、個別に発生する動作やイベントから成り立っており、これらの動作やイベントによってシステムが状態を変化させる場合もあれば、変化しない場合もあります。このようなシステムの例としては、デジタル論理回路やコンポーネント、オートマトンや形式言語、コンピュータプログラム、コンピュータなどが挙げられます。
デジタル回路または決定論的コンピュータプログラムの出力は、任意の時点で現在の入力と状態によって完全に決定されます。[ 2 ]
デジタル論理回路は、出力信号が現在の入力信号のみに依存する組み合わせ論理と、出力が現在の入力と過去の入力履歴の両方の関数である順序論理の 2 種類に分類できます。[ 3 ]順序論理では、過去の入力からの情報は、フリップフロップなどの電子メモリ要素に格納されます。これらのメモリ要素に格納されている内容は、ある時点ではまとめて回路の状態と呼ばれ、回路がアクセスできる過去に関するすべての情報が含まれています。[ 4 ]
フリップフロップなどの各バイナリメモリ素子は、 1または0の2つの状態しか持たず、メモリ素子の数も有限であるため、デジタル回路が持つことができる状態の数も有限です。回路内のバイナリメモリ素子の数をNとすると、回路が持つことができる状態の最大数は2Nとなります。
同様に、コンピュータプログラムはデータを変数に格納します。変数はコンピュータのメモリ内の記憶場所を表します。プログラムの実行中の任意の時点でのこれらのメモリ位置の内容は、プログラムの状態と呼ばれます。[ 5 ] [ 6 ] [ 7 ]
状態という概念は、パーサー、ファイアウォール、通信プロトコル、暗号化など、データストリームに対してシリアルまたはシーケンシャルに動作するコンピュータプログラムに対して、より専門的な定義で使用されます。シリアルプログラムは、入力されるデータ文字またはパケットを1つずつ順番に処理します。これらのプログラムの中には、以前に受信したデータ文字またはパケットに関する情報が変数に格納され、現在の文字またはパケットの処理に影響を与えるために使用されるものがあります。これはステートフルプロトコルと呼ばれ、前の処理サイクルから引き継がれたデータは状態と呼ばれます。一方、プログラムが以前のデータストリームに関する情報を持たず、データ入力ごとに新たに開始するものもあります。これはステートレスプロトコルと呼ばれます。
命令型プログラミングは、プログラムの状態と、その状態を変更するステートメントに基づいて計算を記述するプログラミングパラダイム(プログラミング言語の設計方法)です。状態の変化は暗黙的に行われ、プログラムの実行時によって管理されるため、サブルーチンはプログラムの他の部分によって行われた状態の変化(副作用と呼ばれる)を認識できます。
オブジェクト指向プログラミングは、関連する状態(および動作)をオブジェクト内にカプセル化することで、命令型および手続き型プログラミングのパラダイムを改善しようと試みます。オブジェクトの状態は、他のオブジェクトから分離し、結合度を減らすために、しばしば隠蔽されます。[ 8 ]このように隠蔽された状態は、しばしばオブジェクトの「内部状態」と呼ばれます。
宣言型プログラミング言語では、プログラムは望ましい結果を記述するだけで、状態への変更を直接指定しません。
関数型プログラミングでは、状態は通常、時間論理を用いて、プログラム実行の各ステップにおけるプログラムの状態を表す明示的な変数として表現されます。状態変数は、状態変換関数の入力パラメータとして渡され、関数は更新された状態を戻り値の一部として返します。純粋な関数型サブルーチンは、そのスコープ内の状態変数によって表される状態の変化のみを可視します。
順序回路またはコンピュータプログラムの出力は、任意の時点で、現在の入力と現在の状態によって完全に決定されます。各バイナリメモリ要素は0または1の2つの状態しか持たないため、回路が取り得る異なる状態の総数は有限であり、メモリ要素の数によって決まります。バイナリメモリ要素がN個ある場合、デジタル回路は最大で2N個の異なる状態を持つことができます。状態の概念は、有限状態機械と呼ばれる抽象的な数学的計算モデルで形式化されており、順序デジタル回路とコンピュータプログラムの両方の設計に使用されます。
状態を持つ日常的な機器の例として、テレビが挙げられます。テレビのチャンネルを変更するには、通常、リモコンのチャンネルアップボタンまたはチャンネルダウンボタンを押します。これにより、テレビにコード化されたメッセージが送信されます。ユーザーが希望する新しいチャンネルを計算するために、テレビのデジタルチューナーには、現在受信しているチャンネルの番号が保存されている必要があります。チューナーはこの番号に1を加算または減算して新しいチャンネルの番号を取得し、そのチャンネルを受信するようにテレビを調整します。この新しい番号は、現在のチャンネルとして保存されます。同様に、テレビはスピーカーから出力される音量レベルを制御する番号も保存しています。音量アップボタンまたは音量ダウンボタンを押すと、この番号が増減し、新しい音量レベルが設定されます。現在のチャンネルと現在の音量の番号はどちらもテレビの状態の一部です。これらは不揮発性メモリに保存され、テレビの電源を切っても情報が保持されるため、再び電源を入れると、テレビは以前のチャンネルと音量レベルに戻ります。
別の例として、パーソナルコンピュータの状態とは、そのコンピュータ内のすべてのメモリ要素の内容を指します。ノートパソコンなどのコンピュータがプロセッサを停止してエネルギーを節約するために休止状態に入ると、プロセッサの状態はコンピュータのハードディスクに保存されるため、コンピュータが休止状態から復帰したときに復元され、プロセッサは中断したところから処理を再開できます。
ページ