Hallo Darkwing99
syntaktisch ist der Unterschied:
statisch: CALL ‚literal‘ …, mit literal = Name des Moduls
dynamisch: CALL feldname …, mit feldname = feld, in das vorher der Name des Moduls gemoved wurde.
Durcj die COBOL Options kann man außerdem steuern, dass auch der syntaktisch statische Call dynamisch behandelt wird ((NO)DYNAM).
Dynamische Calls erzeugen keine externen Referenzen im Objektcode und werden damit nicht beim Linkage-Editing aufgelöst, sondern erst zur Laufzeit. Dadurch wird der Objektcode kleiner und auch zur Laufzeit werden nur die tatsächlich benutzten Module geladen. Diese Module sind dann immer aktuell; alte Versionen von Modulen sind nicht an Hunderte von Hauptprogrammen geklebt und werden weiterbenutzt. Nachteilig ist die schlechtere Performance: dynamische CALLs erzeugen längeren Maschinencode als statische und enthalten außerdem Supervisor Call Instruktionen (SVCs, d.h. der Supervisor wird bemüht, um das Modul erstmalig zu laden. Es kann auch passieren, dass ein Modul in den Ladebibliotheken nicht gefunden wird; kann peinlich sein, weil es erst zur Laufzeit festgestellt wird.
Statische Calls sind performanter in der Ausführung. Module werden mit dem rufenden Programm durch den Linkage Editor fest verklebt und so in die Ladebibliothek gestellt. Der Objektcode ist deshalb größer. Es besteht auch die Gefahr, dass alte Modulversionen weiter benutzt werden, weil man evtl. nicht weiß (fehlendes Repository), welche Programme man nach Moduländerungen neu linken muss. Zur Laufzeit können außerdem keine ABENDs wegen nicht gefundener Module auftreten.
Ein Kompromiss, der alle Vorteile und kaum Nachteile hat, ist der sog. semi-statische Call (kein COBOL-Thema). Melde dich bei Interesse.
Harald
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]