Edited at

レキシカルとスタティックの違い

More than 1 year has passed since last update.


スタティックとダイナミック

【static】静的な

変数などが定義されたスコープや関数内に所属し、スコープ外の同名の定義に干渉しない。


Cの静的スコープ

int value = 123;

{
int value = 456;
{
value ++;
}
// value : 457
}
{
value ++;
// value : 124
}

// value : 124


【dynamic】動的な

変数などが関数やスコープのなどの所属に関係なく動的に定義できる。


javascriptの動的スコープ

var value = 123;

{
var value = 456;
{
value ++;
}
// value : 457
}
{
value ++;
// value : 458
}

// value : 458


この例では無名スコープですが、if文やfor文でも同じ挙動(衝撃!)


じゃあレキシカルって何?

辞書によると、

【lexical】 語彙的な

なんだこれは?!意味がわからん!日本語?

javascriptにとってレキシカルスコープというのは、関数のスコープ内で限定的に使用できる擬似的な静的スコープ。


上記C言語の例をjavascriptで実現

var value = 123;

(function(){
var value = 456;
{
value ++;
}
// value : 457
}());

(function(){
value ++;
// value : 124
}());

// value : 124


(うおおおめんどくさい!!)

Q: で、静的スコープと何が違うの?

A: 同じです(震え声)

では、なぜレキシカルと呼ばせるようになったのか?

これはあくまで想像

C言語などの静的変数と、javascriptのレキシカル変数の性質が似て非なるものなので、同じ名前を避けたのではないか?と推測


C

int func(int num) {

static int memory = 0; //静的変数
memory += num;
printf("%d\n", memory);
}

func(100); // 100
func(23); //123

/// 静的変数のmemoryへの直接アクセスは通常の方法では不可能
/// 「関数のポインタをキャストしてゴニョゴニョ・・・」「ハッカーですか?」



javascript

function myClass(){

return {
memory: 0, //レキシカル変数
func: function(num){
this.memory += num;
console.log(this.memory);
}
}
}
obj = new myClass();

obj.func(100); // 100
obj.func(23); // 123

memory = 1000;
obj.func.call(this, 234); // 1234 /////callでthisを指定できる
obj.func(0); // 123
obj.memory = 0; /////アクセスできる
obj.func(0); // 0



私の仮定

Static変数という言い方が先にできて、反語としてDynamic変数が命名されたのだと仮定して、

Lexical変数は、「うちの言語だと、若干 staticと性質違うし相応しい名称を考えよう」と思ったエライ人が、「じゃあDictionary型(C#のハッシュ)で内部に変数を格納しているイメージから、索引的、辞書的 = lexical と定義しようよ」と言って広まったんじゃないのかと予想。

しかし私はレキシカルスコープという言い方は、なんかどういう意味合いでもしっくり来ない。

なので単にDynamicの反語だからという意味で誰かが使用し始めて、それが一般的になってしまったのではないか、と邪推してみます。

追記

コメント欄より

こちらの説明で lexical=構文的 と説明されていて、

なるほど、lexical grammar -> 構文法 なので lexical も構文と訳せばしっくり来るね!という結論に至りました。


あらためて、lexicalとは

【lexical】lexiconの形容詞形

そもそも英語で言うlexiconとはいわゆる語彙という意味もあるけど、知識量を表すだけではなく、目録索引という意味合いがあるらしいよ!

日本人にとって【語彙】とはそもそも馴染みも薄い単語であって、一般的には「ボキャブラリー」と同義だと考える人が多いから、ちょっと理解しにくいんじゃない?

もうレキシカルを「語彙的な」と訳すのはやめにしませんか?(ぼそ)

「語彙的」と訳された時、日本人はまず【語彙】個人の使う語の総量と「的」をくっつけてしまう。これじゃ通る意味も通らない。

なので、lexical語彙的なと訳すより、むしろ目録的なと訳せば日本人にとってもしっくり来ると思う

それにプログラム的にも目録的のほうが意味が通っていると思うのだけど・・・