Ein schnelleres, schlankeres JavaScript für das wissenschaftliche Rechnen: Welche Funktionen sollte ich behalten?

8

Hier bin ich wirklich daran interessiert, Hindernisse für den Mathematikunterricht abzubauen.

Ziel:

Ich würde gerne sehen, dass es für die JavaScript-Community erstellt wurde, ein Äquivalent zu den Python-basierten / verknüpften wissenschaftlichen und leistungsstarken Computerbibliotheken (große Listen davon sind über Sage und andere verfügbar ). Und das möchte ich, weil ich es Menschen, die JavaScript lernen, leicht machen möchte, in das wissenschaftliche und numerische Rechnen einzusteigen, ohne Python (& Unternehmen) lernen zu müssen. (Ich weiß, dass es einfach ist, Python zu lernen, wie ich es im Grunde irgendwann getan habe, aber dies deutet darauf hin, dass es vielleicht einfach sein wird, eine eingeschränkte Teilmenge von JavaScript in Python zu kompilieren.)

Hypothetische Methode:

Ich interessiere mich hauptsächlich für eine neue Sprache mit minimalen Unterschieden zu JavaScript, da der Markt ("Human Compiler"), auf den ich abziele, Programmierer sind, die JavaScript bereits kennen. Ich möchte diese Leute ansprechen, indem ich ihnen eine minimal andere Sprache gebe, in der sie Code schreiben können, der auf schnelleres C kompiliert wird, wie es RPython und Cython für Python tun. Ich bin bereit, viele JavaScript-Funktionen zu verwerfen. Ich möchte nur darauf achten, eine Mindestanzahl von Funktionen wieder hinzuzufügen. Ich werde mir auf jeden Fall Lua, Dart und ECMA Harmony ansehen (die kein offizielles Veröffentlichungsdatum haben , oder irre ich mich?) usw., da dies alles sehr ähnlich zu zeitgenössischen (2012) Implementierungen von JavaScript ist.

Fragwürdige Motivationen:

Ich persönlich bin bereit, jede Sprache / jedes Toolset zu lernen, mit dem Dinge schneller erledigt werden können (dafür lerne ich Erlang selbst), aber hier bin ich speziell daran interessiert, die Messlatte für andere Leute zu senken (sorry), die solche möglicherweise nicht haben Bereitschaft. Dies ist nur eine der Situationen, in denen ich "meinen Kuchen haben und ihn auch essen möchte, also nehme ich mir etwas Zeit, um das Problem zu untersuchen". Ich habe nur sehr begrenzte Erfahrungen mit dem Design von Computersprachen, aber bisher scheint das Problem aus Sicht des Hacking-the-Ecosystems interessant genug zu sein, um es zu untersuchen. Ich hoffe, bald mehr davon zu tun.

