変数(コンピューターサイエンス)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータプログラミング変数またはスカラー関連とペア抽象保管場所であるシンボル名情報のいくつかの既知または未知量と呼ば含まれ、。または簡単に言えば、変数は特定のビットのセットまたはデータのタイプ(整数、浮動小数点、文字列など)のコンテナーです。変数は、最終的にメモリアドレスに関連付けられたり、メモリアドレスによって識別されたりする可能性があります。変数名は参照する通常の方法ですコンテキストに応じて、変数自体を参照することに加えて、格納された値。この名前と内容の分離により、名前が表す正確な情報とは関係なく名前を使用できます。コンピュータ内の識別子のソースコードがすることができる結合の間の実行時間、および変数の値は、このようにする過程で変更することができるプログラムの実行[1] [2] [3] [4]

プログラミングの変数は、数学変数の概念に直接対応していない場合があります。後者は抽象的であり、保管場所などの物理オブジェクトへの参照はありません。計算変数の値は、数学のように必ずしも方程式数式の一部である必要はありません。コンピュータプログラミングの変数には、その使用法を比較的説明するために長い名前が付けられることがよくありますが、数学の変数には、文字起こしと操作を簡潔にするために、簡潔な1文字または2文字の名前が付けられることがよくあります。

変数の保存場所は、エイリアシングと呼ばれる状況で、いくつかの異なる識別子によって参照される場合があります識別子の1つを使用して変数に値を割り当てると、他の識別子を介してアクセスできる値が変更されます。

コンパイラは、変数の記号名をデータの実際の場所に置き換える必要があります。多くの場合、変数の名前、タイプ、および場所は固定されたままですが、その場所に格納されているデータは、プログラムの実行中に変更される可能性があります。

変数に対するアクション

命令型 プログラミング言語、値は、一般的にすることができるアクセスまたは変更はいつでも。で、純粋な 機能ロジックの言語、変数がされているバインド式にし、彼らの全体の中に単一の値を保つ寿命によるの要件を参照透明性。命令型言語では、同じ動作が(名前付き)定数(記号定数)によって示されます。これらは通常、(通常の)変数とは対照的です。

プログラミング言語の型システムによっては、変数は指定されたデータ型整数文字列などしか格納できない場合がありますあるいは、データ型を現在の値にのみ関連付けて、プログラミング言語でサポートされているものを1つの変数に格納できるようにすることもできます。

変数は、値を格納するためのコンテナーです。

変数とスコープ:

  • 自動変数:関数内の各ローカル変数は、関数が呼び出されたときにのみ存在し、関数が終了すると消えます。このような変数は自動変数として知られています。
  • 外部変数:これらは関数の外部にある変数であり、任意の関数から名前でアクセスできます。これらの変数は永続的に存在し続けます。関数が呼び出されて終了するときに表示および非表示になるのではなく、関数を設定した関数が戻った後でも値を保持します。

変数を参照する識別子

変数を参照する識別子を使用して、値を読み取ったり、値を変更したり、アクセス許可、ロックセマフォなどの変数の他の属性編集したりするために変数にアクセスできます

たとえば、変数は識別子 " total_count"で参照され、変数には1956という番号を含めることができます。同じ変数が識別子 " r"でも参照され、この識別子 " r"を使用する場合、変数の値は次のようになります。 2009に変更し、識別子 " total_count"を使用して値を読み取ると、1956ではなく2009の結果が生成されます。

変数が単一の識別子によってのみ参照される場合、その識別子は単に変数の名前と呼ぶことができますそれ以外の場合は、変数の名前の1つとしてそれを話すことができますたとえば、前の例では、識別子「total_count」は問題の変数の名前であり、「r」は同じ変数の別の名前です。

範囲と範囲

変数スコープは、プログラムのテキストのどこで変数を使用できるかを示し、変数の範囲ライフタイムとも呼ばれます)は、プログラムの実行時に変数が(意味のある)値を持つ場合を示します。変数のスコープはその範囲に影響します。変数のスコープは実際には変数の名前のプロパティであり、エクステントは変数の格納場所のプロパティです。これらは、プログラムのプロパティであり、プログラムのテキストまたは実行のポイントによって異なるコンテキスト環境とも呼ばれますと混同しないでくださいスコープ:概要を参照してください。さらに、オブジェクトの寿命可変寿命と一致する可能性がありますが、多くの場合、それに結び付けられていません。

