Hatalı bir derleyici optimizasyonu ile birlikte FORTRAN'ın işlev çağrısı değerlendirme stratejisinin kasıtsız bir yan etkisi oldu.
FORTRAN II, kullanıcı tanımlı fonksiyonlar ve alt yordamları, referans olarak verilen argümanlarıyla tanıttı . (Neden, bilmiyorum. Muhtemelen zamanın IBM donanımı için değersiz değerden daha etkiliydi.)
Normal olarak, referans referansı, r değeri yerine bir l değerini (değişken gibi) iletmeniz gerektiği anlamına gelir. Ancak FORTRAN'ın tasarımcıları yardımcı olmaya karar verdi ve yine de r-değerlerini argüman olarak iletmenize izin verdi. Derleyici sizin için otomatik olarak bir değişken oluşturur. Yani, eğer yazdıysanız:
CALL SUBFOO(X + Y, 4)
derleyici bunu perde arkasındaki gibi bir şeye çevirirdi
TEMP1 = X + Y
TEMP2 = 4
CALL SUBFOO(TEMP1, TEMP2)
Aynı zamanda, aynı sayısal sabitin birden fazla örneğini aynı otomatik olarak üretilen değişkenle birleştiren “değişmez havuz” adı verilen ortak bir derleyici optimizasyonu da vardı. (C ailesindeki birkaç dilde bunun için çok sayıda dize gerekir.) Öyleyse, eğer yazdıysanız
CALL SUBBAR(4)
CALL SUBBAZ(4)
Bu sanki öyleymiş gibi muamele görürdü
FOUR = 4
CALL SUBBAR(FOUR)
CALL SUBBAZ(FOUR)
Bu , parametrelerinin değerini değiştiren bir alt program olana kadar yapılması makul bir şey gibi görünüyor .
SUBROUTINE SUBBAR(X)
!...lots of code...
X = 5
!...lots of code...
END SUBROUTINE SUBBAR
Boom! CALL SUBBAR(4)
değişmezlik havuzundaki 4'ün değerini 5 olarak değiştirdi ve sonra neden kodda yazdığınız SUBBAZ
yerine neden 5'i geçtiğinizi varsaydığınızı merak ediyorsunuz 4
.
Fortran'ın daha yeni sürümleri, INTENT
bir değişkeni IN
veya olarak tanımlamanıza izin OUT
vererek ve bir sabit olarak OUT
parametre olarak geçerseniz size bir hata (veya en azından bir uyarı) vererek, bu sorunu azaltır .