jerng
quelle
5. Verwenden Sie Symbole anstelle von Zeichenfolgen für Methodennamen.
Dave Clarke
4
Diese Frage ist im gegenwärtigen Zustand nicht angemessen zu beantworten. Ich empfehle Ihnen, unsere FAQ zu lesen . Ihre Frage ist sehr weit gefasst und offen und liest sich eher wie ein Schimpfen gegen die von JavaScript wahrgenommene Langsamkeit als wie ein echter Versuch, etwas besser zu machen. Hier lauern jedoch gültige Fragen, und ich empfehle Ihnen, Ihre Frage zu verbessern, damit sie wieder geöffnet werden kann. Bringen Sie den Ball nicht ins Rollen, Antworten gehören in Antworten. Vermeiden Sie es, zu viele persönliche Annahmen in Ihre Frage aufzunehmen. Objektive Fragen erhalten objektivere Antworten.
Gilles 'SO - hör auf böse zu sein'
2
Die Hauptsache, die in Ihrer Frage fehlt, ist Ihr Ziel. Sie möchten Geschwindigkeit und möchten eine Ähnlichkeit mit Javascript. Was bist du bereit zu opfern? Was sollte Ihre Sprache können? Ist die Kompatibilität des Quellcodes mit Javascript wichtig? Möchten Sie mit vorhandenem Code verknüpfen können? Was sind die Anwendungsfälle Ihrer Sprache? Viel Javascript-Code wird dynamisch geladen, was sehr nahe daran liegt eval; sollte deine Sprache das haben? Wollen Sie in erster Linie auf Maschinencode, eine VM oder eine Interpretation kompilieren? Was für ein statisches Typensystem stellen Sie sich vor?
Gilles 'SO - hör auf böse zu sein'
2
Vielen Dank für die Bearbeitung, die Frage ist jetzt beantwortet (breit und subjektiv, aber ich denke nicht zu viel), da wir wissen, was Ihr Ziel ist. Leider scheint bis jetzt niemand Ihre Bearbeitung bemerkt zu haben; Ich hoffe, dass Antworten immer noch nützlich sein können. Bitte beachten Sie, dass Sie, damit jemand benachrichtigt wird, dass Sie auf seinen Kommentar geantwortet haben, das @Zeichen vor seinem Namen verwenden müssen (z. B. @Gilles- und die Schreibweise richtig eingeben). Klicken Sie auf die helpSchaltfläche neben dem Eingabefeld für Kommentare, um weitere Informationen zu erhalten.
Gilles 'SO - hör auf böse zu sein'
1
"Ich habe nur sehr begrenzte Erfahrungen im Design von Computersprachen." Sie sollten das zuerst beheben. Keine persönliche Beleidigung, aber wir haben bereits eine Flut von Amateur-Sprachdesignern, die die Märkte mit unterdurchschnittlichen Kreationen überschwemmen. Seien Sie ein Teil der Lösung, nicht des Problems
Gardenhead

Antworten:

7

Wenn Sie JavaScript für wissenschaftliche Berechnungen verwenden möchten, probieren Sie Node.js aus . Node basiert auf der V8-Engine von Google und bietet einige zusätzliche Funktionen für die Interaktion mit dem Dateisystem, das Schreiben von Servern und das Verknüpfen mit C- und C ++ - Bibliotheken (dies ist definitiv keine vollständige Liste). Es bietet schnelle Ausführungszeiten und bietet eine interaktive Konsole sowie eine Möglichkeit, Ihre Programme über die Befehlszeile auszuführen. Ich fand @ DaveClarkes Kommentar über Python als "Klebercode" wegen des Wortlauts interessant. Hier ist ein Auszug aus der Knotendokumentation zu Addons :

Addons sind dynamisch verknüpfte gemeinsam genutzte Objekte. Sie können C- und C ++ - Bibliotheken mit Klebstoff versehen.

Node hat auch einen ausgezeichneten Paketmanager namens NPM, der es einfach macht, von Ihnen geschriebene wissenschaftliche Module zu teilen. Das NPM-Repository enthält bereits einige wissenschaftliche Module, z. B. "natürlich" (für die Verarbeitung natürlicher Sprache) oder "clusterfck" (eine Clusterbibliothek). Es gibt definitiv viele andere Bibliotheken für eine Vielzahl von Anwendungen.

Das Tolle an dieser Lösung ist, dass Sie weder JavaScript ändern noch eine neue Sprache erstellen müssen. Die Syntax ist im Wesentlichen dieselbe, aber für die Ausführung Ihres Codes ist kein Browser erforderlich. Wenn Sie planen, mit node fortzufahren, besteht ein guter erster Schritt möglicherweise darin, Addons für vorhandene wissenschaftliche Open-Source-Bibliotheken zu erstellen, die in C und C ++ geschrieben sind, oder Sie können sie auf JavaScript portieren. Ich habe heute tatsächlich darüber nachgedacht, Node für die wissenschaftliche Programmierung zu verwenden, was mich zu dieser Frage geführt hat. Es wäre großartig, robustere Tools zu sehen, wie Sie sie in Python finden.

