Entwurfsmuster beim Schreiben numerischer Software in C ++


13

Ich suche nach Ressourcen zu Entwurfsmustern und -prinzipien für numerische Software, möglicherweise, aber nicht unbedingt, mit Schwerpunkt auf objektorientierten Ansätzen für numerische Codes.

Ich kenne den Text Writing Scientific Software: Ein Leitfaden für guten Stil , aber dieser befasst sich immer noch mit Dingen wie Gleitkomma-Problemen, wie und wann optimiert werden muss usw.

Ich bin auf der Suche nach Informationen über das Gesamtbild des Entwurfs numerischer Codes, nicht über irgendetwas, das sich mit Algorithmen und dergleichen befasst.

Ich hoffe, dass es Ressourcen dafür gibt, und man muss nicht einfach Bibliothek für Bibliothek durchgehen, zumal es keinen Leitfaden gibt, in dem die Dinge richtig gestaltet werden, abgesehen von meinen eigenen Kenntnissen über gute Redewendungen und Praktiken in C ++.

(Dies ist nicht sprachspezifisch, aber wenn es sprachspezifische Inhalte gibt, würde ich C ++ vorziehen.)


Ich habe oft darüber nachgedacht, ein solches Buch zu schreiben. Die Bandbreite möglicher Ansätze ist jedoch riesig (und hängt stark von der primären numerischen Technik + dem Problembereich ab) und es wird eher eine Enzyklopädie benötigt. Auch kann keine einzelne Person alle Möglichkeiten erfassen. Das Beste, was man tun kann, wenn man der traditionellen Software-Praxis folgt und die Hardware-Entwicklungen im Auge behält. Was ist Ihre Technik und Ihr Interessensgebiet?
Biswajit Banerjee

2
Eine weitere nützliche Referenz, die nicht ganz zum Ziel passt, ist "Effective Computation in Physics" von Anthony Scopatz und Kathryn Huff.
Brian Borchers

@BrianBorchers Hm, es scheint, dass die Hälfte davon in einer Einführung in Python steckt und sich dann auf Entwicklungstools konzentriert.
user1997744

Antworten:


8

Ich habe seit 20 Jahren numerische Software entwickelt und finde, dass wir wahrscheinlich die Mehrheit der im Buch der Viererbande ( siehe hier ) beschriebenen Entwurfsmuster verwendet haben . Letztendlich handelt es sich bei numerischer Software nur um umfangreiche, komplexe Software. Es ist daher möglicherweise nicht verwunderlich, dass dieselben Entwurfsüberlegungen gelten wie bei anderer Software.

Natürlich gibt es eine Reihe von Fällen, die für numerische Algorithmen spezifisch sind (siehe z. B. hier ), aber die Kenntnis der "traditionellen" Gruppe von Entwurfsmustern ist bereits ein guter Anfang.


Ich möchte hinzufügen, dass man für numerische Berechnungen auf neuerer Hardware versuchen sollte, das Verfolgen von Zeigern zu minimieren (was viele der Gang of Four-Muster verwenden). Ein guter Ausgangspunkt für C ++ - Designs ist github.com/isocpp/CppCoreGuidelines/blob/master/…
Biswajit Banerjee

@BiswajitBanerjee Ja, die C ++ - Kernrichtlinien sind Grundkenntnisse für alle, die sich für die moderne C ++ - Nutzung interessieren. Herb Sutter ist einer der Herausgeber und Sie können seinem Rat immer vertrauen.
user1997744

@ user1997744 Meinten Sie Bjarne? Herb Sutter ist auch berühmt für seine "immer automatische" Idee, die nur zum Schreiben von Code führt (nicht sicher, wie sehr ich seinem Urteil vertrauen würde). Auch die C ++ - Kernrichtlinien sind weit entfernt von Grundkenntnissen. Du wirst überrascht sein.
Biswajit Banerjee

@BiswajitBanerjee Wenn dies nicht der Fall ist, kann ich sagen, dass ein Entwickler niemals über ein einzelnes Interview hinaus Fortschritte machen würde, wenn er nicht mit den meisten Richtlinien und deren Verwendung vertraut wäre (mit Ausnahme dessen, wo der Legacy-Code dies möglicherweise schwierig macht).
user1997744

6

Ich empfehle diesen Matthew G Knepley. Programmiersprachen für das wissenschaftliche Rechnen. arXiv-Vorabdruck arXiv: 1209.1711, 2012 ( https://arxiv.org/pdf/1209.1711.pdf )

Ich rate auch, andere Codes zu suchen und zu lesen, zum Beispiel Dreieck, PETSc, MoAB, deal.II, Fenics und viele andere. Nicht alle Lösungen werden für Sie funktionieren, aber am Ende ist das Bewältigen und Lernen von anderen (erfahrenen Entwicklern und erfolgreichen Codes) die beste Lektion zum Entwerfen von Code.

Darüber hinaus halte ich es für besser, sich einem bestehenden Projekt anzuschließen und Mitwirkender oder Entwickler zu werden. Manchmal magst du es, etwas Neues anzustoßen, aber du musst solide Argumente haben, um das zu tun.


Mein Argument, etwas Neues
anzustoßen,

1
Ich verstehe dieses Argument. Ich hatte vor langer Zeit dasselbe getan. Jetzt denke ich, dass es verfrüht war. Es könnte sein, dass wir am Anfang alle die gleichen Fehler machen müssen. Um zuerst laufen zu lernen, muss man fallen. Wenn Sie zum ersten Mal eigenen Code schreiben, sind Sie höchstwahrscheinlich der einzige Benutzer Ihres Codes. Wenn Sie einen Beitrag zum von der Community entwickelten Code leisten, wird Ihre Arbeit wahrscheinlich von anderen verwendet, und dies gibt Ihnen ein Gefühl für Leistung und Wertschätzung. Auf Pull-Anfrage erhalten Sie Kommentare / Bewertungen, anhand derer Sie Ihre Fähigkeiten erlernen und verbessern können.
Likask

Nun, es gibt keine Bibliothek für eine ultraspezifische esoterische Berechnung, die ich durchführen muss. Letztendlich muss ich also meine eigene schreiben, obwohl es natürlich nicht notwendig ist, alles neu zu erfinden.
user1997744

Ein guter Rat, um an einem bestehenden Open Source-Projekt teilzunehmen. Dadurch bin ich viel besser in ein Netzwerk von Programmierern geraten als ich.
user14717
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.