Kiểm tra ngăn xếp là cần thiết vì các chương trình trên JVM và CLR có quyền truy cập mặc định vào các hoạt động nguy hiểm, do đó phải thực hiện một số việc để ngăn chặn thảm họa. Ví dụ, một chương trình không tin cậy có thể tham chiếu thư viện I / O và gọi nó:
using IO;
...
IO.DeleteFile("/home/foo/bla");
Vì vậy, trên mỗi hoạt động nguy hiểm được thực hiện, chúng ta cần kiểm tra xem nó có được phép hay không. Với kiểm tra ngăn xếp thường rất phức tạp để hiểu ai được quyền truy cập vào cái gì. Nó cũng làm cho việc tối ưu hóa như nội tuyến và gọi đuôi khó khăn.
Một cơ chế ưu việt là không cung cấp cho mỗi chương trình quyền truy cập tự động vào các hoạt động nguy hiểm ngay từ đầu. Trong mô hình này, không có cách nào để nhập thư viện IO. Cách duy nhất để có quyền truy cập vào thư viện IO là nếu có ai đó đưa nó cho bạn. Điều này được gọi là bảo mật khả năng. Một giới thiệu có thể được tìm thấy ở đây .
Thay vào đó, chúng tôi sẽ viết chương trình trước như thế này:
Main(IOLibrary IO){
IO.DeleteFile("/home/foo/bla");
}
Thư viện IO là một tham số cho điểm vào của chương trình và đây được gọi là khả năng (vì nó cho phép sử dụng một số khả năng, trong trường hợp này để thực hiện IO). Để có thể chạy chương trình này, chúng ta phải có quyền truy cập vào khả năng IO và chạy chương trình bằng cách gọi Main(ourIOlibrary)
. Nếu chúng tôi đang chạy một chương trình không đáng tin cậy, đơn giản là chúng tôi không chuyển thư viện IO của mình cho nó, vì nó có thể sử dụng thư viện đó để xóa các tệp của chúng tôi. Trong một số trường hợp, chúng tôi muốn cung cấp cho chương trình không tin cậy quyền truy cập hạn chế vào hệ thống tập tin. Trong trường hợp đó, chúng tôi tạo một trình bao bọc xung quanh thư viện IO của riêng chúng tôi chỉ cho phép truy cập vào một thư mục nhất định và chuyển thư mục đó đến chương trình không tin cậy thay vì thư viện IO đầy đủ
Vì vậy, nếu chúng ta cần một khả năng IO để gọi một chương trình cần khả năng IO, điều đó cũng có nghĩa là bất cứ điều gì đã gọi chương trình của chúng ta cần có quyền truy cập vào khả năng IO để có thể cung cấp cho chúng ta. Vậy khả năng IO của nó đến từ đâu? Chà, cuối cùng cũng có một điểm mà con người vận hành máy tính đã gọi một chương trình. Con người này có quyền truy cập vào tất cả các khả năng của hệ thống, vì vậy anh ta có thể vượt qua khả năng IO trên. Nếu con người này không tin tưởng vào chương trình mà anh ta đang chạy, thì anh ta sẽ không truyền khả năng IO của mình cho chương trình đó.
Bạn có thể dễ dàng tưởng tượng các loại khả năng khác: truy cập internet, truy cập để vẽ các thứ trên màn hình của bạn, v.v. Ví dụ: hệ thống plugin trình duyệt an toàn có thể cung cấp khả năng đồ họa cho một plugin không đáng tin cậy chỉ cho phép nó vẽ đồ họa trong một hình chữ nhật được xác định trước trên trang.