2013-09-28 58 views
11

Đây là một chút theo dõi tới this question.Tại sao địa phương được xác định tại thời gian biên dịch?

  1. Tại sao địa phương được xác định tại thời gian biên dịch chứ không phải tại thời gian thực hiện? Nó hoàn toàn cho hiệu suất?
  2. Có các ngôn ngữ tra cứu biến của chúng tại thời điểm thực thi không? I E. mỗi khi một biến được truy cập, biến này được tìm kiếm lần đầu tiên trong phạm vi cục bộ và sau đó tìm kiếm leo thang qua tất cả các phạm vi kèm theo?
  3. Các ngôn ngữ ECMA xử lý việc này như thế nào?

Để đặt câu hỏi 2 nói cách khác: Có ngôn ngữ mà đoạn mã sau (trong cú pháp cần thiết) hoạt động:

def f(): print ('f') 

def g(): 
    f() 
    f = 42 

g() 
+0

mã nên làm gì? –

+0

In 'f' mà không tăng' biến cục bộ không liên kết' hoặc gì đó dọc theo dòng này. – Hyperboreus

Trả lời

5

Hành vi này được gọi là Phạm vi từ vựng. Những gì bạn mô tả trong # 2 được gọi là phạm vi động, mặc dù mô tả bằng lời nói là gây hiểu lầm (bạn nói "phạm vi kèm theo" trong đó "chức năng gọi điện" hoặc "bản ghi kích hoạt" sẽ chính xác hơn).

Hầu như mỗi ngôn ngữ sử dụng phổ biến đều sử dụng phạm vi từ vựng, không chỉ bằng Python. Điều đó bao gồm C# và ECMAScript/JavaScript (chặn evalwith), mà tôi giả định là những gì bạn có nghĩa là "ngôn ngữ ECMA". Đã có ngôn ngữ và một số ngôn ngữ vẫn đang được sử dụng. Emacs Lisp là một, và Perl cung cấp cả phạm vi từ vựng và năng động.

Lý do cho phạm vi từ vựng không chỉ cho hiệu suất (phạm vi từ vựng đầy đủ bao gồm cả đóng cửa thực sự có hiệu suất chi phí, xem các vấn đề funcarg), nó đơn giản và đáng tin cậy. Trong khi nó có thể gây ngạc nhiên khi lần đầu tiên học ngôn ngữ, các quy tắc thực sự chết đơn giản để một lập trình viên có kinh nghiệm ngay lập tức có thể cho biết sử dụng một định danh nào tham chiếu đến phạm vi nào. Người ta có thể hiểu các chức năng trong sự cô lập, vì việc thực hiện không bị ảnh hưởng bởi ai gọi hàm này và cách họ quyết định đặt tên các biến số của chúng.

+0

Cảm ơn bạn đã trả lời. Với "ngôn ngữ ECMA", tôi dự định tham khảo tất cả các triển khai thực hiện theo ECMA-262 (ISO/IEC 16262): JavaScript, JScript, QtScript, v.v ... – Hyperboreus

Các vấn đề liên quan