変数のスコープ
0 148

スコープ(scope)とは日本語にすると“有効範囲”を表します。つまり、変数のスコープは変数が使える有効範囲のことを指します。

スコープは、主に以下のように分類することができます。

  • グローバル・スコープ (global scope)
  • ファイル・スコープ (file scope)
  • ローカル・スコープ (local scope)
  • 静的なローカル・スコープ (static local scope)
  • インスタンス・スコープ (instance scope)
  • クラス・スコープ (class scope)
  • クロージャ・スコープ (closurel scope)
  • スレッドローカル・スコープ (threadlocal scope)

グローバル・スコープ

グローバル(global)は、日本語にすると”大域”を表し、グローバル・スコープ(global scope)は、プログラムの「全体」から見えるスコープのことです。このスコープに属する変数はグローバル変数といわれます。BASICのような単純な言語ではグローバル・スコープしか存在しない場合があります。Pythonのようなグローバル変数の書き換えが簡単には行えない言語も存在する。 

ファイル・フスコープ

ファイル・フスコープ(file scope)は、グローバル・スコープと似ていますが、プログラムを記述したファイルの内側でのみ参照できるスコープです。プログラムが複数のファイルから構成される場合は他のファイルから参照することはできません。

ローカル・スコープ

ローカル(local)は、日本語にすると”大域”を表し、ローカル・スコープ(local scope)は、ある関数やブロックの範囲内に限定されたスコープのことです。 
何を持って範囲を与えるかは言語により様々だが、一般に入れ子のローカル・スコープは外側を参照できるのが普通です。このとき兄弟関係にあるスコープは見えない。変数宣言が必要な言語の場合は宣言文以降にスコープが制限される場合が多い。

  • 関数の先頭で纏めて宣言しなければならない 
    例:Pascal、Delphi
  • 関数のどこでも宣言でき、関数全体で有効 
    例:Javascript
  • 関数のどこでも宣言でき、宣言以降の関数全体で有効  
    例:ABAP
  • 関数のどこでも宣言でき、宣言のブロックの中にのみ有効  
    例:C、C++

インスタンス・スコープ

インスタンス・スコープ (instance scope)は、クラスベースのオブジェクト指向言語で、各インスタンス毎に割り当てられた変数が所属メソッド(メンバ関数)からのみ参照されるスコープのことです。いわゆるカプセル化はこれを指します。。保護されない変数の場合は、クラス定義が見えていてオブジェクトにアクセスできる場合は直接参照できます。C言語の構造体参照なども一種のインスタンススコープです。

クラス・スコープ

クラス・スコープ (class scope)は、 クラスベースのオブジェクトト指向言語で、あるクラスの定義全体から参照できるスコープのことです。インスタンス・スコープと異なり変数が共有されますので、ある種の制限されたグローバル・スコープと考えることができます。クラス・スコープをもたない言語の場合でも、ファイル・スコープを用いることで同様の機構を実現できる場合があります。

クロージャ・スコープ

クロージャ・スコープ (closurel scope) 

スレッドローカル・スコープ

スレッドローカル・スコープ(threadlocal scope)は、同じスレッドしか参照できないスコープのことです。マルチスレッド・プログラミングではよく使われます。

以下の表で各主流言語のスコープ実装状況を示します。

言語グローバル・スコープファイル・スコープローカル・スコープ静的なローカル・スコープインスタンス・スコープクラス・スコープクロージャ・スコープスレッドローカル・スコープ
ABAP××××
Basic×××××××
C×××
Cobal×××××××
C++×
C#××××
Delphi×××
Fortran×××××
Java××××
JavaScript××××××
Pascal×××××
Perl×××
PHP××××
Python××
Ruby××
VB×××××××
VB.net××××××
VC++××××××
VC++.net××××××
0 148
みんなのツイート (0)

