2016-11-16 2 views
1

Ich fange an, Fortran zu lernen, ausgehend von einem C++/Matlab/Java-Hintergrund. Mir ist klar, dass einige Fortran-Programmierer immer noch an F77 festhalten, vielleicht weil sie Objektorientierung, Namensräume und ähnliches nicht mögen und an die alte Syntax gewöhnt sind.Wie können Fortran 77-Programmierer ohne dynamische Speicherzuweisung auskommen?

Ich verstehe, dass Sie ein Programm ohne OOP schreiben können. Was ich nicht verstehe, ist, wie Sie ohne dynamisches Speichermanagement auskommen. Es gibt tausend Beispiele für Fälle, in denen Sie die Array-Größen nicht im Voraus kennen - zum Beispiel wenn Sie eine vollständige Matrix in eine spärliche Matrix konvertieren.

Natürlich bietet der moderne Fortran sowohl "automatische Arrays" als auch "zuweisbare Arrays". Aber diese waren 1977 nicht vorhanden. Wie kommen die F77-Leute ohne diese Konstrukte zurecht?

+1

FORTRAN 77 wurde/wird vorwiegend für das wissenschaftliche Rechnen verwendet, bei dem einige ausgewählte Ausgangsbedingungen (z. B. ein Feld fester Größe) über einen längeren Zeitraum entwickelt werden, Daten ausschreibend. Es gibt keine Benutzereingabe während des Laufs und Sie wissen genau, wie groß Ihre Arrays sein müssen. Teil des Grundes, warum Fortran-Code oft als effizienter bezeichnet wird. –

+0

Ein Ansatz besteht darin, ein einzelnes großes Array (Arbeitsbereich) zu deklarieren und dann ganzzahlige Indizes zu verwenden, um dieses in Abschnitte unterschiedlicher Größe zu unterteilen. (Ich habe nicht mit f77 gearbeitet, also bin ich mir nicht sicher, wie häufig dieser Ansatz in Wirklichkeit wäre). –

+1

@Ed Smith Nun, es gibt sicherlich viele Anwendungen im wissenschaftlichen Rechnen mit festen Größen (z. B. numerische lineare Algebra), aber auch viele mit unbekannter Größe (unstrukturierte Vernetzung, Zeitintegration mit variabler Schrittlänge, dünn besetzte Matrizen usw.) – akvilas

Antwort

5

Innerhalb der Standardsprache lag der Ansatz normalerweise darin, Speicher in einem Array abzulegen, das größer als wahrscheinlich war, aber immer noch innerhalb der Einschränkungen der Plattform lag, und das Paket dann manuell nach Bedarf zu packen. Die Sprache hatte Funktionen wie Sequenzassoziation, Speicherassoziation und einstellbare Arrays, die bei dieser Parzellierung halfen.

Die Verwendung von Spracherweiterungen für die dynamische Speicherverwaltung war ebenfalls üblich.

Die Fähigkeiten von Fortran 77 und früher müssen im Zusammenhang mit den Fähigkeiten der Plattformen dieser Zeit betrachtet werden.

+1

Alle gültigen Punkte. Ich bin wahrscheinlich "zu jung", um die große Revolution der Computer und Sprachen der letzten 60 Jahre wirklich zu begreifen. Ich denke, dass Speicher in den frühen Tagen so teuer war, dass die manuelle Verwaltung von Arrays mit variabler Länge sinnvoll war.Es macht auch Sinn, dass malloc-artige Konstrukte durch Spracherweiterungen oder externe Prozeduren bereitgestellt wurden, bis sie schließlich von F90 übernommen wurden. (Außerdem habe ich festgestellt, dass F77 tatsächlich älter ist als der erste C-Standard ...) – akvilas

+0

Bedenken Sie auch, dass Fortran 90 [viel verspätet] war (https://www.fortran.com/forsaga .html). Eine Form davon war ursprünglich als Fortran 82 bekannt! – IanH

+0

Ich erinnere mich, dass wir in den frühen 80ern eine Maschine mit einer 5MB Wechselfestplatte hatten und diese Maschine 32k RAM hatte ... Mann, der schnell schien, aber fast alles benötigte, um durch den Code zu streamen. Die heutige Maschine bei der Arbeit hat 40 Kerne und 192 GB RAM und ein 10 TB RAID, und in einem Vektor habe ich eine 200 Mio., die ich auf den Stack zuteile ... Und ich betreibe mehrere Instanzen auf vielen Kernen, und ich bin es normalerweise I/O begrenzt. Alles ist buchstäblich eine Million Mal besser/mehr/größer. – Holmz

Verwandte Themen