スコープは、変数の名前解決の重要な部分です。ほとんどの言語は、各変数(および他の名前付きエンティティ)の特定のスコープ定義します。これは、特定のプログラム内で異なる場合があります。変数のスコープは、変数の名前が意味を持ち、変数が「表示されている」と言われるプログラムのテキストの部分です。そのスコープへの入り口は通常、変数の存続期間を開始し(コンテキストに入ると)、そのスコープからの終了は通常、変数の存続期間を終了します(コンテキストから外れると)。たとえば、「字句スコープ」を持つ変数は、特定の関数/サブルーチン内でのみ意味があり、式/ステートメントのブロック内でより細かく意味があります関数スコープまたはブロックスコープ);これは静的な解決であり、解析時またはコンパイル時に実行できます。または、動的スコープを持つ変数は、特定の制御フローに依存するグローバルバインディングスタックに基づいて、実行時に解決されます。特定の関数内でのみアクセス可能な変数は、「ローカル変数と呼ばれます。 「グローバル変数」、またはスコープが不定の変数は、プログラム内のどこからでも参照できます。

一方、エクステントは、変数の実行時(動的)の側面です。変数の値へのバインディングは、実行時に独自のエクステント持つことができます。バインディングの範囲は、変数が同じ値またはメモリ位置を参照し続けるプログラムの実行時間の一部です。実行中のプログラムは、クロージャの場合のように、指定されたエクステントに何度も出入りする場合があります。

プログラミング言語がガベージコレクションを備えていない限り、その範囲が永続的にスコープを超える変数はメモリリークを引き起こす可能性があります。これにより、割り当て解除の目的で参照するために使用される変数がなくなるため、変数に割り当てられたメモリを解放できなくなります。アクセス可能。ただし、LispクロージャやC静的ローカル変数で発生するように、変数バインディングがそのスコープを超えて拡張することは許容される場合があります。実行が変数のスコープに戻ると、変数が再び使用される可能性があります。スコープがその範囲よりも前に始まる変数は、初期化されていない言われ、アクセスされた場合、多くの場合、未定義の任意の値を持ちます(ワイルドポインターを参照))、特定の値がまだ明示的に与えられていないため。スコープの前にエクステントが終了する変数は、ダングリングポインターになり、値が破棄されたため、もう一度初期化されていないと見なされる可能性があります。前の2つのケースで説明されている変数は、範囲外またはバインドされていないと言えます。多くの言語では、変数の値が範囲外のときに使用しようとするとエラーになります。他の言語では、そうすると予測できない結果が生じる可能性があります。ただし、このような変数には新しい値を割り当てることができ、これにより新しい範囲が与えられます。

スペース効率のために、変数に必要なメモリスペースは、変数が最初に使用されたときにのみ割り当てられ、不要になったときに解放されます。変数はスコープ内にある場合にのみ必要であるため、スコープに入るときに各変数の有効期間を開始すると、未使用の変数にスペースが与えられる可能性があります。このようなスペースの浪費を避けるために、コンパイラーは、変数が宣言されているが使用されていない場合にプログラマーに警告することがよくあります。

プログラムのさまざまな部分が互いの変数を変更することによって誤って相互作用しないように、変数のスコープを可能な限り狭くすることは、優れたプログラミング手法と見なされます。そうすることで、遠隔作用も防止されますそのための一般的な手法は、プログラムのさまざまなセクションでさまざまな名前空間を使用するか、動的変数スコープまたは字句変数スコープのいずれかを使用して個々の変数を「プライベート」にすることです。

多くのプログラミング言語は、無効または初期化されていない変数を示すために予約値(多くの場合nullまたはnilという名前)を使用します。

入力

では静的型付けのような言語ゴーML、変数も持っているタイプの値のみ、特定の種類は、それに格納できることを意味し、。たとえば、「整数タイプの変数はテキスト値を格納できません。

