Назначение Fortran для атрибута объявления и SAVE
В fortran 95, если вы назначаете переменную в объявлении
integer :: var = 0
он эквивалентен
integer, save :: var = 0
и поэтому переменная сохраняется после выполнения программы (эквивалентна static
в C говорю) и не восстанавливается при повторном вызове. Какова обоснованная/техническая проблема такого поведения (опасное поведение IMHO)?
Ответы
Ответ 1
Я не думаю, что есть такое обоснование такого поведения.
Но насколько я знаю, Стефано, вы использовали неправильную терминологию. В вашем коде нет инструкции присваивания только инициализация переменной (var) с использованием выражения инициализации (0).
integer :: var = 0 ! type declaration & initialization
integer :: var ! type declaration
var = 0 ! assignment
Так кажется, что это было просто решение комитета. Если у нас есть такое выражение (с признаком равенства в заявлении объявления типа), то инициализация не является присвоением. И инициализация выполняется только один раз во время выполнения программы (а не процедур).
Однако для такого решения могут быть некоторые исторические причины. Посмотрите этот поток.
Сегодня такое поведение опасно, потому что многие другие широко используемые языки следуют другим соглашениям об инициализации/присваивании.
Ответ 2
Многие старые FORTRAN 77 и более ранние компиляторы статически выделяли все переменные. Многие программисты полагались на это поведение - это было технически ошибкой в их программах, поскольку, если они не использовали квалификатор "SAVE" в объявлении (или добавили простой оператор SAVE для каждой процедуры), значение переменной было undefined при повторной попытке к процедуре. Но так как в те времена программы, как правило, привязывались к определенной платформе и компилятору в течение многих лет, программистам это удалось. Это очень распространенная "гочка" в переносе старого кода FORTRAN 77 на современных компиляторов Fortran >= 90. Большинство компиляторов предоставляют коммутаторы времени компиляции для восстановления такого поведения, например fno-automatic option gfortran. Скорее всего, комитет рассмотрел переменные, которые были инициализированы в их декларации, поскольку, скорее всего, понадобится атрибут SAVE - на мой взгляд, разумное дизайнерское решение. Я думаю, что то, что больше всего отличается от других языков, и проще всего путать многоязычного программиста, состоит в том, что инициализация выполняется только один раз.