Gibt es eine empfohlene Möglichkeit, C-Entwicklern wissenschaftliche / technische Programmierung mitzuteilen?

16

Ich habe eine Menge MATLAB-Code, der im Rahmen eines Back-End-Prozesses für eine Webanwendung nach C portiert werden muss (Ausführungsgeschwindigkeit ist für diese Arbeit von entscheidender Bedeutung). Wenn ich versuche, diesen Code an einen C-Entwickler auszulagern, gehe ich davon aus (korrigiere mich, wenn ich mich irre), dass nur wenige C-Entwickler auch MATLAB-Code verstehen (Dinge wie Indexierung und Speicherverwaltung sind unterschiedlich usw.). Ich frage mich, ob es C-Entwickler gibt, die mir ein Verfahren empfehlen können, mit dem ich am besten kommunizieren kann, was der Code bewirkt.

Soll ich beispielsweise den MATLAB-Code bereitstellen und zeilenweise erklären, was er tut? Oder sollte ich nur die Mathematik / den Algorithmus bereitstellen, sie / ihn in einfachem Englisch erklären und den C-Entwickler mit diesem Verständnis auf seine / ihre eigene Weise implementieren lassen (z. B. kann ich davon ausgehen, dass der Entwickler versteht, wie man mit komplexer Mathematik arbeitet (dh imaginär)? Zahlen), wie man Histogramme erstellt, eine FFT durchführt, etc.)?

Oder gibt es eine bessere Methode? Ich gehe davon aus, dass ich nicht der erste bin, der dies tun muss, und frage mich, ob C-Entwickler in diese Situation geraten sind und wissen, wie diese Aufgabe übertragen werden soll.

Vielen Dank im Voraus für alle Kommentare.

gkdsp
quelle
3
Haben Sie versucht, nur mit mcc den Matlab-Code in c umzuwandeln? Ich denke, es istmcc -c matlabfile.m
Will Tate
4
Wenn Sie den Programmierer einstellen, geben Sie an, dass er sowohl C- als auch Matlab-Code verstehen muss. Angesichts Ihrer Betonung der Geschwindigkeit sollten Sie wahrscheinlich C ++ anstelle von C verwenden (mit einiger Sorgfalt, es ist nie langsamer und oft schneller).
Jerry Coffin
3
@willytate: Dies setzt voraus, dass Sie über den Matlab-Compiler verfügen, dass er keinen besonders effizienten Code erzeugt und dass es einige Einschränkungen gibt, welchen Code Sie kompilieren können.
Jonas
3
Wenn Sie in C objektorientiert programmieren, verweigern Sie sich nicht nur die Möglichkeit, dass der Compiler zusätzliche Typensicherheitsprüfungen durchführt, sondern Sie verweigern dem Compiler auch die Möglichkeit, bestimmte Arten von Optimierungen durchzuführen, die nicht einfach ausgedrückt werden können Die Verwendung von C ++ erhöht auch die Wahrscheinlichkeit, dass Sie Funktionen aus einer Bibliothek verwenden können, die von jemandem geschrieben wurde, der schlauer ist als Sie.
3
Wird die meiste Zeit für den eigentlichen Algorithmus oder für das Fummeln mit Dateien, E / A und Parsen aufgewendet? Der durchschnittliche C-Codierer kann keinen FFT- und Matrixcode schreiben, der der MATLAB-Implementierung in nichts nachsteht. Wenn das Parsing, die E / A-Verarbeitung und das Fummeln von Dateien die Zeit Ihres Programms beanspruchen, sollte sich Ihr C-Programmierer darauf konzentrieren und Klebercode schreiben, der Funktionen aus den MATLAB-Bibliotheken aufruft. Wenn die FFT / Matrix-Zerlegung / ODE-Lösung der Engpass ist, müssen Sie einen C-Programmierer mit viel Erfahrung mit numerischen Methoden finden.
Charles E. Grant

Antworten:

15

Ich bin in einer ähnlichen Situation wie Sie, in der auch Leute meinen Matlab-Code nach C ++ portieren.

Viel hängt von der Komplexität Ihres Codes sowie vom Kenntnisstand des C / C ++ - Entwicklers ab und davon, was er implementieren soll - je besser er ist und je besser er Ihr Problem versteht, desto mehr unabhängig können sie arbeiten.

