2016-11-07 6 views
2

배열을 만들 때 fortran과 같은 언어는 모든 정적 환경에있을 때 활성화 레코드를 어떻게 만들 수 있습니까? 컴파일 시간 동안 배열)? 나는 그것이 참조에 의한 전달을 사용한다는 것을 알고있다. 활성화 레코드에서 배열 대신에 참조를 저장한다는 의미인데 아직 배열되지 않은 배열에 대한 참조를 저장할 수 있는가?포트란 (또는 모든 정적 환경이있는 언어)에서 활성화 레코드 및 배열

+0

모든 정적 환경은 무엇을 의미합니까? 동일한 배열을 매우 다른 방식으로 볼 수 있으며 하나의 범위에서 배열 설명자를 사용하고 다른 범위에서 간단한 포인터를 사용할 수 있다는 것을 이해해야합니다. –

+0

또한 포트란은 간단한 참조를 전달하지 않습니다. 그리고 디스크립터가 필요할 때 종종 포인터가 필요하지 않습니다. –

+0

그러면 활성화 레코드는 어떻게 사용됩니까? 어떻게 불특정 크기의 배열에 대한 활성화 레코드에 공간을 만드나요? –

답변

1

FORTRAN의 많은 구현에서 코드 세그먼트의 확장으로 정적으로 할당 할 수있는 각 서브 프로그램에 대해 단일 활성화 레코드가 있다고 보통 말하기 때문에 혼란 스러울 수 있습니다. (예 : TW Pratt & MV Zelkowitz의 "Programming Languages, Design and Implementation"제 4 판 참조)

명심해야 할 점은 활성화 기록은 실행 중에 항상 채워지므로 공간은 정적으로 할당됩니다. 동일한 서브 프로그램을 여러 번 호출 할 수 있기 때문에 이해하기 쉽습니다. 그리고 그 모든 통화는 동일한 활성화 기록을 공유하며, 매번 한 번만 호출됩니다.

더 중요한 것은 배열 데이터가 활성화 레코드에 포함되어 있지 않다는 것입니다. 인수를 참조로 전달한다는 것은 데이터의 중복이 없음을 의미합니다. 참조 (포인터 또는 구현이 선택하는 것) 만 활성화 레코드에 포함됩니다. 서브 프로그램에서 배열 요소에 대한 액세스는 기본 주소 + 오프셋 메커니즘에 의해 계산 될 수 있습니다.

+0

참조가 활성화 레코드에만 저장 되었기 때문에 배열이 가능합니까? –

+0

일부 확장하려면 예; 특히 각 서브 프로그램에 대해 단일 정적 활성화 레코드를 작성하는 프로그래밍 언어의 경우. – innoSPG