動的型付けのような言語はPython、変数の型は、その値によって推測され、その値に応じて変更することができます。でCommon Lispの、両方の状況が同時に存在する:A変数の型が与えられている(宣言されていない場合、であると仮定されT、ユニバーサルスーパータイプ)コンパイル時に存在しています。値にはタイプもあり、実行時にチェックおよび照会できます。

変数を入力すると、コンパイル時に多型を解決することもできます。しかし、これは(と呼ばれるオブジェクト指向の関数呼び出しで使用される多型は異なる仮想関数C ++変数を持つことが許可されているスーパータイプとは対照的に、値型に基づいてコールを解決します)。

変数は、整数やリテラル文字列などの単純なデータを格納することがよくありますが、プログラミング言語によっては、変数が他のデータ型の値も格納できるようになっていますそのような言語はまた、関数がパラメトリック多相であることを可能にするかもしれませんこれらの関数は、複数のタイプのデータを表す変数のように動作します。たとえば、という名前の関数lengthがリストの長さを決定する場合があります。リスト内の要素の数は要素の型に依存しlengthないため、このような関数は、型シグネチャに型変数を含めることにより、パラメトリック多態性である可能性があります。

パラメータ

関数仮パラメーター(または仮引数)は、変数とも呼ばれます。たとえば、このPythonコードセグメントでは、

>>> def  addtwo x ):
...     return  x  +  2 
... 
>>> addtwo 5 
7

名前付き変数x、関数が呼び出されたときに値が与えられるためパラメーターです。整数5は、その値を与える引数xです。ほとんどの言語では、関数パラメーターにはローカルスコープがあります。名前x付けられたこの特定の変数は、addtwo関数内でのみ参照できます(もちろん、他の関数も呼び出される変数を持つことができますx)。

メモリ割り当て

変数の割り当てとその値の表現の詳細は、プログラミング言語間と特定の言語の実装間で大きく異なります。多くの言語実装は、ローカル変数スペースを割り当てます。ローカル変数の範囲は、呼び出しスタック上の1回の関数呼び出しで持続し、関数が戻るとメモリが自動的に再利用されます。より一般的には、名前バインディングでは、変数の名前がメモリ内のバイトの特定のブロック(連続したシーケンス)のアドレスにバインドされ、変数に対する操作がそのブロックを操作します。参照コードのコンパイル時に値のサイズが大きいか不明な変数でよく見られます。このような変数は、ヒープと呼ばれるメモリのプールから割り当てられた値自体を格納するのではなく、値の場所を参照します

束縛変数には値があります。ただし、値は抽象化、アイデアです。実装では、値はコンピュータメモリのどこかに格納されているデータオブジェクトによって表されます。プログラムまたはランタイム環境では、データオブジェクトごとにメモリを確保する必要があります。メモリは有限であるため、オブジェクトが変数の値を表す必要がなくなったときに、このメモリが再利用できるようにします。

