Unterrichten von Studenten im Grundstudium in einem Kurs mit dem Titel Einführung in die Computerprogrammierung. Ich bin ein bisschen verwirrt. In der Computerphysik verwenden Wissenschaftler C / C ++ oder Python oder Fortran, CUDA usw. ... dies ist die Zeit, um ihre Basis aufzubauen. Was soll ich benutzen? Ich weiß, dass Sie jederzeit in Ihrem Leben eine neue Programmiersprache lernen können, aber das ist eine klügere Wahl, wenn ich später alle grundlegenden Programmierkonzepte und OOP-Konzepte erarbeite.
python
c++
computational-physics
languages
Afnan Bashir
quelle
quelle
Antworten:
Erstens, wenn Ihre Studenten wie wir sind und keine vorherige Einführung in Computer hatten, sollten Sie sich etwas Zeit nehmen, um ihnen den Umgang mit grundlegenden Dingen wie der Verwendung eines geeigneten Editors (dh nicht MS Word), der Befehlszeile usw. beizubringen.
Ich denke, die Antwort hängt etwas davon ab, wo Sie den Schwerpunkt Ihres Kurses setzen (oder was Sie unterrichten müssen). Zum Beispiel: Wie relevant sind die internen Funktionen des Computers? Benötigen Sie Klassen und andere fortgeschrittene OOP-Strukturen? Möchten Sie ihnen beibringen, wie man effiziente Programme erstellt, oder sind Sie froh, wenn sie überhaupt Arbeitsprogramme erstellen? Vergessen Sie auch nicht, dass Sie höchstwahrscheinlich kompetente Tutoren benötigen.
Aber nun etwas zu Vor- und Nachteilen der Sprachen, die ich kenne. Beachten Sie, dass dies hauptsächlich auf meiner Erfahrung als Computerphysiker beruht und dass einige davon von dem jeweiligen Fach, der Arbeitsgruppe, der Universität usw. abhängen können.
Python
Im Allgemeinen empfehle ich, Numpy von Anfang an zu verwenden, und gehe davon aus, dass es im Folgenden verwendet wird.
Vorteile:
print
, Numpy'ssavetxt
undloadtxt
und vielleicht vollständig abgedeckt werdensys.argv
. Es kann im laufenden Betrieb eingeführt werden und verbraucht nicht viel Programmierzeit.Nachteile:
C / C ++
Vorteile:
Nachteile:
Die Hauptvorteile von C ++ gegenüber C (Klassen, Vorlagen) sollten für Ihren Kurs nicht relevant sein und werden nur für größere Projekte relevant. Daher würde ich C von beiden wählen, da es prägnanter ist.
Andere
Einige Kommentare zu den anderen Sprachen:
¹ Welches ist der Standard-Workflow zumindest in unserer Gruppe.
quelle
2014 hätte ich Python gesagt. 2017 glaube ich von ganzem Herzen, dass die Sprache, in der die Studenten unterrichten, Julia ist.
Beim Unterrichten geht es immer um einen Kompromiss. Einerseits möchten Sie etwas auswählen, das so einfach ist, dass es leicht zu erfassen ist. Aber zweitens möchten Sie etwas lehren, das Ausdauer hat, dh etwas, das mit Ihnen wachsen kann. Die gängigen dynamischen Sprachen (Python / MATLAB / R) fallen alle leicht in Kategorie 1, da sie nicht über einen Kesselcode verfügen und es einfach ist, einen Interpreter zu öffnen und Code auszuspucken, während C / C ++ / Fortran in die zweite Kategorie fällt Die Sprachen, mit denen die leistungsfähige Kernsoftware der heutigen Welt geschrieben wurde.
Es gibt jedoch Probleme bei der Verwendung einer Sprache, die die andere Kategorie nicht vollständig erfasst. Wenn Sie eine Sprache wie Python verwenden, werden Dinge wie Typen und Integer-Überlauf auf angenehme Weise abstrahiert. Das ist gut, um im ersten Semester Informatik zu unterrichten, aber da Sie immer tiefer in die Arbeitsweise von Python eintauchen möchten, ist die Sprache von Python zu weit entfernt vom zugrunde liegenden Metall, um ein gutes Lehrmittel zu sein. Aber C / C ++ / Fortran (oder Java ... Ich habe zuerst Java gelernt ...) haben alle so hohe Startkosten, dass es am schwierigsten ist zu lernen, wie man Header einrichtet und
main
kompiliert, was vom tatsächlichen Erlernen des Programmierens ablenkt .Tritt ein Julia. Wenn Sie Julia zum ersten Mal verwenden, können Sie die gesamte Idee von Typen abstrahieren und wie MATLAB oder Python verwenden. Aber wenn Sie mehr lernen möchten, steckt in der Sprache ein "Kaninchenbau" voller Tiefe. Da es sich in Wirklichkeit um eine Abstraktionsschicht handelt, die auf einem Typsystem + Mehrfachversand über LLVM basiert, ist dies im Wesentlichen "eine einfache Möglichkeit, statisch kompilierten Code zu schreiben" (und typstabile Funktionen können tatsächlich statisch kompiliert werden). Dies bedeutet, dass auf die Details von C / C ++ ebenfalls zugegriffen werden kann. Sie können lernen, wie Sie einfache Schleifen und Funktionen ohne Boilerplate-Code schreiben und dann in die Funktionszeiger graben. Mit den Metaprogrammierungsfunktionen von Julia können Sie direkt auf den AST zugreifen, und es gibt Makros, die jeden Teil der Kompilierungskette darstellen. Als Lisp ist es auch für funktionale Programmierstile zugänglich. Und es verfügt über viele parallele Rechenfunktionen. Ideen wie parametrische Typisierung und Typstabilität sind in Julia ziemlich einzigartig und tief verwurzelt.
Wenn Sie die Programmiersprachen selbst lernen möchten, können Sie die Schritte zur Kompilierung anhand
@code_lowered
derer lernen, um festzustellen , was eine Senkung ist. Sehen Sie sich das typisierte AST mit@code_typed
, das LLVM IR mit@code_llvm
und schließlich den nativen Assembler-Code mit an@code_native
. Dies kann verwendet werden, um zu zeigen, wie hoch die Kosten für dynamische Variablen sind und wie das "variable Boxen" genau funktioniert. In diesem Blogbeitrag wird gezeigt, wie diese Introspection-Tools verwendet werden können, um zu lehren, wie Compiler-Optimierungen durchgeführt werden können / nicht.Es gibt nicht nur Ideen für Informatik und Softwaretechnik zu erforschen, sondern auch reichhaltige mathematische Ideen. Da die Hauptbibliotheken von Julia im Hinblick auf die generische Typisierung geschrieben wurden, ist es trivial, matrixfreie Operatoren zu erstellen und mit IterativeSolvers.jl GMRES mit diesen durchzuführen. Sie können Introspection-Tools verwenden
@which
, um genau zu zeigen, wie etwas implementiert wurde. Wie funktioniert das zum Beispiel\
?Das zeigt mir direkt die Definition von \ . Es ist in Julia implementiert, sodass jemand, der Julia kennt, den Algorithmus und seine Funktionsweise durch Identifizieren von Matrixuntertypen und Spezialisieren, wenn möglich, erlernen kann (Zurückgreifen auf die Gaußsche Eliminierung). Da Julias Code MIT-lizenziert ist (und fast alle Pakete MIT-lizenziert sind), können die Schüler diese Ideen in ihrem eigenen Code (mit Namensnennung) verwenden (wenn der Code GPL-lizenziert ist, wie dies bei den meisten MATLAB- und R-Paketen der Fall ist). Sie müssen vorsichtig mit Lizenzproblemen sein!).
Da der Sprachkern aus einer sehr aktiven Open-Source-Community besteht, gibt es auch eine umfangreiche Ressource zur Geschichte der Sprachentwicklung: die Github-Themen . Verstehen Sie Sprachfragen, wie z. B., was eine Matrix wirklich transponiert? kann sehr aufschlussreich sein, um diese mathematischen Objekte genauer zu verstehen.
Aber zum Schluss möchten Sie Ihren Schülern beibringen, wie man schafft. Leider bedeutet das Erlernen von Python oder R nicht unbedingt, dass Sie das Zeug dazu haben, Python / R zu entwickeln, da die meisten der weit verbreiteten und gut optimierten Pakete eine erhebliche Menge an C / C ++ / Fortran-Code enthalten um Leistung zu erhalten. Damit diese Schüler einen Beitrag zum wissenschaftlichen Ökosystem dieser Sprachen leisten können, müssen sie irgendwann eine andere Sprache lernen. Während das nicht ganz schrecklich ist, ist es jetzt, da Julia existiert, suboptimal. Da die typstabile Julia die Geschwindigkeit von C / Fortran erreichen kann, handelt es sich bei den meisten Paketen im Julia-Ökosystem um reinen Julia-Code. Julia lernen heißt, man hat gelernt, Julia zu entwickeln. Und da Base Julia auch meistens Julia-Code ist (nur ein paar Primitive und der Parser nicht),
Das heißt, es gibt einige Nachteile bei der Auswahl von Julia. Zum einen ist es viel neuer als diese anderen Sprachen und daher etwas knapper in Bezug auf Ressourcen. Sie müssen sich eine Menge Lehrmittel selbst einfallen lassen oder Ressourcen im Web nutzen, die auf der Julia-Website aufgelistet sind . Außerdem sind die Sprachdetails noch nicht ganz geklärt, obwohl 1.0 in Kürze (Ende 2017) veröffentlicht wird. Und es ist auch sehr wahrscheinlich, dass Sie, die potenzielle Lehrerin eines Julia-Kurses, selbst nicht so viel Erfahrung mit der Sprache haben. Dies sind jedoch die Probleme, die mit der Zeit verschwinden, während die Vorteile von Julia, die ich oben erwähnte, für die Sprachen selbst wesentlich zentraler sind.
quelle
Als nicht allzu weit entfernter Student zu sprechen und davon auszugehen, dass Sie nicht in der CS-Abteilung unterrichten, wäre für mich eine Katastrophe, wenn Sie die Schüler mit so etwas wie C, C ++ oder Fortran (oder Gott sei Dank) an die Computerprogrammierung heranführen würden CUDA), obwohl andere darauf hingewiesen haben, dass sie wahrscheinlich der Status Quo im wissenschaftlichen Rechnen sind.
Wenn Sie erwarten, dass Sie den Studenten das wissenschaftliche Rechnen beibringen und sie im selben Kurs in die Programmierung einführen, würde ich wetten, dass dies zu viel ist, um in einem Semester behandelt zu werden, es sei denn, Sie halten sich an eine interpretierte Sprache wie Matlab oder Python. Nach meiner Erfahrung werden die meisten Kurse im wissenschaftlichen Rechnen im Grundstudium in einem dieser beiden Kurse unterrichtet, und Python wird als Produktionssprache von Tag zu Tag nützlicher, sodass es als praktische Fertigkeit immer noch nützlich ist ( Ich meine).
Nur meine zwei Cent.
quelle
C, C ++ und Fortran (in keiner bestimmten Reihenfolge aufgeführt) sind die drei wichtigsten Programmiersprachen für die rechnergestützte Mathematik / Physik, wenn Sie große Probleme auf Supercomputern lösen möchten. Ich denke, CUDA wird als Bibliothek betrachtet, die in Verbindung mit anderen Sprachen für beschleunigtes GPU-Computing verwendet wird. Matlab und Python eignen sich hervorragend zum Ausführen von Ausgabediagnosen und zum Erstellen von Prototypmodellen. Sie sind auch einfacher zu erlernen und eignen sich möglicherweise besser für einen Kurs, in dem Sie Algorithmen kennenlernen und lernen möchten, wie man programmiert.
Wenn es in Ihrem Kurs also nur um Programmierung geht, würde ich C ++ oder, wenn dies das erste Mal für die Studenten ist, Python wählen. Beide Sprachen sind außerhalb der Welt des wissenschaftlichen Rechnens von großem Nutzen. Wenn sich der Kurs auf das Erlernen von Algorithmen zur Lösung physikbasierter Probleme konzentriert, ist Matlab zweifellos der Gewinner.
quelle
kurz: Beachten Sie, dass das wissenschaftliche Rechnen selbst kompliziert ist. Möchten Sie wirklich, dass die Programmiersprache ins Spiel kommt?
Die Mathematik verwendet die Abstraktion, um Probleme zu lösen, die nicht durch Intuition gelöst werden können. Konzepte haben daher die Tendenz, abstrakt zu sein. Aus diesem Grund ist es nicht trivial zu verstehen, welche Konzepte eingekapselt werden müssen. Im wissenschaftlichen Rechnen sind die üblichen Beispiele für Klassen wie "Tier" oder "Fahrzeug" eher unbrauchbar. Dies gilt für die objektorientierte Programmierung, aber ich glaube, dass die Reproduktion abstrakter Konzepte auf einem Computer auch bei der imperativen Programmierung nicht trivial ist.
Aus diesem Grund glaube ich, dass es hier um zwei verschiedene Ansätze geht: Programmieren auf der einen Seite und wissenschaftliches Rechnen auf der anderen Seite. Bei Studenten mit heterogenen Hintergründen können Sie am Ende zwei verschiedene Dinge gleichzeitig unterrichten.
Wenn es Ihr Ziel ist, wissenschaftliches Rechnen zu unterrichten, finde ich das schwierig genug. Eine zusätzliche Barriere als Programmiersprache (wir sind uns alle einig, dass C ++ eine Schulung erfordert) würde einen guten Teil der Schüler demotivieren. Aus diesem Grund empfehle ich, Python zu verwenden.
Wenn Ihr Kurs "Introduction to SC" ist, glaube ich, dass Python das beste Ergebnis / Aufwand-Verhältnis hat.
PS: Jetzt haben wir ziemlich gute Computer, wir brauchen nicht wirklich nach Effizienz zu suchen.
quelle