スコープとモジュール

この項目ではスコープとモジュールについて勉強していきます。

1. スコープ

 そもそもスコープって言葉を理解していますか?Wikipediaから引っ張ると
プログラミングでのスコープとは、ある変数や関数が特定の名前で参照される範囲のこと。ある範囲の外に置いた変数等は、通常、その名前だけでは参照できない。このときこれらの変数はスコープ外である、「見えない」といわれる。
とか書いてあります。なんのこっちゃ?って話ですね。雑な言い方をすると、ある変数や関数を使える範囲です。その範囲のことをスコープと言います。C言語で例を示してみます。
  1. // スコープについてC言語の例
  2. #include <stdio.h>
  3.  
  4. int var_global;
  5.  
  6. int main(void){
  7. int var_func = 0;
  8.  
  9. for(int var_for = 0; var_for < 5; var_for++){
  10. printf("%d, %d\n", var_for, var_func);
  11. }
  12.  
  13. return 0;
  14. }
  15.  

この例で考えてみます。var_globalという変数はこのプログラムのどこからでも参照することができます。したがって、スコープはこのプログラム全体となります。同様に、変数var_funcはmain関数内が、変数var_forはfor文内がそれぞれスコープになります。

 では、HSPに話を戻します。HSPは基本的にはすべてグローバルに有ります。これは、サブルーチンを使っても命令や関数を定義してもグローバルであることにはかわりません。すべてグローバルです。そのため、同じ名前のラベルや関数、命令を作るとコンパイル時にエラーとなります。しかし、変数はエラーが起こりません。宣言がないため異なる目的で同名の変数を複数作ってしまったなんてコンパイラにはわかりません(わかったらすごいです。世紀の開発です)。同じ名前の変数を作ってもコンパイルエラーにならない点には注意が必要です。



2. モジュール化

 HSPでは全てグローバルだということを前回書きました。しかし、モジュールという機能を使うとスコープを区切ることができます。モジュールの基本的な書き方は次のようになります。
  1. #module モジュール名
  2. // モジュール内
  3. #global
  4.  
というように、#moduleと#globalで範囲を区切ります。この範囲では関数と命令の名前を除いて独立した範囲になります。また、モジュール内の変数は「変数名@モジュール名」で参照できます。つまり、つぎのようなプログラムが可能です。
  1. // モジュールを使った例
  2. #module mo
  3. #deffunc func
  4. a = a + 1
  5. mes "aが呼び出されたのは、" + a + "回です。"
  6. return
  7.  
  8.  
  9. #global
  10. a = 5
  11.  
  12. repeat a
  13. func
  14.  
  15. loop
  16.  
  17. mes "a@mo = " + a
  18.  

今回の例ではモジュール名をつけましたが、モジュール名は省略することができます。モジュール名を省略するとシステムによって自動的にモジュール名が割り振られます。どのようなモジュール名が割り振られたかはわからないので、モジュール内の変数を参照することはできません。(ただ、プログラミングの構造として、ゲッターやセッターとなる関数や命令を作って、モジュール内の変数を直接参照することは控えたほうが良いと思います。)




それでは次回に続きます。
最終更新:2016年04月05日 13:49