Assegnazione di Fortran sulla dichiarazione e attributo di attributo SAVE

In fortran 95, se si assegna una variabile alla dichiarazione

integer :: var = 0 

è equivalente a

 integer, save :: var = 0 

e la variabile viene quindi preservata dopo l’esecuzione di routine (equivale a static in C speak) e non viene reinizializzata quando viene richiamata di nuovo. Qual è la logica / la questione tecnica alla base di tale comportamento (IMHO pericoloso)?

Non penso che ci sia qualche logica dietro questo comportamento.

Ma per quanto ne so, Stefano, hai usato la terminologia sbagliata. Nel codice non è presente alcuna inizializzazione della variabile solo istruzione var (var) utilizzando l’espressione di inizializzazione (0).

 integer :: var = 0 ! type declaration & initialization integer :: var ! type declaration var = 0 ! assignment 

Quindi sembra che sia stata solo una decisione di progettazione del comitato. Se abbiamo un’espressione di questo tipo (con il segno di uguaglianza nell’istruzione di dichiarazione del tipo) non è l’inizializzazione dell’assegnazione. E l’inizializzazione avviene solo una volta durante l’esecuzione del programma (e non delle procedure).

Tuttavia potrebbero esserci alcune ragioni storiche per tale decisione. Dai un’occhiata a questo thread.

Oggi un simile comportamento è pericoloso perché molte altre lingue ampiamente utilizzate seguono altre convenzioni sull’inizializzazione / assegnazione.

Molti vecchi compilatori FORTRAN 77 e precedenti hanno allocato staticamente tutte le variabili. Molti programmatori facevano affidamento su questo comportamento – questo era tecnicamente un bug nei loro programmi poiché a meno che non usassero il qualificatore “SAVE” nella dichiarazione (o aggiungessero una semplice istruzione SAVE ad ogni procedura) il valore della variabile era indefinito al rientro in un procedura. Ma dato che a quei tempi i programmi tendevano ad essere legati a una particolare piattaforma e compilatore per anni, i programmatori se la cavavano. Questo è un “trucco” molto comune nel porting del codice FORTRAN 77 legacy a un moderno Fortran> = 90 compilatori. La maggior parte dei compilatori fornisce switch in fase di compilazione per ripristinare questo comportamento, come l’opzione fno-automatic di gfortran. Molto probabilmente la commissione ha visto le variabili che sono state inizializzate nella loro dichiarazione in quanto molto probabilmente hanno bisogno dell’attributo SAVE – a mio avviso, una decisione progettuale ragionevole. Penso che ciò che è più diverso dalle altre lingue, e più facile da confondere con il programmatore multilingue, è che l’inizializzazione viene eseguita solo una volta.