Để mở rộng các nhận xét của tôi, nội dung cuốn sách đó không rõ ràng, điều gì làm xáo trộn vấn đề.
Như tôi đã nhận xét, cuốn sách đó đang cố gắng nói, "chúng ta hãy lấy vô số con khỉ để viết mọi hàm C ++ có thể tưởng tượng được mà có thể được viết. Sẽ có trường hợp nếu chúng ta chọn một biến (một số hàm cụ thể mà lũ khỉ đã viết) sử dụng, chúng tôi không thể tìm hiểu liệu hàm có thay đổi biến đó hay không. "
Tất nhiên đối với một số (thậm chí nhiều) chức năng trong bất kỳ ứng dụng nhất định nào, điều này có thể được xác định bởi trình biên dịch và rất dễ dàng. Nhưng không phải cho tất cả (hoặc nhất thiết là hầu hết).
Có thể dễ dàng phân tích chức năng này:
static int global;
void foo()
{
}
"foo" rõ ràng không sửa đổi "toàn cầu". Nó không sửa đổi bất cứ điều gì và một trình biên dịch có thể giải quyết vấn đề này rất dễ dàng.
Chức năng này không thể được phân tích như vậy:
static int global;
int foo()
{
if ((rand() % 100) > 50)
{
global = 1;
}
return 1;
Vì các hành động của "foo" phụ thuộc vào một giá trị có thể thay đổi trong thời gian chạy , nó thường không thể được xác định tại thời điểm biên dịch liệu nó có sửa đổi "toàn cục" hay không.
Toàn bộ khái niệm này dễ hiểu hơn nhiều so với các nhà khoa học máy tính tạo ra nó. Nếu hàm có thể làm điều gì đó khác biệt dựa trên những thứ có thể thay đổi trong thời gian chạy, thì bạn không thể tìm ra nó sẽ làm gì cho đến khi nó chạy và mỗi lần nó chạy nó có thể làm điều gì đó khác. Dù có thể chứng minh là không thể hay không, thì rõ ràng là không thể.