コンピュータプログラミングにおいて、グローバル変数とは、グローバルスコープを持つ変数のことです。つまり、シャドウイングされていない限り、プログラム全体を通して参照可能(アクセス可能)です。すべてのグローバル変数の集合は、グローバル環境またはグローバル状態と呼ばれます。コンパイル言語では、グローバル変数は一般的に静的変数であり、その範囲(有効期間)はプログラムの実行時間全体にわたります。一方、インタプリタ言語(コマンドラインインタプリタを含む)では、グローバル変数は事前にわからないため、宣言時に動的に割り当てられるのが一般的です。
一部の言語では、すべての変数がグローバル変数であるか、デフォルトでグローバル変数となっています。一方、ほとんどの現代的な言語では、変数のスコープは限定されており、一般的には字句スコープとなっています。ただし、プログラムの最上位レベルで変数を宣言することで、グローバル変数を使用できる場合もよくあります。しかし、他の言語ではグローバル変数は存在しません。これらは一般的に、モジュール構造を強制するモジュール型プログラミング言語、またはクラス構造を強制するクラスベースのオブジェクト指向プログラミング言語です。
グローバル変数との相互作用メカニズムは、グローバル環境(グローバル状態も参照)メカニズムと呼ばれます。グローバル環境パラダイムは、すべての変数がローカルであり共有メモリを持たない(したがって、すべての相互作用をメッセージパッシングに再実行できる)ローカル環境パラダイムとは対照的です。
グローバル変数は、同時実行スレッドやシグナルハンドラのように呼び出し元と呼び出し先の関係を持たないコードセクション間で情報を渡すために広く使用されています。各ファイルが暗黙的な名前空間を定義する言語(C言語を含む)では、グローバル名前空間を持つ言語で見られる問題のほとんどが解消されますが、適切なカプセル化が行われていない場合は、いくつかの問題が残る可能性があります。適切なロック(ミューテックスなど)がない場合、グローバル変数を使用するコードは、保護されたメモリ内の読み取り専用値を除いて、スレッドセーフではありません。
BASIC (初期バージョン) 、COBOL、Fortran I (1956 年) などの非構造化言語の多くは、グローバル変数のみを提供していました。Fortran II (1958 年) では、ローカル変数を持つサブルーチンと、グローバル変数にアクセスするための COMMON キーワードが導入されました。FORTRAN での COMMON の使用は FORTRAN 77 [ 1 ]でも継続され、PL/SQL などの後の言語に影響を与えました。グローバル変数の名前付き COMMON グループは、構造化された名前空間とある程度似た動作をします。[ 2 ]また、 Forth、Lua、Perl、およびほとんどのシェルでは、変数はデフォルトでグローバルです。
globalC 言語にはキーワードはありません。ただし、関数外で宣言された変数は「ファイルスコープ」を持ち、ファイル内でのみ参照可能です。ファイルスコープで宣言された変数は、宣言からコンパイル単位 (.cファイル) の末尾まで参照可能です (ローカル変数など、より近いスコープで同名のオブジェクトによってシャドウイングされていない限り)。また、暗黙的に外部リンケージを持ち、宣言を含む.cファイルまたはコンパイル単位だけでなく、完全なプログラムを構成するためにリンクされた他のすべてのコンパイル単位からも参照可能です。ただし、外部リンケージだけでは、他のファイルでそのような変数を使用するには不十分です。コンパイル単位がそのようなグローバル変数に正しくアクセスするには、その型を知る必要があります。これは、キーワードを使用して各ファイルで変数を宣言することで実現されます(各ファイルで宣言externされますが、定義は 1つのファイルのみで行われる場合があります)。このような宣言は、プロジェクト内のすべてのファイルが少なくとも 1 つのファイルを含めるのが一般的であるため、共有ヘッダー ファイルに配置されます。標準ヘッダー ファイルはその一例であり、プロジェクト内のすべてのモジュールから変数にアクセスできるようになります。このグローバルアクセス機構が問題視される場合、変数をファイルスコープに制限するキーワードを使用して無効にすることができ、そのキーワードを使用してインポートしようとするとコンパイル(またはリンク)エラーが発生します。[ 3 ]extern.c.herrno.herrnostaticextern
C言語における「グローバル」変数の例:
#include <stdio.h>// これはファイルスコープ変数(内部リンケージ付き)で、このコンパイルユニット内でのみ可視です。static int shared = 3 ;// これは外部リンケージを持ちます(このコンパイル単位に限定されません)。extern int over_shared ;// 外部リンケージも。// ストレージクラス指定子のないグローバル変数は、C 言語では外部リンケージを持ちます。int over_shared_too = 2 ;static void changeShared () { // 関数内のファイルスコープ変数への参照。shared = 5 ; }static void localShadow () { // 同名のグローバル変数を隠すローカル変数。int shared ;// これはローカル変数のみに影響し、// 同名のファイルスコープ変数には影響しません。shared = 1000 ; }static void paramShadow ( int shared ) { // これはパラメータのみに影響し、同名のファイルスコープ変数には影響しません。shared = - shared ; }int main () { // ファイルスコープ変数への参照。printf ( "%d \n " , shared );changeShared (); printf ( "%d \n " , shared );localShadow (); printf ( "%d \n " , shared );paramShadow ( 1 ); printf ( "%d \n " , shared );return 0 ; }この変数は外部変数であるため、main関数以外の関数で使用する際に引数として渡す必要はありません。モジュール内のすべての関数に属します。
出力は以下のようになります。
3 5 5 5
Javaのような言語にはグローバル変数がありません。Javaでは、ローカル変数以外のすべての変数はクラスのフィールドです。したがって、すべての変数はクラスまたはメソッドのスコープ内にあります。Javaでは、静的フィールド(クラス変数とも呼ばれます)はクラスのインスタンスとは独立して存在し、1つのコピーがすべてのインスタンスで共有されます。そのため、パブリック静的フィールドは、他の言語のグローバル変数と同様の「共有」動作をするため、多くの点で同じ目的で使用されます。
public class Global { public static int a ; }PHPにはキーワードがありglobal、グローバル変数を使用するための独特な方法がいくつか存在します。関数外で宣言された変数はファイルスコープを持ちます(ほとんどの場合、これが最も広いスコープです)。ただし、globalキーワードでインポートしない限り、関数内からはアクセスできません(つまり、キーワードはグローバル変数にアクセスするのであって、宣言するわけではありません)。
ただし、スーパーグローバルと呼ばれる定義済みの変数は常にアクセス可能です。これらはすべて配列です。汎用的な$GLOBALSスーパーグローバルは、関数スコープ外で定義されたすべての変数を含むものです。その要素を変更すると元の変数が変更され、追加すると新しい変数が作成されます。スーパーグローバル$_POSTと は、$_GETWeb プログラミングで広く使用されています。