Ich hatte anfangs Links zu natural und clusterfck, aber ich habe nicht genug Repräsentanten, um sie zu posten. Glücklicherweise werden sie als erste Ergebnisse angezeigt, wenn Sie "clusterfck node" und "natural node" googeln.

JasonLynch426
quelle
Danke @ JasonLynch426, das macht Sinn. Ich stimme der Bequemlichkeit des NPM zu.
Jerng
6

Der Punkt der wissenschaftlichen Bibliotheken von Python ist, dass Python lediglich als Klebercode zum Mischen der Daten zwischen den wissenschaftlichen Bibliotheken fungiert. Python selbst macht wenig von der Hochleistungs-Grind-Arbeit. Python ist hierfür eine gute Sprache, da es sowohl prozedurale als auch objektorientierte Paradigmen unterstützt (und weitgehend funktional ist) und leicht mit externen Bibliotheken verknüpft werden kann.

Javascript ist stark an Browsertechnologien gebunden. Es ist meistens eine schreckliche Sprache, die überhaupt nicht dafür ausgelegt ist, effizient zu sein oder umfangreiche Software zu schreiben, obwohl in der Praxis beides aufgrund enormer Investitionen in die Compilertechnologie bzw. des sorgfältigen Gebrauchs der Sprache geschieht. Javascript wird durch gut gestaltete Bibliotheken wie JQuery 1000-mal besser. Ich bin mir nicht sicher, ob Javascipt Unterstützung für die einfache Verknüpfung mit C-Bibliotheken bietet (obwohl ich denke, dass dies indirekt über den Browser und über Java erforderlich ist).

Ich will nicht entmutigen, aber die ganze Idee scheint unbegründet. Javascript und Hochleistungsrechnen finden sich nur in Sätzen, die mit "Ein Mann ging in eine Bar ..." beginnen.

Trotzdem bin ich bereit, mich als falsch zu erweisen. Es gibt Echtzeit-Java, eine seltsame Kombination, die einigermaßen erfolgreich ist, also wer weiß.

Dave Clarke
quelle
2
Javascript in einem Browser hat kein FFI, aber die Implementierung der nicht ganz JS-Sprache, die Jerng entwerfen wollte, könnte eines haben. JS unterstützt auch in hohem Maße prozedurale, OO- und funktionale Paradigmen. Ich teile hier also nicht Ihre Zurückhaltung gegenüber JS. (Ich denke jedoch auch nicht, dass dies aus einem anderen Grund der richtige Weg ist: Um eine neue Sprache zu entwerfen, sollten Sie einen sehr guten Grund haben, und ich sehe hier keinen. Ich denke, Vor ist auf der richtigen Seite Markieren Sie, wenn er Java vorschlägt.)
Gilles 'SO - hör auf böse zu sein'
2
"Javascript ist stark an Browsertechnologien gebunden": Historisch war es, aber ist es immer noch der Fall? Nach dem ECMAScript-Standard sieht die Sprache für mich wie eine anständige Allzweck-Programmiersprache aus, die nicht besonders an Browser gebunden ist.
Tsuyoshi Ito
1
IMO Javascript ist eine sehr gute Sprache für die Skripterstellung, aber die OO-Unterstützung ist etwas seltsam (Vererbung muss mit Prototypen simuliert werden, eine "Klasse" ist eine Funktion in Javascript, ...) ... aber auf der anderen Seite Prototypen sind in einer dynamischen Programmierumgebung sehr leistungsfähig. Beispielsweise können Methoden im laufenden Betrieb (interaktiv) sowohl zu "Klassen" als auch zu deren Instanzen hinzugefügt werden.
Vor dem
3
"Es ist meistens eine schreckliche Sprache, die überhaupt nicht dafür ausgelegt ist, effizient zu sein oder groß angelegte Software zu schreiben, obwohl in der Praxis beides aufgrund enormer Investitionen in die Compilertechnologie bzw. des sorgfältigen Gebrauchs der Sprache geschieht" - ich könnte dasselbe sagen für Python. Ich persönlich finde es schrecklich zu benutzen. Was die Effizienz angeht - das kommt davon, dass C / C ++ das schwere Heben übernimmt, wodurch JS auch eine hohe Leistung erzielt. Beide sind schrecklich für Multithread. Ich hatte> 100x Beschleunigung durch Umschreiben einfacher Python-Funktionen in C.
Mark K Cowan
1
@Ski Fünf Jahre alte Antwort ist fünf Jahre alt. Schockierend!
David Richerby
5