関連サマリー


  • プログラミング言語 0 Votes 63 閲覧数


    以下の表にて言語の主な歴史を示します。

    キーワード年度言語開発者特徴&言語歴史への影響機械語・アセンブラ言語-----高級言語1957年FORTRANIBM社高級言語としては最初のものである、現在も科学技術計算など大規模な計算を必要とする分野で使用されている1958年ALGOL58-構造化プログラミングの考え方を取り入れた最初の言語である、あまり普及しなかったが、後に登場するPascalやC言語など多くの言語に影響を与えた1960年CobolJ.Sammet初期の高級言語の1つであり、事務処理言語として広く普及した。現在でも企業の事務処理系システムで利用されている1960年LISPMITボーランド記法を使用した独特の文法を持つ言語であり、「純粋ではない」が最古の関数型言語でもある。現在でも人工知能やEmacsのマクロなどに使用されている1964年Basicダートマス大学その後、1970年代にマイクロソフトがMS BASICを発表し、8bitマシン時代 (1970年代後半-1980年代前半)の中心的な言語となった構造化言語1966年BCPLケンブリッジ大学現在のコンパイラ技術の基礎を確立し、後にB言語に影響を与え、C言語へと発展した1967年Simulaノルウェー計算センタオブジェクトの概念をもつ言語としては最古の言語である1969年Pascal-中期の代表的な構造化言語の1つ。その後、教育用言語として1980年代頃から広く普及した。1995年に登場するDelphiもPascalの血を引く言語である1972年Cデニス・リッチープログラム開発の中心的な言語である1979年Adaアメリカ国防総省ジェネリックプログラミング(総称、汎化)、例外処理など先進的な考え方が初めに取り入れられたオブジェクト指向言語1980年Smalltalk-オブジェクト指向を導入した黎明期の言語の1つであり、「オブジェクト指向」という言葉を最初に定義した言語でもある。後のオブジェクト指向型言語に多大な影響を与えた1983年C++-C言語にオブジェクト指向を導入した、C言語と同様に開発の中心的な言語になった1987年Perlラリー・ウォール主にCGIなどの用途で広く普及している1991年VBMicrosoft社Windows専用のGUIアプリケーション開発言語1995年Delphiボーランド社Pascalの血をひくWindows専用のGUIアプリケーション開発言語インタプリタ言語・仮想マシン1995年Javaサン・マイクロシステムズ社本格的なオブジェクト指向言語の1つ。構文はC言語とかなり類似しているが、内容はまったく新世代の言語である、JavaVMという仮想マシン環境で動作1995年RubyまつもとゆきひろPerlのように使えるスクリプト言語を、純粋なオブジェクト指向言語として設計1995年PHPラスマス・ラードフWebサーバ側スクリプト言語として現在までも広く使われている1997年JavaScript-標準仕様としてECMAScriptが標準化された2002年C#Microsoft社CLRという仮想マシン環境で動くオブジェクト指向言語。Javaの影響を強く受けており、C++とJavaの中間的な特徴をもつ2009年GoGoogle社並列コンピューティングに配慮したコンパイラ言語。依存性の注入を言語仕様にとりこみ、例外処理やクラスの継承、アサーション、オーバーロードといった機能を排除している2011DartGoogle社Webブラウザ組込みのスクリプト言語であるJavaScriptの代替となることを目的に作られた。 2014年ECMA-408と言う標準規格に登録2014SwiftApple社Apple社のiOSおよびOS Xのためのプログラミング言語。従来から用いられていたObjective-CやObjective-C++、C言語と共存することが意図されている

  • プログラミング言語 0 Votes 90 閲覧数


    プログラミング言語とは、コンピュータに対する一連の動作の指示を記述するための人工言語のことです。プログラミング言語で記述されたこの一連の指示はプログラムと呼ばれ、それを記述することはプログラミングと呼ばれます。

    コンピュータは、機械語と呼ばれる中央処理装置が直接解釈できる命令を実行することによって動作するものですが、人間にとって機械語を扱うことは非常に難しいため、機械語の代わりにプログラミング言語を用いることによって、より人間にとって扱いやすい表現でコンピュータに指示を与えることができるようになります。

    プログラミング言語は様々な視点から分類することができます。

    実行形態による分類

    プログラムがどのように実行されるかという観点(実行形態)から、プログラミング言語を以下のように分類することができます。

    インタプリタ言語コンパイル言語 インタプリタ言語

    インタプリタ言語はプログラムの実行時にプログラムのソースコードを1行ずつ逐一翻訳しながら進めていきます。例としては、以下の言語があげられます。

    BasicJavascriptPerlPhytonRuby コンパイル言語

    インタプリタ言語とは逆に、実行する前にすべてのソースコードを機械語に翻訳してしまい実行ファイルと呼ばれる形式に変換します。例としては、以下の言語があげられます。

    CobolFortranC++PascalJavaC#VB.net 判断基準について

    JavaやC#、VB.netなどの.net系言語はプログラムが機械語にコンパイルされないが、JAVA仮想マシンの上に動作するバイト・コードや、.net frameworkランタイムの上に実行するILなどの中間コードを予め変換しておく必要があり、実行環境にはソースコードが配布されないため、コンパイル言語に分類することとします。 
    一方、Javascriptなどのスクリプト言語は、パフォーマンス最適化を求めるため、殆どのインタプリタが内部的にも中間コードに変換しておいてから実行することになりますが、ソースコードが稼動環境に配布しないといけないことと、中間コードがjava バイトコードのように仕様を標準化されておらず、各インタプリタの内部実装に依存することから、コンパイル言語に分類されません。

    パラダイムによる分類

    プログラムをどのように構成するかという観点(パラダイム)から、プログラミング言語を以下のように分類することができます。

    手続き型言語オブジェクト指向言語手続き+オブジェクト指向の言語関数型言語 手続き型言語

    手続き型プログラミングは、プログラムをデータ構造とルーチンの集合に分割し、「手続き呼び出し」の概念に基づきプログラミングを行います。「手続き」は実行すべき一連の計算ステップを持つもの、プロシージャ、ルーチン、サブルーチン、メソッド、関数(数学の関数とは異なるが、関数型言語における関数とほぼ同義)など様々な呼称があります。手続きはプログラム実行中の任意の時点で呼び出すことができ、他の手続きからの呼び出しも、自分自身からの呼び出し(再帰呼び出し)も含まれます。  例としては、下以の言語があげられます。

    basicCpascal オブジェクト指向言語

    オブジェクト指向プログラミングは、プログラムをオブジェクト(クラス)に分割し、オブジェクト間の「メソッド呼び出し」の概念に基づきプログラミングを行います。例としては、以下の言語があげられます。

    JavaC#Javascript… 手続き+オブジェクト指向の言語

    手続きプログラミングとオブジェクト指向プログラミングと両方をサポートしている言語です。例としては、以下の言語があげられます。

    c++Delphi(Object Pascal)VB 関数型言語

    関数型言語とはすべての計算や処理などを関数の定義の組み合わせとして記述していくタイプのプログラミング言語です。主に科学計算や人工知能の領域に利用されており、業務アプリケーション開発に使われることはほとんどありません。  例としては、以下の言語があげられます。

    LISPF# 構文による分類

    プログラムの構文という観点から、プログラミング言語を以下のように分類することができます。

    COBOL構文式ALGOL構文式 COBOL構文式

    下記のように英語の文章のように記述できるのが特徴です。

    代入文move value to variable.算術式add value1 to value2 giving variable s
    ubtract value2 from value1 giving variable
    multiply value1 by value2 giving variable
    divide value1 by value2 giving variableサブルーチンの呼び出しcall subroutine
     using para1 param2
     returning result ALGOL構文式

    BNF記号を利用します。

    代入文variable=value.算術式variable = value1 + value2
    variable = value1 - value2
    variable = value1 * value2
    variable = value1/ value2サブルーチンの呼び出しresult = subroutine(para1,para2);

    ※COBOL等の言語の一部は新しいバージョンから+,-,*,/,=を含む構文もサポートされるようになりました。

    用途による分類

    用途という観点から、プログラミング言語を以下のように分類することもできますが、判断の基準は難しいところがあります。

    汎用化言語ドメイン特化型言語Add-on言語 汎用化言語

    より汎用的に使われることを目的として設計された言語のことです。例としては、以下のの言語があげられます。

    CC++Java ドメイン特化型言語

    特定の分野で使われることに目的を特化した言語のことです。例としては、以下のの言語があげられます。

    Fortran 
    科学技術計算用Cobol 
    事務処理用Php 
    WEBサイト作成 Add-on言語

    特定のソフトウェアやプラットフォームの機能をカスタマイズや拡張するためのAdd-onを開発するための言語のことです。例としては、以下の言語があげられます。

    PL-SQL 
    Oracle DBMSTransact-SQL 
    Sybase/SQLServer DBMSABAP 
    SAP ERP

  • プログラミング言語 0 Votes 90 閲覧数


    プログラミング言語で記述されるプログラムは、区切り文字で区切られた一連のトークンから構成されます。 
    トークンとは、基本的な構文要素としてプログラム内で意味を持つテキストの最小単位であり、字句ともいいます。  トークンを組み合わせて、式や宣言や文を組み立てます。 文とは、プログラム内で実行可能なアルゴリズム動作を記述するものです。

    このトピックでは、汎用的な視点から、プログラミング言語を構成する要素を説明します。 
    プログラミング言語の構成要素には下記のものがあります。

    字句構造データ型、値及び変数式文ブロック構造化オブジェクト指向例外処理 字句構造

    字句構造(英:lexical structure)とは、プログラミング言語の字句解析が想定するトークンの構造のことです。  トークンには主に以下のような種類があります。

    リテラル(英:literal)識別子(英:identifer)キーワード(英:keyword)演算子(英:operator)区切(英:punctuator)コメント(英:comment) データ型、値及び変数

    データ型(英:data type)とはデータの扱いに関する形式のことです。データ型は、プログラミングなどにおいて変数(英:variable)そのものや、その中に代入されるオブジェクトや値(英:value)が対象となります。データ型は単純型と複合型2種類に分類することができます。

    単純型 
    単純型とはプログラミング言語の仕様に元から存在する型であり、組み込み型、原始型、プリミティブ型、基本型などと呼ばれることもあります。単純型は、数値型、文字列型、論理型、ポイント型などの種類があります。複合型 
    複合型とは、プログラマがソースコードの記述などにより新たに作る型であり、複合データ型、ユーザ型、ユーザ定義型、参照型、リファレンス型などとも呼ばれることがあります。複合型は構造体、クラス、インタフェース、共用体、列挙型などの種類があります。 なお、プログラミング言語により、一部型がなかったり、単純型か複合型かの分類が違ったりすることがあります。 式

    式(英:expression)とは、言語によって定められた優先順位や結びつきの規定に則って評価される値、変数、演算子、関数の組み合わせのものです。
    数学における式と同様、式は評価された値を持っています。 

    文(英:statement)とは、一つ以上の式や関数呼び出しで作られる、手続き構造の分割できない基本単位のものです。 
    if文のように分岐構造を表すものや、代入文のように変数の値を変更するものなどがあります。 

    ブロック

    ブロック(英:block)は複数の文から構成されます。ブロックには、単純な複数文が並べられた「順次構造」や、if-else-endifのような「選択構造」、for-nextのような「反復構造」があります。  

    プログラムの基本構造は、「順次構造」、「選択構造」、「反復構造」の3つからなると考えられます。 基本的にはプログラムは先頭行から順に実行されていきます(順次構造)が、実際にはその流れを条件によって分岐させたり(選択構造)、同じ箇所を繰り返し実行させたりすること(反復構造)を頻繁に行います。 

    構造化

    殆どのプログラミンググ言語では、プログラム中で意味や内容がまとまっている作業をひとつの手続きとして定義できる仕組みが用意されていて、手続きの呼び出しによりプログラムが成り立ちます。  

    プログラミング言語により、手続きそのものは、サブルーチンやプロシージャ、関数、メソッドなどさまざまの呼び方が存在します。 

    オブジェクト指向

    オブジェクト指向(英:object-oriented)とは、オブジェクト同士の相互作用としてシステムの振る舞いをとらえる考え方です。  構造化がデータとそれを処理する手続きを分離する考えに対して、オブジェクト指向はデータとそれを処理する手続きを纏めて、オブジェクトとして表現します。  

    オブジェクト指向は、JavasSriptのようなプロトタイプベースのものと、c++、javaなどのクラスベースのものがあります。  クラスベースで実現されるプログラミング言語では、クラスやインタフェースの作成、クラスの継承などの仕組みが提供されています。 

    例外処理

    例外処理(英:exception)とは、プログラムがある処理を実行している途中で、なんらかの異常が発生した場合に、現在の処理を中断(中止)して、別の処理を行うことです。 

     例外処理がサポートされているプログラミング言語では、異常が発生可能な処理をtryブロックに入れて、例外が発生した時の処理をcatchブロックに入れるのが多く見られます。