มันเป็นผลข้างเคียงที่ไม่ได้ตั้งใจของกลยุทธ์การประเมินการเรียกใช้ฟังก์ชันของ FORTRAN ร่วมกับการเพิ่มประสิทธิภาพคอมไพเลอร์ที่ผิดพลาด
FORTRAN II แนะนำฟังก์ชั่นที่ผู้ใช้กำหนดและซับรูทีนที่มีการขัดแย้งของพวกเขาผ่านอ้างอิง (เพราะเหตุใดฉันไม่รู้มันอาจมีประสิทธิภาพมากกว่าฮาร์ดแวร์แบบ pass-by-value ในเวลานั้น)
โดยปกติการอ้างอิงแบบ pass-by-reference หมายความว่าคุณจะต้องผ่านค่า l-value (เช่นตัวแปร) แทนค่า r-value แต่นักออกแบบของ FORTRAN ตัดสินใจที่จะเป็นประโยชน์และให้คุณส่งค่า r-values เป็นอาร์กิวเมนต์ต่อไป คอมไพเลอร์จะสร้างตัวแปรให้คุณโดยอัตโนมัติ ดังนั้นถ้าคุณเขียนว่า:
CALL SUBFOO(X + Y, 4)
คอมไพเลอร์จะแปลงสิ่งนี้เบื้องหลังให้เป็นอย่าง
TEMP1 = X + Y
TEMP2 = 4
CALL SUBFOO(TEMP1, TEMP2)
นอกจากนี้ยังมีการเพิ่มประสิทธิภาพคอมไพเลอร์ทั่วไปที่เรียกว่า“ สระรวม” ซึ่งจะรวมหลายอินสแตนซ์ของค่าคงที่ตัวเลขเดียวกันเป็นตัวแปรที่สร้างขึ้นอัตโนมัติเดียวกัน (หลายภาษาในตระกูล C จำเป็นต้องใช้สิ่งนี้สำหรับตัวอักษรสตริง) ดังนั้นหากคุณเขียน
CALL SUBBAR(4)
CALL SUBBAZ(4)
นี้จะได้รับการปฏิบัติราวกับว่ามันเป็น
FOUR = 4
CALL SUBBAR(FOUR)
CALL SUBBAZ(FOUR)
ซึ่งดูเหมือนจะเป็นสิ่งที่สมเหตุสมผลอย่างสมบูรณ์แบบจนกว่าคุณจะมีโปรแกรมย่อยที่เปลี่ยนค่าของพารามิเตอร์
SUBROUTINE SUBBAR(X)
!...lots of code...
X = 5
!...lots of code...
END SUBROUTINE SUBBAR
บูม! CALL SUBBAR(4)
เปลี่ยนค่าของ 4 ในพูลตัวอักษรเป็น 5 จากนั้นคุณเหลือสงสัยว่าทำไมSUBBAZ
คุณสมมติว่าคุณผ่าน 5 แทนการ4
เขียนโค้ดจริง
เวอร์ชั่นใหม่ของ Fortran ช่วยลดปัญหานี้โดยให้คุณประกาศINTENT
ตัวแปรเป็นIN
หรือOUT
และทำให้คุณมีข้อผิดพลาด (หรืออย่างน้อยคำเตือน) หากคุณผ่านค่าคงที่เป็นOUT
พารามิเตอร์