ヒープから割り当てられたオブジェクトは、特にオブジェクトが不要になったときに再利用する必要があります。ではガベージコレクション(のような言語C# Javaの、パイソン、GolangとLispの)、ランタイム環境が自動的に現存する変数は、もはやそれらを参照できるオブジェクトを再利用します。Cなどのガベージコレクションされていない言語では、プログラム(およびプログラマー)は明示的メモリを割り当て、後でメモリを解放してメモリを再利用する必要があります。そうしないと、メモリリークが発生し、プログラムの実行時にヒープが使い果たされ、使用可能なメモリを使い果たして最終的に障害が発生するリスクがあります。

変数が動的に作成されデータ構造を参照する場合、そのコンポーネントの一部は、変数を介して間接的にのみアクセスできます。このような状況では、ガベージコレクター(またはガベージコレクターがない言語の類似のプログラム機能)は、変数から到達可能なメモリの一部のみを再利用する必要がある場合に対処する必要があります。

命名規則

数学的な対応物とは異なり、プログラミング変数と定数は通常、COSTまたはなどの複数文字の名前を取りますtotal。 1文字の名前は、最も一般的には補助変数にのみ使用されます。例えば、ijkのための配列のインデックス変数。

一部の命名規則は、有効な識別子の形式を含む言語構文の一部として言語レベルで適用されます。ほとんどすべての言語で、変数名を数字(0〜9)で始めることはできず、空白文字を含めることもできません。変数名で句読点を使用できるかどうかは、言語によって異なります。多くの言語では、変数名にアンダースコア( "_")のみが許可され、他のすべての句読点は禁止されています。一部のプログラミング言語では、変数のデータ型またはスコープを示すためにシギル(記号または句読点)が変数識別子に付加されます。

変数名の大文字と小文字の区別も言語によって異なり、一部の言語では、特定のエンティティに名前を付ける際に特定の大文字と小文字を使用する必要があります。[注1]最近のほとんどの言語では、大文字と小文字が区別されます。一部の古い言語はそうではありません。一部の言語は、独自の内部使用のために特定の形式の変数名を予約しています。多くの言語では、2つのアンダースコア( "__")で始まる名前がこのカテゴリに分類されることがよくあります。

ただし、言語によって課せられる基本的な制限を超えて、変数の命名は主にスタイルの問題です。で、マシンコード選ばれた正確な名前は、コンピュータに問題はありませんので、レベル、変数名は、使用されていません。したがって、変数の名前はそれらを識別しますが、それ以外の場合は、プログラマーがプログラムを作成して理解しやすくするためのツールにすぎません。選択が不十分な変数名を使用すると、説明のない名前よりもコードのレビューが難しくなる可能性があるため、明確な名前を使用することをお勧めします。[5] [6]

プログラマーは、変数の命名に関するガイダンスを提供したり、正確な命名スキームを課したりするコードスタイルのガイドラインを作成して遵守することがよくあります。名前が短いほど入力は速くなりますが、説明が少なくなります。多くの場合、名前が長いほどプログラムが読みやすくなり、変数の目的が理解しやすくなります。ただし、変数名の極端な冗長性は、コードの理解を妨げる可能性もあります。

変数タイプ(存続期間に基づく)

変数の分類に関しては、変数の存続期間に基づいて変数を分類できます。さまざまなタイプの変数は、静的、スタック動的、明示的ヒープ動的、および暗黙的ヒープ動的です。静的変数グローバル変数とも呼ばれ、実行が開始される前にメモリセルにバインドされ、終了するまで同じメモリセルに留まります。典型的な例は、CおよびC ++の静的変数です。スタック動的変数はローカル変数と呼ばれ、宣言ステートメントが実行されるとバインドされ、プロシージャが戻ると割り当てが解除されます。主な例は、CサブプログラムとJavaメソッドのローカル変数です。明示的なヒープ-動的変数は、プログラマーによって指定された明示的な実行時命令によって割り当ておよび割り当て解除される名前のない(抽象)メモリーセルです。主な例は、C ++の動的オブジェクト(newおよびdelete経由)およびJavaのすべてのオブジェクトです。暗黙のヒープ-動的変数は、値が割り当てられている場合にのみヒープストレージにバインドされます。値が変数に再割り当てされると、割り当てと解放が発生します。その結果、暗黙的なヒープ動的変数の柔軟性が最も高くなります。主な例は、JavaScript、PHPのいくつかの変数、およびAPLのすべての変数です。

も参照してください

注意事項

  1. ^ たとえば、 Haskellではタイプの名前を大文字で始める必要があります。

参考文献

  1. ^ コンパイラ:原理、技術、およびツール、26〜28ページ
  2. ^ クヌース、ドナルド(1997)。コンピュータプログラミングの芸術1(第3版)。マサチューセッツ州レディング:アディソン-ウェスリー。pp。3–4。ISBN 0-201-89683-4
  3. ^ 「変数を使用したプログラミング」カーンアカデミー2020年3月23日取得
  4. ^ 「新進のコーダーのためのスクラッチ」ハーバード2020年3月23日取得
  5. ^ 変数を選択しない方法、2012年7月11日取得[デッドリンク]
  6. ^ Edsger Dijkstra「意味のある識別子」で地獄へ!