Ich liebe es, in Sprachen zu programmieren, die sich an Hardcore-Programmierer zu richten scheinen. (Meine Favoriten sind Python und D.) MATLAB richtet sich an Ingenieure und R an Statistiker. Diese Sprachen wurden anscheinend für Leute entwickelt, die keine Hardcore-Programmierer sind und nicht wie Hardcore-Programmierer denken. Ich finde es immer etwas umständlich, sie zu benutzen, und bis zu einem gewissen Grad kann ich nicht sagen, warum. Hier sind einige Probleme, die ich identifiziert habe:
- (Beide): Die extreme Betonung von Vektoren und Matrizen, sofern es keine wahren Primitive gibt.
- (Beide): Die Schwierigkeit der grundlegenden String-Manipulation.
- (Beide): Fehlende oder umständliche Unterstützung für grundlegende Datenstrukturen wie Hash-Tabellen und "echte", dh typparametrische und verschachtelbare Arrays.
- (Beide): Sie sind wirklich sehr, sehr langsam, selbst nach interpretierten Sprachstandards, sofern Sie sich nicht nach hinten bücken, um Ihren Code zu vektorisieren.
- (Beide): Sie scheinen nicht für die Interaktion mit der Außenwelt ausgelegt zu sein. Beispielsweise handelt es sich bei beiden Programmen um relativ umfangreiche Programme, deren Start einige Zeit in Anspruch nimmt, und die anscheinend nicht so konzipiert sind, dass einfache Textfilterprogramme einfach zu schreiben sind. Darüber hinaus macht das Fehlen einer guten Zeichenfolgenverarbeitung die Datei-E / A in alles andere als sehr Standardformen nahezu unmöglich.
- (Beide): Die Objektorientierung scheint sich sehr verschraubt anzufühlen. Ja, Sie können es tun, aber es fühlt sich nicht viel idiomatischer an als OO in C.
- (Beide): Kein offensichtlicher, einfacher Weg, einen Referenztyp zu erhalten. Keine Zeiger oder Klassenreferenzen. Zum Beispiel habe ich keine Ahnung, wie Sie Ihre eigene verknüpfte Liste in einer dieser Sprachen rollen.
- (MATLAB): Sie können nicht mehrere Funktionen der obersten Ebene in eine einzige Datei einfügen. Dies fördert sehr lange Funktionen und ermöglicht das Ausschneiden und Einfügen von Code.
- (MATLAB): Ganzzahlen existieren anscheinend nicht als erstklassiger Typ.
- (R): Die grundlegenden eingebauten Datenstrukturen scheinen viel zu hoch und schlecht dokumentiert zu sein und scheinen aufgrund meiner Erfahrung mit ähnlichen Datenstrukturen, die jedoch niedriger sind, nie ganz das zu tun, was ich erwartet habe.
- (R): Die Dokumentation ist über den gesamten Ort verteilt und praktisch nicht durchsuchbar. Sogar D, das oft für schlechte Dokumentation angeklopft wird und immer noch ziemlich alpha ist, ist, soweit ich das beurteilen kann, wesentlich besser.
- (R): Soweit ich weiß, gibt es keine gute IDE dafür. Auch hier ist D, eine ziemlich alpha-artige Sprache mit einer kleinen Community, besser.
Im Allgemeinen glaube ich auch, dass MATLAB und R leicht durch einfache alte Bibliotheken in allgemeineren Sprachen ersetzt werden könnten, wenn ausreichend umfassende Bibliotheken vorhanden wären. Dies gilt insbesondere für neuere Mehrzwecksprachen, die viele Funktionen für Bibliotheksschreiber enthalten.
Warum erscheinen mir R und MATLAB so komisch? Gibt es andere wichtige Probleme, die Sie bemerkt haben und die dazu führen können, dass diese Sprachen für Hardcore-Programmierer ungewöhnlich sind? Was sind gute Überlebenstipps, wenn ihre Verwendung erforderlich ist?
Bearbeiten: Ich sehe ein Problem aus einigen der Antworten, die ich bekommen habe. Ich persönlich bevorzuge bei der Analyse von Daten ein Skript, das die gesamte Pipeline enthält. Dies impliziert, dass eine Allzwecksprache verwendet werden muss. Ich hasse es, ein Skript schreiben zu müssen, um die Daten zu "bereinigen" und auszuspucken, dann ein anderes, um sie in einer völlig anderen Umgebung wieder einzulesen usw. Ich finde die Reibung, MATLAB / R für einige meiner Arbeiten zu verwenden, und ein komplettes Eine andere Sprache mit einem völlig anderen Adressraum und einer anderen Denkweise, damit der Rest eine riesige Quelle der Reibung ist. Außerdem weiß ich, dass es Klebeschichten gibt, aber sie scheinen immer schrecklich kompliziert und eine Quelle der Reibung zu sein.
Antworten:
Es ist wahrscheinlich eine schlechte Idee, sich domänenspezifischen Sprachen mit der für das Programmieren im Allgemeinen erforderlichen Denkweise zu nähern, oder allgemeine Programme mit Mehrzwecksprachen zu programmieren. Da sie domänenspezifisch sind, werden sie wahrscheinlich eine steilere Lernkurve und eine unangenehme Denkweise benötigen, um am effizientesten eingesetzt zu werden. Ich halte das Schreiben von Code in Matlab für das Schreiben von hochoptimiertem, domänenspezifischem Code (vergleichbar mit beispielsweise effizientem und sauberem OpenGL-Code). Ich habe auch gesehen, dass sie immer nützlicher werden als Bibliotheken, die in anderen Sprachen verwendet werden sollen - siehe zum Beispiel http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c
Ich würde sagen, verwenden Sie für diese DSL das gleiche Verfahren wie für alle anderen:
quelle
Ich gehe dem voran und stelle fest, dass ich mit MATLAB vertraut bin, aber nicht mit R.
Der Grund, warum MATLAB mit OO, String-Verarbeitung oder benutzerdefinierten Datenstrukturen nicht gut zurechtkommt, ist, dass es nicht dazu gedacht ist , diese Dinge zu tun. Es gibt viele Sprachen für OO, viele, die bei der String-Verarbeitung gute Arbeit leisten, und viele mehr, die verrückte benutzerdefinierte Datentypen unterstützen. Keiner von ihnen kann Matrixmultiplikation, weil sie nicht dafür entwickelt wurden.
Nur die Vektor- und Matrixoperationen, die MATLAB ausführt, zu optimieren, ist schwierig genug, ohne sich mit benutzerdefinierten Typen oder Zeigern auseinanderzusetzen oder was nicht (wenn es nicht schwierig wäre, könnten sie nicht so viel dafür verlangen). Das Hinzufügen einer schnellen Vektorunterstützung zu vorhandenen Mehrzwecksprachen ist ebenfalls schwierig - es erhöht den Aufwand für eine Funktion, die nur wenige Programmierer jemals verwenden werden (zu wenige Programmierer verstehen verknüpfte Listen, wie sollen sie die Eigenwertzerlegung verwenden? ).
MATLAB ist Ihnen so fremd, weil es Wissenschaftler und Ingenieure in die Lage versetzt, Matrixmultiplikationen und ODE-Berechnungen sehr schnell durchzuführen. MATLAB entspricht nicht Ihrer Definition einer "Hardcore" -Sprache, da dies nie vorgesehen war. Der Versuch, über MATLAB in Bezug auf Python oder D nachzudenken, gleicht dem Versuch, über LISP oder Haskell in Bezug auf C oder über Verilog und VHDL in Bezug auf JavaScript nachzudenken. Um fair zu sein, hat MATLAB einige (in Ordnung, viele) bizarre Sprachentwürfe getroffen, die ich selbst aus der Perspektive einer domänenspezifischen Sprache nicht verstehen kann. Es gibt jedoch keinen besonderen Grund, warum sich ein Astronom darum kümmern sollte, dass der Himmelskörper X genau 48 AE von dem Himmelskörper Y entfernt ist, im Gegensatz zu 48,0 AE.
Zum Glück kommen nun einige Bibliotheken auf die Bühne, die genau das tun, was Sie vorschlagen: eine gute Unterstützung für das wissenschaftliche Rechnen in einer universellen Sprache. Für Python gibt es NumPy / Matplotlib, das einige Ecken und Kanten hat, aber ansonsten eine angemessene MATLAB-Funktionalität in Python bietet. Der Grund, warum es kein anderes Projekt wie dieses gab, ist, dass die Bibliotheken unglaublich schwer zu schreiben sind und einen Markt bedienen, der bereits von MATLAB und FORTRAN abgedeckt wird.
Wenn Sie MATLAB oder R unbedingt verwenden müssen, können Sie nicht wie ein "Hardcore" -Programmierer an die Programmierung herangehen, sondern wie ein "Hardcore" -Wissenschaftler oder Ingenieur. Für LISP, Sie haben in Rekursion denken. In MATLAB muss man nur in Matrizen denken. Aktualisieren Sie die lineare Algebra ( die Vorlesungen des MIT zu diesem Thema sind eine großartige Rezension). Ansonsten besteht die einzige Möglichkeit, MATLAB zu "überleben", darin, zu erkennen, wann eine Schleife durch eine Vektoroperation ersetzt werden kann oder wann sich Ihr Problem darauf reduziert, die Eigenwerte eines äußeren Produkts zu finden.
quelle
Ihre wiederholte Verwendung des Begriffs "Hardcore-Programmierer" in Bezug auf sich. zusammen mit Ihrer Unterstellung, dass die Designer von R und MATLAB es nicht sind , finde ich das sehr albern und ermutige die Leute, Ihre Kritik nicht ernst zu nehmen.
Wenn Sie ernsthafte Kritik an R lesen möchten, tun Sie gut daran, dieses Stück von Ross Ihaka, einem der Designer von R, zu lesen . Es scheint , wesentlich härteren Kern mir zu entwerfen R als zu verwenden D oder Python.
quelle
Es kommt darauf an, was Sie als echtes Primitiv bezeichnen. In R ist ein Vektor ein wahres Primitiv; Das heißt, alle Variablen sind Vektoren. Ebenso sind in MATLAB alle Variablen Matrizen.
In MATLAB ist die Manipulation von Zeichenfolgen mächtig, aber ich stimme zu, dass der Code häufig hässlich und nicht intuitiv ist (zumindest im Moment). Für R gibt es das
stringr
Paket, das sich genauso gut verwenden lässt wie Tools in jeder anderen Sprache.In R haben Vektoren Namen, die wie ein Hash funktionieren. Es gibt auch die
hash
filehash
Pakete und . Sie sind sich nicht sicher über MATLAB-Implementierungen, aber Sie können JAVA- oder .NET-Versionen einfach aufrufen, wenn Sie möchten.Sobald Sie den Dreh raus haben (ich bin sicher, Sie werden es tun, wenn Sie wirklich Hardcore sind), werden Sie es verfluchen, Schleifen zu verwenden, wenn Sie zu anderen Sprachen zurückkehren. Die Ausführungsgeschwindigkeit ist ein Kompromiss für die Programmiergeschwindigkeit.
Beide können Daten in nahezu jedem Format lesen und schreiben. Sie können beide aus den meisten anderen Programmiersprachen aufgerufen werden. Oder an einer Eingabeaufforderung. Sie können damit GUIs erstellen. Wie interagiert das nicht mit der Außenwelt? Wenn Sie Probleme mit Ihrem Textfilterprogramm haben, fragen Sie nach dem Stackoverflow.
Einverstanden; Sie sind in erster Linie prozedurale Sprachen.
In R vereinbart. In MATLAB werden Referenzen als Handles bezeichnet.
Unsinn. Erstellen Sie einfach mehrere Dateien.
Tun sie. Siehe
int8
,int16
,int32
undint64
.Sie eignen sich zur Datenanalyse. Bitte nennen Sie konkrete Beispiele für unerwartetes Verhalten.
Es gibt viele Arten von Dokumentationen. Beginnen Sie mit
?some_function
,RSiteSearch('some concept')
, rseek.org und dassos
Paket. Ganz zu schweigen von den Handbüchern, die mit der Installation geliefert werden. Oder ein gutes Buch .Probieren Sie Architect oder RStudio oder die Revolution Analytics-IDE aus. Links und weitere Optionen finden Sie im Abschnitt "IDEs und Editoren für R" auf der Seite " Informationen zum Stapelüberlauf".
quelle
MATLAB kann in Java und C / C ++ integriert werden. Sie können Ihre gesamte nicht numerische Arbeitslast in diesen Sprachen implementieren und sie von MATLAB aus aufrufen.
Gibt es einen Grund, warum es notwendig ist? Arbeiten Sie an einer bestehenden MATLAB-Codebasis, die von anderen Leuten geschrieben wurde? Ist es eine Arbeitsanforderung? (oder Klassenanforderung, wenn Sie in der Schule sind) Wenn nicht, können Sie stattdessen SciPy oder NumPy verwenden.
Leider ist es meiner persönlichen Meinung nach nicht immer überlebensfähig, wenn diese Situation jemandem aufgezwungen wird. Selbst im College kann sich nicht jeder Ingenieurstudent an die MATLAB-Methode des rechnerischen Denkens gewöhnen.
quelle
Ich arbeite mit MATLAB, Python und C (und manchmal C ++) und betrachte mich als (hauptsächlich) Softwareentwickler, der Kollegen gegenübersteht, bei denen es sich in der Regel um Datenwissenschaftler, Mathematiker oder andere Fachleute handelt.
Obwohl ich als Erster zugeben würde, dass es sich nicht um eine Allzweck-Programmiersprache im Sinne von C oder Python handelt, schreibe ich Skripte sehr gerne in MATLAB, insbesondere für Dinge wie Zeitreihenanalyse oder Bildverarbeitung.
Es gibt einige Merkmale der Sprache, die zwar im Allgemeinen recht ineffizient implementiert sind, deren Verwendung jedoch Freude bereitet. Nehmen wir zum Beispiel die logische Indizierung: Ich kann einen logischen Vektor oder eine logische Matrix erstellen, die eine Region von Interesse auswählt, und sie als "isInROI" bezeichnen. Dabei führe ich eine Filteroperation aus, um Elemente aus den Vektor- oder Matrix- "Daten" in dieser Region auszuwählen dann einfach schreiben: "roiData = data (isInROI)".
Es sind Momente wie diese, die mich MATLAB wirklich schätzen lassen und mir erlauben, seine anderen, zahlreichen und viel diskutierten Sünden zu übersehen.
quelle