2013-09-28 6 views
11

これはthis questionへのフォローアップのビットです。コンパイル時にローカリティが決定するのはなぜですか?

  1. 実行時ではなくコンパイル時にローカリティが決定するのはなぜですか?純粋にパフォーマンスのためですか?
  2. 実行時に変数を参照する言語はありますか?私。変数にアクセスするたびに、この変数がローカルスコープ内で最初に検索され、次に検索がすべてのスコープをエスカレートします。
  3. ECMA言語はこれをどのように処理しますか?

他の言葉で質問2を置くために:

def f(): print ('f') 

def g(): 
    f() 
    f = 42 

g() 
+0

コードはどうすればよいですか? –

+0

この行に沿って 'unbound local variable'や何かを上げることなく' f'を表示します。 – Hyperboreus

答えて

5

この動作はレキシカルスコープと呼ばれている:(必要な構文で)、次のコードが動作する言語があります。 #2で説明していることは動的スコープと呼ばれますが、口頭での記述は誤解を招きます(「呼び出し関数」または「アクティベーションレコード」がより正確になる「囲みスコープ」と言います)。

事実上すべて共通の言語は、Pythonだけでなく、レキシカルスコープを使用します。これにはC#とECMAScript/JavaScript(evalwith)が含まれていますが、これは「ECMA言語」の意味です。言語があり、一部はまだ使用されています。 Emacs Lispは1つで、Perlはレキシカルスコープと動的スコープの両方を提供します。

レキシカルスコープのための根拠は(閉鎖を含む完全なレキシカルスコープが実際にの費用性能を有する、funcargの問題を参照)だけで、パフォーマンスのためではない、それはシンプルさと信頼性のためです。言語を最初に学ぶときは驚くかもしれませんが、ルールは実際には単純であるため、経験豊富なプログラマーは識別子のどの使用がどのスコープを参照しているかをすぐに知ることができます。実行はこの関数を呼び出す人の影響を受けず、どのようにしてという名前の変数をという名前にすることにしたのかによって、関数を独立して理解することができます。

+0

ありがとうございました。 「ECMA言語」では、JavaScript、JScript、QtScriptなど、ECMA-262(ISO/IEC 16262)に準拠するすべての実装を指しています。 – Hyperboreus

関連する問題