При создании массива, как язык, например fortran, делает записи активации, когда он находится во всей статической среде (поскольку он не знает размер массив во время компиляции)? Я знаю, что он использует передачу по ссылке, так это значит, что в записи активации она хранит ссылку вместо массива, которая позволяет ему хранить ссылку на массив, который еще не был создан?Активационные записи и массивы в Fortran (или языки со всеми статическими средами)
ответ
Вы можете быть смущены, потому что обычно говорят, что во многих реализациях FORTRAN имеется одна запись активации для каждой подпрограммы, которая может быть распределена статически как расширение сегмента кода. (см., например: 4-е издание «Языки программирования, проектирование и реализация» от TW Pratt & MV Zelkowitz.)
Что-то, о чем следует помнить, заключается в том, что даже в этом случае запись активации всегда заполняется во время исполнения пространство выделяется статически. Это легко понять, поскольку в одной и той же подпрограмме может быть много вызовов. И все эти звонки имеют одну и ту же активационную запись, и каждый звонок остается только одним.
Что еще более важно, данные массива не включаются в запись активации. Передача аргумента по ссылке означает отсутствие дублирования данных. В запись активации включена только ссылка (указатель или любой другой вариант реализации). В подпрограмме доступ к элементам массива затем может быть вычислен с помощью механизма базового адреса + смещения.
Итак, массивы возможны, потому что ссылка хранится только в записи активации, правильно? –
В некоторой степени да; особенно для тех языков программирования, которые создают единую статическую запись активации для каждой подпрограммы. – innoSPG
Что вы подразумеваете под всеми статическими условиями? Вы должны понимать, что один и тот же массив можно посмотреть по-разному и может использовать дескриптор массива в одной области видимости и простой указатель в другой области. –
Кроме того, Fortran не проходит по простой ссылке. И когда это нужно, дескриптор часто не нужен, просто указатель. –
Итак, как он использует учетные записи активации? Как сделать пространство в записи активации для массива неуказанных размеров? –