FORTRAN의 함수 호출 평가 전략이 잘못된 컴파일러 최적화와 함께 의도 치 않은 부작용이었습니다.
FORTRAN II는 참조로 전달 된 인수와 함께 사용자 정의 함수 및 서브 루틴을 도입 했습니다 . (왜 모르겠다. 아마도 당시의 IBM 하드웨어에서 가치를 전달하는 것보다 더 효율적이었을 것이다.)
일반적으로 기준 별 통과는 r 값 대신 l 값 (예 : 변수)을 전달해야 함을 의미합니다. 그러나 FORTRAN의 디자이너는 도움이되고 r- 값을 인수로 전달할 수 있도록 결정했습니다. 컴파일러는 자동으로 변수를 생성합니다. 당신이 쓴다면 :
CALL SUBFOO(X + Y, 4)
컴파일러는 이것을 배후에서 다음과 같이 변환합니다.
TEMP1 = X + Y
TEMP2 = 4
CALL SUBFOO(TEMP1, TEMP2)
또한“리터럴 풀 (literal pool)”이라는 공통 컴파일러 최적화가 있었는데, 이는 동일한 숫자 상수의 여러 인스턴스를 동일한 자동 생성 변수로 통합합니다. (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
합니다.
최신 버전의 포트란 INTENT
은 변수를 IN
또는 로 선언하고 OUT
상수를 OUT
매개 변수 로 전달하면 오류 (또는 최소한 경고)를 제공 하여이 문제를 완화합니다 .