Da die direkte Übersetzung von Matlab-Code in C / C ++ möglicherweise nicht die effizienteste Methode zur Behebung eines Problems ist, empfehle ich, dass Sie gut kommunizieren, was die Eingabe ist, was der Code tun sollte und was er als Ausgabe zurückgeben soll. Sie sollten auch Möglichkeiten zum Testen des Codes bereitstellen, um sicherzustellen, dass er ordnungsgemäß funktioniert - sowohl als Hilfe zum Debuggen als auch als Mittel zur Qualitätskontrolle. Darüber hinaus sollten Sie den Matlab-Code als grobe Richtlinie für die Erzielung des Ergebnisses angeben und erläutern.

Sie sollten davon ausgehen können, dass der Entwickler mit der Strukturierung eines Programms und der Verwendung von Debugging-Tools vertraut ist. Es kann jedoch sein, dass Sie nicht unbedingt davon ausgehen können, dass der Entwickler über spezifische Kenntnisse in den Bereichen Statistik oder (mathematische) Optimierung verfügt. Das Debuggen dieser Teile ist mit Ihrer Eingabe also viel schneller.

Es kann hilfreich sein, regelmäßige Besprechungen mit dem Entwickler zu planen, sodass "kleine Dinge", die sich für den Entwickler etwas seltsam anfühlen, Ihnen jedoch wichtige Probleme anzeigen, kommuniziert werden können, bevor sie zu großen Problemen werden.

Jonas
quelle
+1 für gültige Testergebnisse für die Software. Das Portieren von Code von Matlab nach C / C ++ ist schwierig genug, ohne zu wissen, wie die Ergebnisse aussehen sollen.
rjzii
12

Ich sage nicht, dass dies auf Sie zutrifft, aber: Die meisten Leute, die nur in MATLAB programmieren, schreiben schlechten Code. Sehr schlecht, mit schlechter Formatierung, Struktur und Dokumentation.

In diesem Fall können Sie den MATLAB-Code nur dann verwenden, wenn Sie ihn ausführen, um die Ergebnisse des portierten Codes zu überprüfen. Der Versuch, den MATLAB-Code ohne zusätzliche Dokumentation zurückzuentwickeln, sollte nur unternommen werden, wenn der ursprüngliche Autor des MATLAB-Codes tatsächlich tot oder im Koma liegt. Andererseits ist eine gut geschriebene mathematische Arbeit über einen Algorithmus in der Regel viel hilfreicher als die Implementierung durch den Doktoranden.

So erleichtern Sie der Person, die Ihren Code portiert:

  1. Überarbeiten Sie Ihren Code, um sicherzustellen, dass die Operationen in verschiedene Funktionen unterteilt sind. Der MATLAB-Stil "Eine Funktion pro Datei" ermutigt Funktionen, zu lang zu sein und zu viele Operationen zu umfassen. Stellen Sie außerdem sicher, dass doppelter Code für Hilfsfunktionen abgerufen wird, auch wenn dies zu mehr Dateien führt, als Sie normalerweise für ein MATLAB-Projekt benötigen.

  2. Erklären Sie alle in Ihrem Code verwendeten magischen Zahlen oder Konstanten und die Bedingungen, unter denen sie gültig sind.

  3. Dokumentieren Sie die Datenstrukturen Ihres Codes. MATLABs "Alles ist eine Matrix" -Stil unterscheidet sich stark von den meisten Sprachen, und dies bedeutet häufig, dass Ihre Datenstrukturen implizit durch die Verwendung der Matrizen definiert werden. Der AC-Programmierer muss herausfinden, wie die verschiedenen Strukturen eingerichtet und die erforderlichen Arrays zugewiesen werden. Stellen Sie daher sicher, dass klar ist, welche Bedeutung und internen Strukturen Ihre Variablen haben.

  4. Dokumentieren Sie die von Ihrem Code verwendeten Algorithmen. Stellen Sie insbesondere sicher, dass klar ist, was passiert, wenn Sie komplizierte Ganz-Array-Funktionen und -Operatoren verwenden, und dass der C-Programmierer Zugriff auf Referenzen zu den Algorithmen hat, die von Toolbox-Funktionen oder Standardbibliotheksfunktionen verwendet werden, die komplizierter sind als BLAS funktioniert.

  5. Dokumentieren Sie alles, was Sie getan haben, um den Code stabiler zu machen, z. B. die Eingabevalidierung und die Fehlerbehandlung. Die Art und Weise, wie Sie es implementiert haben, unterscheidet sich wahrscheinlich stark von der Vorgehensweise in C. Akademiker, die MATLAB-Code schreiben, müssen sich selten mit Dingen wie der Ausnahmebehandlung auseinandersetzen. Wenn Sie nichts unternommen haben, um Ihren Code sicherer zu machen, sollten Sie zumindest dokumentieren, was gegen ungültige Eingaben, fehlerhafte oder unvollständige Daten unternommen werden könnte.

  6. Stellen Sie sicher, dass die Person, die den Code portiert, die Ausgabe mit dem ursprünglichen MATLAB-Code vergleichen kann, und stellen Sie nach Möglichkeit eine gründliche Testsuite mit Eingaben und korrekten Ausgaben bereit.

  7. Wenn die Person, die die Portierung durchführt, die numerische Analyse nicht kennt, müssen Sie den Portierungsprozess überwachen und sicherstellen, dass Sie den C-Code überprüfen und verstehen. Es wird für euch beide sehr lehrreich sein.

