Đó là một tác dụng phụ không chủ ý của chiến lược đánh giá cuộc gọi chức năng của FORTRAN kết hợp với tối ưu hóa trình biên dịch sai.
FORTRAN II đã giới thiệu các hàm và chương trình con do người dùng định nghĩa với các đối số được truyền bằng tham chiếu . (Tại sao, tôi không biết. Nó có thể hiệu quả hơn so với giá trị truyền qua trên phần cứng của IBM thời đó.)
Thông thường, tham chiếu qua có nghĩa là bạn phải truyền một giá trị l (giống như một biến) thay vì giá trị r. Nhưng các nhà thiết kế của FORTRAN đã quyết định hữu ích và cho phép bạn vượt qua các giá trị r dưới dạng đối số. Trình biên dịch sẽ tự động tạo một biến cho bạn. Vì vậy, nếu bạn đã viết:
CALL SUBFOO(X + Y, 4)
trình biên dịch sẽ chuyển đổi điều này đằng sau hậu trường thành một cái gì đó như
TEMP1 = X + Y
TEMP2 = 4
CALL SUBFOO(TEMP1, TEMP2)
Ngoài ra còn có một tối ưu hóa trình biên dịch phổ biến được gọi là pool pool theo nghĩa đen, có thể hợp nhất nhiều thể hiện của cùng một hằng số vào cùng một biến được tạo tự động. (Một số ngôn ngữ trong họ C yêu cầu điều này cho chuỗi ký tự.) Vì vậy, nếu bạn đã viết
CALL SUBBAR(4)
CALL SUBBAZ(4)
điều này sẽ được đối xử như thể nó là
FOUR = 4
CALL SUBBAR(FOUR)
CALL SUBBAZ(FOUR)
có vẻ như là một điều hoàn toàn hợp lý để làm cho đến khi bạn có một chương trình con thay đổi giá trị của các tham số.
SUBROUTINE SUBBAR(X)
!...lots of code...
X = 5
!...lots of code...
END SUBROUTINE SUBBAR
Bùng nổ! CALL SUBBAR(4)
đã thay đổi giá trị của 4 trong nhóm nghĩa đen thành 5. Và sau đó bạn sẽ tự hỏi tại sao SUBBAZ
giả sử bạn vượt qua nó 5 thay vì 4
bạn thực sự đã viết trong mã.
Các phiên bản mới hơn của Fortran giảm thiểu vấn đề này bằng cách cho phép bạn khai báo INTENT
biến là IN
hoặc OUT
và đưa ra lỗi (hoặc ít nhất là cảnh báo) nếu bạn truyền hằng số dưới dạng OUT
tham số.