biến địa phương trong một chức năng hoặc chương trình con (bao gồm cả địa chỉ trả lại của nó) phải là một bản sao tươi bất cứ khi nào nó được gọi.
Thông thường việc này được thực hiện bằng cách sử dụng kiến trúc ngăn xếp. Bất cứ khi nào một hàm được gọi, các đối số của nó được đẩy lên ngăn xếp, sau đó địa chỉ trả về của nó được đẩy, sau đó một khối bộ nhớ cũng được "đẩy" (bằng cách giảm con trỏ ngăn xếp xuống một lượng vừa đủ). Một thanh ghi đặc biệt, "con trỏ khung" được đặt chỉ vào bộ nhớ đó, và hàm này đề cập đến tất cả các biến cục bộ của nó bằng cách tham chiếu tới thanh ghi đó.
Các ngôn ngữ khác không sử dụng ngăn xếp phần cứng vật lý, nhưng ngôn ngữ hợp lý được triển khai dưới dạng danh sách được liên kết, nhưng nguyên tắc thì giống nhau.
Vì Fortrans ban đầu không có khái niệm này và lưu trữ tất cả các biến tại các vị trí toàn cầu cố định, một cuộc gọi đệ quy sẽ bị lỗi hoặc treo. Ví dụ, nếu một cuộc gọi B gọi C gọi B, sau đó B trở về C, mà trở về B, mà trở về C, infinitum quảng cáo, bởi vì B chỉ có thể nhớ một địa chỉ trở lại.
calls: A -> B -> C -> B
returns: B <- C <- B
B -> C
Hơn nữa, tất cả biến cục bộ và đối số của cuộc gọi đầu tiên đến B bị ghi đè khi cuộc gọi thứ hai đến B xảy ra.
Nguồn
2013-02-05 16:21:52
Đồng ý, chào mừng bạn đến với scicomp và cảm ơn câu hỏi. Chỉ cần để lặp lại tất cả mọi thứ Deer Hunter cho biết, chúng tôi có rất nhiều người dùng Fortran trong cộng đồng này, nhưng chúng tôi thường không xử lý các câu hỏi lập trình chung như thế này. Tôi sẽ di chuyển cái này sang StackOverflow. –
Ok tôi hiểu rồi. Cảm ơn bạn đã di chuyển –
Tôi đoán điều duy nhất bạn cần là: các hàm và biến cục bộ và không gian lưu trữ đối số cho mỗi lời gọi hàm. Điểm a. trong câu hỏi của bạn dường như gợi ý rằng không gian lưu trữ được tái sử dụng trên các lời gọi hàm. – jackrabbit