user23748
quelle
Ich bin mit Ihrer technischen Einschätzung einverstanden und Sie machen gute Punkte (1 - 7), aber ich denke, das Ad Hominem oben über "die meisten Leute, die nur in MATLAB codieren" war unnötig und nicht wahr.
5
Nach meiner Erfahrung sind die meisten Leute, die MATLAB als einzige Programmiersprache verwenden, Mathematiker, für die das Programmieren in der Regel nur ein Mittel zum Zweck ist. Sie haben keinen Anreiz, sich um die Programmierpraxis zu kümmern, und sie kümmern sich nur darum, richtigen Code zu schreiben, keinen guten oder schönen Code. Wenn sie ihren Code freigeben, soll er normalerweise verwendet, aber nicht gelesen werden - es gibt immer ein Blatt Papier, um den Code zu erklären. Wenn Sie denken, das ist anstößig (und das soll es auch nicht sein), dann verpassen Sie einfach die Perspektive der Leute, die sich nicht darum kümmern.
4
Nach meiner Erfahrung wird schlechter Code hauptsächlich von Leuten geschrieben, die One-Shot-Code schreiben, dh Code, der von einer einzelnen Person für ein einzelnes Problem verwendet (gelesen) wird. Programmiersprache spielt keine Rolle. Und für mich als Person, die hauptsächlich in Matlab programmiert, wirkt das Ad Hominem beleidigend.
Jonas
Als EE werde ich hauptsächlich MATLAB schreiben, und ich stimme Ihnen zu. Es fördert einen sehr schrecklichen Codierungsstil ohne Gültigkeitsbereich, Namensraum, Organisation in Datenstrukturen oder gute Benennung von Variablen. Wenn die Vektorisierung erst einmal verstanden ist, macht man sich nicht wirklich die Mühe, die daraus resultierenden klugen Einzeilenwunder zu kommentieren. Nur ein riesiger Müllhaufen hässlichen, ineffizienten Codes.
Milind R
4

Programmiersprachen sind viel einfacher zu lesen als zu schreiben. Die meisten C-Programmierer mit ein wenig Erfahrung sollten in der Lage sein, Ihren Matlab-Code mit Zugriff auf eine Referenz und insbesondere mit Zugriff auf einen Matlab-Programmierer zu lesen, um ihre Fragen zu beantworten. Code jeglicher Art ist viel weniger zweideutig als die meisten Anforderungen, an denen wir arbeiten müssen.

Wenn sie einen Bachelor-Abschluss in Informatik oder Computertechnik haben, haben sie wahrscheinlich Analysis, Trigonometrie und lineare Algebra genommen, aber es kann rostig sein. Die meisten C-Programmierer werden wissen, was eine FFT ist, wenn sie nicht viel wissenschaftlich / mathematisch programmieren, aber sie müssen selten oder nie eine FFT durchführen. Ihr idealer Kandidat wird all das frisch im Kopf haben, aber jeder mit einem Abschluss sollte in der Lage sein, die Mathematik mit einem Auffrischungsstudium zu bewältigen. In beiden Fällen möchten Sie jemanden, der nach Möglichkeit Wert darauf legt, vorhandene Bibliotheken für solche allgemeinen Operationen zu finden, anstatt ihre eigenen zu rollen.

