Günther's profileGünther Foidl (gfoidl)PhotosBlogGuestbookMore Tools Help

Blog


    Warum wechselte ich von Fortran nach C#?

    Fortran ist eine wunderbare Programmiersprache die nur eines kann: Rechnen – und das sehr schnell. Mehr kann Fortran nicht.

    Vor allem für numerische Aufgaben bietet die Sprache von Fortran sehr viele eingebaute Funktionen und dies ist ungemein hilfreich. Die Compiler (ich habe den Lahey Fujitsu Fortran Compiler verwendet) sind hochoptimierend. Bei dem von mir verwendeten Lahey-Paket sind weiters hoch optimierte Numerik-Packages inkludiert mit denen sich richtiger Hochleistungscode erstellen lässt – und das habe ich auch gemacht.

    Es stellten sich mir immer die selben Fragen:

    1. Wie bekomme ich die Rohdaten in mein Fortran-Programm?
    2. Wie verarbeitet ich die Daten nach der Berechnung?

    Von Fortran selbst gibt es nur Unterstützung für das Lesen und Schreiben von Dateien, sowohl ASCII als auch binär. Gut mit dem ASCII-Format lassen sich CSV-Dateien verarbeiten, aber das reicht in der heutigen Zeit nicht unbedingt aus. Wie wäre es mit direktem Zugriff auf eine Datenbank? Geht über ein Zusatzpaket wie f90SQL, allerdings arbeitet man da ganz unten auf der ODBC-Ebene und ist somit wenig komfortabel – geht allerdings. XML? Über den ASCII-Weg lösbar – praktisch ist dies aber nicht.

    Das Ergebnis einer Berechnung sind Zahlen – nackte Zahlen die nicht viel Aussagen. Ein Bild wäre hier sehr angebracht. Das ist aber nicht ohne weiters möglich, denn die Sprache sieht dafür nichts vor.

    Für Fortran gibt es sehr viel OpenSource-Code der zusammengesucht werden will um sich somit eine Art “Framework” zu erstellen. Dies ist aber eine sehr mühselige Aufgabe – davon abgesehen dass man wissen muss was es gibt denn zielloses Suchen nach irgendwelchen Neuigkeiten führt selten zum Ziel ;)

    Vor fast zwei Jahren und im Zuge eines neuen Projektes stieß ich mit Fortran an die Grenzen. Ich wusste dass es Fortran.net gibt und meine Lahey-Installation bot dies auch. Mehr als ein wenig rumspielen war für mich nicht drin, denn die für .net erweiterte Syntax von Fortran war sehr gewöhnungsbedürfig und machte mir keinen Spass. Die grundlegende Syntax von Fortran ist sehr logisch und einfach aufgebaut. Englischkenntnisse reichen um die Sprache zu beherrschen. Gut ein wenig mehr gehört schon dazu ;) Durch die Erweiterungen für .net wurde die Sprache ein wenig vergewaltigt. Um es auf den Punkt zu bringen: Fortran ist dafür nicht gedacht.

    Seit jeher entwickelte ich meine Fortran-Programme mit Hilfe von Modulen um eine gewisse Ordnung und Wiederverwendbarkeit zu erzielen. Dieser Stil war auch von OOP inspiriert obgleich es mit OOP nichts zu tun hatte. Meiner Meinung nach lassen sich größere Projekte ohne OOP nur sehr schwer umsetzen und daher ergibt es sich fast zwangsläufig sich in diese Richtung zu orientieren.

    Wie erwähnt stieß ich mit Fortran an die Grenzen und ich hielt Ausschau nach Alternativen. .net war mir durch die Spielerei mit Fortran.net ein wenig bekannt und ganz besonders gefiel mir das Framework, welches für die meisten wiederkehrenden Aufgaben vorgefertigten Code anbot. Zudem lässt sich mit “der” .net-Sprache C# auch wunderschön OO programmieren.

    Somit sind/waren meine Hauptbeweggründe C# zu lernen und zu verwenden

    • das Framework das bei .net angeboten wird
    • C# als intuitive und objektorientierte Sprache

    Der C#-Compiler ist zwar dumm denn er übersetzt den Code “nur” nach IL-Code und der JITer fürht wenige Optimierungen durch – da dies zur Laufzeit geschieht und somit ein Kompromiss zwischen Verzögerung und Optimierung gefunden werden musste – und dennoch ist C# mittlerweile meine Standardsprache für numerische Berechnungen. Die Zeit für die Berechnung hinkt zwar jener im Vergleich zu Fortran weit hinterher, aber die Berechnung ist nur ein Teil der Gesamtaufgabe und diese gilt es zu betrachten. Dazu gehören Einlesen von Daten, Berechnungen und letztendlich die Ausgabe. Über diesen Zyklus gesehen ist C# im Vorteil. Betrachtet man auch noch den Programmieraufwand der sich bei C# durch die Klassen des Framework im Vergleich zu Fortran erheblich verkürzt ergibt sich ein weiterer bedeutenden Vorteil. Dies geht auch Hand in Hand mit den Vorteilen die sich durch OOP ergeben.

    Warum nicht Fortran.net?
    Wie erwähnt gefällt mir die Syntax nicht und ich denke jeder der die Vorzüge von Visual Studio und Intellisense, etc. schätzen gelernt hat will diese nicht mehr vermissen. Weiters finde ich dass Fortran.net eine Vergewaltigung der Sprache ist und die Vorteile des hoch-optimierenden Compilers fallen zum Teil auch weg. Hinzu kommt dass einige Sprachfeatures für die Matritzen-/Tensorrechnung nicht unterstützt werden.

    Was wünsche ich mir von .net/C#?
    In Hinsicht auf die Numerik habe ich zwei Wünsche an C#:

    1. Unterstützung bei Array-Manipulationen:
      Im Laufe der Zeit habe ich eine kleines Framework (besser Base Class Library ;)) für diese Aufgaben erstellt die zum Teil eine Nachbildung der Fortran-Funktionen sind. Beispielsweise wäre die Initialisierung eines Arrays mit einem Befehl schon eine Erleichterung.
    2. Optimierungen des C#-Compilers:
      Wie oben kurz angeschnitten ist es verständlich dass der JITer keine aufwändigen Optimierungen durchführen kann. Diese Aufgabe könnte aber problemlos der C#-Compiler übernehmen. Einziger Nachteil dabei wäre dass der Code im Reflector nicht mehr dem entspricht der geschrieben wurde. Ich denke jedoch dass dies sicherlich nicht der Beweggrund für den Verzicht auf Optimierungen sind.
      Würde der C#-Compiler die IL-Ausgabe optimieren bräuchte der JITer den Code nur nach Maschinencode übersetzen und zur Laufzeit ergäben sich somit auch Vorteile.
      Es ist klar dass der C#-Compiler keine architekturspezifischen Optimierungen durchführen kann/darf, aber es gibt genügend andere Optimierungen wie zB Inlining, Schleifenmanipulation, Ersetzung von Divisionen durch Konstaten durch Multiplikationen,  etc.

    All dies lässt sich zwar selbst im Code durchführen (auch durch eigene Methode, Klassen) aber dies macht den Code nicht unbedingt leserlicher. Leserlicher Code sollte jedoch immer im Vordergrund stehen! Daher ist es naheliegend dass der Compiler dies übernimmt und dabei kann auch unleserlicher IL-Code entstehen. Nichts anderes passiert zB beim yield-Schlüsselwort und bei LINQ. Daher sehe ich kein Problem darin.

     

    Kurz zusammengefasst kann ich festhalten:
    Fortran ist eine wunderschöne Sprache die extrem schnell rechnen kann, aber gegen den Alleskönner C# generell im Nachteil ist.

     

    Gruss,
    Günther

    November 18

    Simulated Annealing

    Auf myCSharp.de habe ich einen Artikel über Simulated Annealing veröffentlich. Siehe http://www.mycsharp.de/wbb2/thread.php?threadid=78641

    Viel Spass!
    November 01

    Ich bin auf Wikipedia

    Anders als gewohnt einmal kein Beitrag im Sinne der Programmierung:

    Dank Jürgen Thomas gibt es einen Wikipedia-Artikel über mich und meine Speedski-Karriere. Siehe: Günther Foidl

    Ich fühle mich geehrt da ich Jürgen sehr schätze obwohl ich ihn persönlich nicht kenne - die Bekanntschaft basiert auf unserer gemeinsamen Tätigkeit in Programmier-Foren.

    Auf diesem Wege bedanke ich mich recht herzlich bei ihm.