Gần đây tôi càng trở nên thất vọng vì trong hầu hết các ngôn ngữ lập trình hiện đại tôi đã làm việc với (C / C ++, C #, F #, Ruby, Python, JS và hơn thế nữa), có rất ít, nếu có, hỗ trợ ngôn ngữ để xác định những gì một chương trình con thực sự sẽ làm.
Hãy xem xét mã giả đơn giản sau đây:
var x = DoSomethingWith(y);
Làm cách nào để xác định cuộc gọi đến DoS SomethingWith (y) sẽ thực sự làm gì? Nó sẽ biến đổi y , hoặc nó sẽ trả lại một bản sao của y ? Nó phụ thuộc vào nhà nước toàn cầu hay địa phương, hay nó chỉ phụ thuộc vào y ? Nó sẽ thay đổi nhà nước toàn cầu hoặc địa phương? Làm thế nào để đóng cửa ảnh hưởng đến kết quả của cuộc gọi?
Trong tất cả các ngôn ngữ tôi đã gặp, hầu như không có câu hỏi nào trong số những câu hỏi này có thể được trả lời bằng cách chỉ nhìn vào chữ ký của chương trình con, và hầu như không có bất kỳ hỗ trợ nào trong thời gian biên dịch hoặc thời gian chạy. Thông thường, cách duy nhất là đặt niềm tin của bạn vào tác giả của API và hy vọng rằng tài liệu và / hoặc quy ước đặt tên tiết lộ những gì chương trình con sẽ thực sự làm.
Câu hỏi của tôi là: Có tồn tại bất kỳ ngôn ngữ nào ngày nay tạo ra sự khác biệt mang tính biểu tượng giữa các loại kịch bản này và đặt các ràng buộc về thời gian biên dịch lên mã nào bạn thực sự có thể viết không?
(Tất nhiên có một số hỗ trợ cho điều này trong hầu hết các ngôn ngữ hiện đại, chẳng hạn như mức độ phạm vi và mức đóng khác nhau, sự tách biệt giữa mã tĩnh và mã thể hiện, hàm lambda, et cetera. Nhưng những điều này dường như thường mâu thuẫn với nhau. Ví dụ, một hàm lambda thường sẽ hoàn toàn là chức năng và chỉ cần trả về một giá trị dựa trên các tham số đầu vào hoặc thay đổi các tham số đầu vào theo một cách nào đó. Nhưng thường có thể truy cập các biến tĩnh từ hàm lambda, do đó có thể cung cấp cho bạn quyền truy cập vào các biến thể hiện và sau đó tất cả bị phá vỡ.)