Nur eine Idee: Sie können in Java geschriebene wissenschaftliche Bibliotheken (ich denke, Sie werden bereits viel Arbeit finden) mit Javascript verwenden - das eine Java-ähnliche Syntax hat -, das nur als Umbruchsprache verwendet wird für:

  • Skripterstellung
  • Benutzerinteraktion
  • (Neu-) Modellierung und Standardisierung der zugrunde liegenden übergeordneten Klassen / Pakete / Funktionen ... obwohl ich denke, dass es besser wäre, dies in der Java "Schicht" zu tun.

Im Rhino-Projekt finden Sie einen stabilen Javascript-Interpreter, der in Java geschrieben wurde.

Wenn Sie möchten, können Sie die Java-JNI verwenden, um in C / C ++ geschriebene wissenschaftliche Bibliotheken zu verwenden.

Das ganze Bild:

                              ____ disparate Java libraries
Javascript   ----- Java      /
(scripting,      ("package   \____ JNI ____ C/C++ libraries
 interaction,     remodeling")   
high-level stuff)

EDIT : nur ein gefundenes Material googeln um wie folgt aus : Java GNU Wissenschaftliche Bibliothek , Liste der (Java) numerischen Bibliotheken , Java Graph Bibliothek , jHepWork Multi - Plattform - Umgebung für wissenschaftliche Berechnungen und Datenanalyse

Vor
quelle
2

Das Erstellen einer neuen Sprache ist nicht erforderlich. Man kann heute performantes numerisches Rechnen in JavaScript schreiben, ohne es zu kompilieren / zu transpilieren. Als Skriptsprache ist JavaScript im Vergleich zu Python und R recht günstig. Führen Sie für Benchmarks die Sprachbenchmarks in stdlib aus , um die Leistung einer Vielzahl von APIs zu vergleichen.

Für serverseitige Anwendungen können native Add-Ons von Node.j geschrieben werden, um eine Schnittstelle mit denselben C / C ++ / Fortran-Bibliotheken herzustellen, die in anderen numerischen Computerumgebungen wie R, Python und Julia verwendet werden. Wie in meiner Arbeit gezeigt, ermöglichen die nativen Add-Ons von Node.j die Verknüpfung mit hardwareoptimierten numerischen Berechnungsbibliotheken und ermöglichen so eine leistungsstarke numerische Berechnung aus JavaScript.

Für clientseitige Anwendungen kann eine Kompilierung in WebAssembly durchgeführt werden, um eine 1,5-2-fache native Leistung zu erzielen. Für ältere Umgebungen kann man zu asm.js kompilieren, einer reduzierten Teilmenge von JavaScript, die für die Compileroptimierung besser geeignet ist. In meiner Arbeit kann asm.js mit naiven Referenzimplementierungen (dh nicht hardwareoptimierten Implementierungen) übereinstimmen, die in C / C ++ / Fortran geschrieben wurden.

Kurz gesagt, es gibt keine technischen Gründe, warum Sie keine numerischen und wissenschaftlichen Computerbibliotheken in JavaScript selbst schreiben können. Was benötigt wird, sind Leute, die die Zeit und das Nötigste haben, um rigorose und robuste Implementierungen zu schreiben.

Offenlegung : Ich und andere arbeiten am stdlib- Projekt, das darauf abzielt, JavaScript und Node.js robuste, leistungsstarke numerische Computerfunktionen bereitzustellen.

kgryte
quelle