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

Печать 'f' без поднятия' несвязанной локальной переменной' или что-то в этом направлении. – Hyperboreus

ответ

5

Такое поведение называется лексическими обзорным. То, что вы описали в # 2, называется динамическим охватом, хотя словесное описание вводит в заблуждение (вы говорите «охватывающие области», где «вызывающие функции» или «активационные записи» были бы более точными).

Практически каждый Используемый язык использует лексическую область обзора, а не только Python. Это включает в себя C# и ECMAScript/JavaScript (запрет eval и with), которые я предполагаю, это то, что вы подразумеваете под «ECMA-языками». Были языки, и некоторые из них все еще используются. Emacs Lisp является одним, и Perl предлагает как лексическое, так и динамическое масштабирование.

Обоснование лексического охвата не только для производительности (полное лексическое определение, включая замыкания, фактически имеет производительность , стоимость, см. Проблемы funcarg), это для простоты и надежности. Хотя это может быть удивительно, когда вы сначала изучаете язык, правила на самом деле мертвы, поэтому опытный программист может мгновенно сказать, какое использование идентификатора относится к какой области. Можно понять функции изолированно, так как на выполнение не влияет тот, кто вызывает эти функции, и как они решили назвать переменные их.

+0

Благодарим вас за ответ. С «Языки ECMA» я собирался обратиться ко всем реализациям, которые соответствуют ECMA-262 (ISO/IEC 16262): JavaScript, JScript, QtScript и т. Д. – Hyperboreus

Смежные вопросы