In Nat1 there didn’t exist AIVs, but Global Variables. They have been collected at compile/run time and were implicitly added to each program compiled. Thus compiled programs could have grown without the knowledge of the programmer (even unused global variables were kept!)
With Nat2 they introduced the GDA to collect all global variables explicitly. The old globals have only been available in report mode programs. With Nat2.2 (I think) they invented the INDEPENDENT clause of DEFINE DATA to make the old globals available to structured mode programs (and with intervention of the customers!). To distinguish these old globals from global variables in a GDA they called them AIVs.
Differences between GDA and AIV:
GDA can not be shared among CALLNAT! AIV can!
GDA can not be extended at runtime. AIV can!
Programs keep a timestamp of the catalogued GDA, thus need recompilation, when GDA changes (what a mess!)
With blocked GDA (iiiiiihh) you don’t know what’s in the global data, if on of the called programs uses other blocks of this GDA!
I suggest to use AIV to enable subprograms to keep their state between calls and not to pass the state information in the parameter data (for example data access programs, that create a result set and pass one record for each call). Each AIV should be preceded by the using program name to avoid naming conflicts.
On the other hand I suggest to avoid the usage of GDA. If you have to pass informations from one program to the other, use a PDA (PERFORM / CALLNAT), thus you can restrict the usage by the using program.
Just my opinion!