Tầm_vực_(khoa_học_máy_tính)

Trong lập trình máy tính, tầm vực (tiếng Anh: scope) của một ràng buộc tên – liên kết tên với một thực thể, ví dụ như biến – là một vùng của chương trình máy tính nơi liên kết hợp lệ: khi tên có thể được dùng để chỉ đến thực thể. Một khu vực như vậy được gọi là khối tầm vực (scope block). Trong các phần khác của chương trình, tên có thể chỉ để các thực thể khác (nó có thể có ràng buộc khác), hay không có gì cả (nó có thể không bị ràng buộc).Phạm vi của một ràng buộc còn được gọi là khả năng hiển thị (visibility) của một thực thể, đặc biệt trong các tài liệu kỹ thuật cũ hơn – điều này xuất phát từ quan điểm thực thể được tham chiếu, chứ không phải tên tham chiếu. Tầm vực là một phần của chương trình hoặc có thể là tầm vực cho một tập hợp các ràng buộc – một định nghĩa chính xác rất khó, nhưng trong trường hợp thông thường và trong thực tế thường tương ứng với một khối, một hàm, hay một tập tin, tùy thuộc vào ngôn ngữ và loại của thực thể. Thuật ngữ "tầm vực" cũng được sử dụng để chỉ tập hợp tất cả các thực thể có thể thấy được hay tên hợp lệ trong một phần của chương trình hoặc tại một thời điểm nhất định trong chương trình, mà thường được gọi chính xác hơn là ngữ cảnh (context) hay môi trường (environment).[lower-alpha 1]Nói một cách chặt chẽ hơn[lower-alpha 2] và trong thực tế với hầu hết các ngôn ngữ lập trình, "một phần của chương trình" đề cập đến "một phần của mã nguồn (khu vực văn bản)", và được gọi là tầm vực từ vựng (lexical scope). Tuy nhiên trong một số ngôn ngữ, "một phần chương trình" đề cập đến "một phần của thời gian chạy (khoảng thời gian trong khi thực thi)", và được gọi là tầm vực động (dynamic scope). Cả hai thuật ngữ đó đều có chút sai lệch – chúng sử dụng sai thuật ngữ kỹ thuật, như đã thảo luận trong phần định nghĩa – nhưng bản thân sự khác biệt là chính xác, và đó là những thuật ngữ tương ứng tiêu chuẩn. Tầm vực từ vựng là trọng tâm của bài viết này, với tầm vực động được hiểu là ngược lại với tầm vực từ vựng.Trong hầu hết các trường hợp, phân giải tên (name resolution) dựa trên tầm vực từ vựng tương đối đơn giản để sử dụng và hiện thực, vì khi sử dụng người ta có thể đọc ngược mã nguồn để xác định thực thể nào mà tên chỉ đến, và khi hiện thực người ta có thể duy trì một danh sách các tên và ngữ cảnh khi biên dịch hay thông dịch một chương trình. Khó khăn phát sinh khi name masking, forward declaration, và hoisting, trong khi những khó khăn đáng kể phát sinh với biến phi cục bộ, đặc biệt trong bao đóng.