Dường như việc truy cập vào phạm vi từ vựng có thể được thực hiện tại thời gian biên dịch (hoặc bởi một máy phân tích tĩnh, vì ví dụ của tôi là bằng Python) chỉ đơn giản là dựa vào vị trí trong mã nguồn.Phạm vi từ vựng có khía cạnh động không?
Dưới đây là một ví dụ rất đơn giản trong đó một hàm có hai bao đóng với các giá trị khác nhau cho a
.
def elvis(a):
def f(s):
return a + ' for the ' + s
return f
f1 = elvis('one')
f2 = elvis('two')
print f1('money'), f2('show')
Tôi không có vấn đề với ý kiến cho rằng khi chúng ta đang đọc mã cho chức năng f
, khi chúng ta thấy a
, nó không được định nghĩa trong f
, vì vậy chúng tôi bật lên để chức năng kèm theo và tìm ai ở đó và đó là những gì a
trong số f
đề cập đến. Vị trí trong mã nguồn là đủ để cho tôi biết rằng f
nhận giá trị cho a
từ phạm vi bao quanh.
Nhưng như được mô tả here, khi một hàm được gọi, khung cục bộ của nó mở rộng môi trường mẹ của nó. Vì vậy, làm tra cứu môi trường trong thời gian chạy là không có vấn đề. Nhưng những gì tôi không chắc chắn là một máy phân tích tĩnh luôn luôn có thể làm việc ra mà đóng cửa được đề cập đến tại thời gian biên dịch, trước khi mã được chạy. Trong ví dụ trên, rõ ràng là elvis
có hai bao đóng và rất dễ theo dõi chúng, nhưng các trường hợp khác sẽ không đơn giản như vậy. Bằng trực giác, tôi lo lắng rằng một nỗ lực phân tích tĩnh có thể xảy ra một vấn đề tạm dừng nói chung.
Vì vậy, phạm vi từ vựng thực sự có khía cạnh động đối với nó, vị trí trong mã nguồn cho chúng ta biết phạm vi bao hàm có liên quan nhưng không nhất thiết phải đóng cửa? Hay đây là một vấn đề được giải quyết trong các trình biên dịch, và tất cả các tham chiếu trong các hàm đóng của chúng thực sự có thể được làm việc chi tiết một cách tĩnh không?
Hoặc câu trả lời có phụ thuộc vào ngôn ngữ lập trình - trong trường hợp đó phạm vi từ vựng không phải là một khái niệm mạnh như tôi nghĩ?
[EDIT @comments:
Về ví dụ của tôi, tôi có thể trình bày lại câu hỏi của tôi: Tôi đọc tuyên bố như "độ phân giải từ vựng có thể được xác định tại thời gian biên dịch", nhưng tự hỏi như thế nào tham chiếu đến giá trị của a
trong f1
và f2
có thể được tính toán tĩnh/tại thời gian biên dịch (nói chung).
Giải pháp là phạm vi từ vựng không đòi hỏi quá nhiều. L.S. có thể cho chúng tôi biết, tại thời điểm biên dịch, được gọi là sẽ được xác định bất cứ khi nào tôi đang ở f
(và điều này rõ ràng có thể được tính toán tĩnh), nhưng xác định giá trị giá trị (hoặc, đóng cửa đang hoạt động) là 1) vượt quá LS khái niệm, 2) thực hiện tại thời gian chạy (không tĩnh) vì vậy là năng động trong một ý nghĩa, nhưng tất nhiên 3) sử dụng một quy tắc khác nhau từ phạm vi năng động.
Thông báo takeaway, để báo @PatrickMaupin, là "Một số công việc năng động vẫn phải được thực hiện". ]
Điều gì khác có thể có nghĩa là gì? Ngôn ngữ lập trình phải được xác định, nếu không chúng tôi sẽ không sử dụng chúng. Mọi thứ đều khó khăn như vậy. – wallyk
Tôi không chắc mình hiểu câu hỏi. Bạn có hỏi liệu các giá trị của 'f1' và' f2' có thể được xác định bằng cách sử dụng phân tích tĩnh không? – Barmar
Theo định nghĩa, phạm vi từ vựng hoàn toàn là từ vựng. Bạn chỉ cần nhìn vào hàm lexical kèm theo, và hàm kèm theo của nó, v.v. – Barmar