Das Talent zur Optimierung der Ausführungszeit von Algorithmen ist selbst bei erfahrenen Programmierern sehr unterschiedlich. Ich würde empfehlen, dass Sie ein Interviewproblem haben, um das herauszufinden. Zeigen Sie den Kandidaten einen einfachen, aber absichtlich ineffizienten Algorithmus und fragen Sie sie, was er tut. Sehen Sie nach, ob sie ihre Ineffizienz selbst zur Sprache bringen. Fragen Sie sie, wie hoch die asymptotische Komplexität ist und wie sie sein sollte. Fragen Sie sie, wie sie neu schreiben würden, um die Effizienz zu verbessern.

Karl Bielefeldt
quelle
3

Der finanzielle Grund für die Nichtbenutzung des Matlab-Compilers ist verständlich. Sie können jedoch den kostenlosen Konverter von Scilab nach C verwenden. Das Verfahren wäre

  • Konvertieren Sie Ihren Code von Matlab nach Scilab mit M2SCI-Tools ,
  • Konvertieren Sie den Scilab-Code mit "Scilab 2 C" in C ,
  • Testen Sie die Codes,
  • Verwenden Sie einen Profiler, um Engpässe zu suchen, die ein menschliches Auge erfordern.

Im Idealfall sind keine Scilab-Kenntnisse erforderlich, und es ist einfach genug, diese Lösung einige Zeit in Anspruch zu nehmen (in der Praxis ist sie möglicherweise nicht so einfach ...).

Hinweis: Ich habe dies nicht ausprobiert, aber aus ähnlichen Gründen stelle ich mir eine Lösung vor.

Clement J.
quelle
2

Entwickeln Sie ein gutes Test-Set, mit dem Sie beide Anwendungen durchlaufen und sich dann die Metriken ansehen können.

Dies hilft Ihrem Entwickler beim Testen seines Codes und stellt sicher, dass die Qualität auf einem angemessenen Niveau liegt.


quelle
2

Großartiger Beitrag von Jonas, insbesondere der Punkt, wie man den Code testen kann. Hier sind einige zusätzliche Vorschläge:

  • Code teilen. Überlegen Sie, ob Sie die MATLAB-Quelle bereitstellen, aber erklären Sie deren Struktur oder andere Details (von der Syntax bis zu Ihrem persönlichen Stil). Der C-Entwickler wird hoffentlich die Konzepte, Algorithmen und Mathematik auf hoher Ebene erkennen ( und hoffentlich haben Sie Ihren Code kommentiert ).

  • Dokumentation. Es ist von entscheidender Bedeutung, dass Sie eine klare Dokumentation haben, die das Projekt definiert. Wenn die Person nicht fließend mit MATLAB umgehen kann, ist der Code möglicherweise keine sehr nützliche Referenz.

  • Übung People Skills. Dies mag offensichtlich sein, es ist jedoch ratsam, dies bei der Zusammenarbeit zu berücksichtigen, insbesondere auf dieser Mikroebene. Deshalb sollten Sie versuchen, so viele Mehrdeutigkeiten wie möglich aus Ihrem Code / Ihrer Dokumentation zu entfernen. Abhängig von Ihrer Führungsebene im Projekt stellen Sie möglicherweise fest, dass Sie ein Gleichgewicht zwischen der Lenkung der Entwicklung und dem Ermöglichen, dass die Person ihren eigenen individuellen Beitrag leistet.

Gary
quelle
1

Wenn Ihre C-Codierer nicht die richtigen Bibliotheken verwenden, ist Matlab in so einfachen Dingen wie dem Invertieren einer Matrix viel besser. Ein naives C impl. ist nicht stabil genug. Die Einstellung von C-Codierern wäre teuer. Ich würde versuchen, Matlab-Code zu portieren, um zu scipen und die Geschwindigkeit zu vergleichen, den c-Compiler von Matlab zu verwenden oder ... einfach mehr Hardware darauf zu werfen - es könnte viel billiger und einfacher und sicherer und schneller sein.

Job
quelle