Oft gibt es Programmiersprachen, die auf bestimmte Aufgaben spezialisiert sind. Einige Programmiersprachen eignen sich hervorragend für die Array-Arithmetik (z. B. Matrizen und die Verwendung mehrdimensionaler Arrays), andere hingegen eignen sich besser für Mathematik höherer Ebenen, die in anderen Sprachen nur schwer reproduzierbar ist (und dennoch möglich ist).
Was ist mit einer Sprache, die für eine bestimmte Aufgabe oder ein bestimmtes Endziel besser geeignet ist als andere Sprachen?
Ich spreche von Turing-vollständigen Sprachen, die Turing-äquivalent sind.
programming-languages
esote
quelle
quelle
Antworten:
Es gibt ein paar Dinge zu beachten:
Abstraktion: Was behandelt die Sprache als "speziell"? Sind Matrizen erstklassige Werte wie in Matlab oder codieren Sie sie mit einfacheren Typen wie Arrays wie in C? C lässt Sie darüber nachdenken, wie Matrizen implementiert werden, Matlab nicht.
Wenn Sie über ein kompliziertes System der asynchronen Kommunikation verfügen, möchten Sie wahrscheinlich erstklassige Funktionen, um Rückrufe durchführen zu können.
Je mehr Funktionen hinzugefügt werden, desto komplexer wird die Sprache. Während es also einige "Multi-Paradigma" -Sprachen wie C ++ und D gibt, wählen die meisten Sprachen eine Nische aus, wählen die für diese Nische wichtigen Dinge aus und priorisieren diese als ihre Hauptabstraktionen.
Leistung: Jede Abstraktion ist mit Kosten verbunden, unabhängig davon, ob sie zur Kompilierungszeit oder zur Laufzeit ausgeführt wird. Einige Sprachen beschränken sich auf eine Weise, die sie weniger abstrakt, aber performanter macht.
Frühes Fortran erlaubte keine Zeiger oder Rekursionen, daher war es großartig, Zahlen zu knacken, schneller als eine Sprache wie C, in der Sie viele Schleifen ablaufen ließen. Aber es war schrecklich, große Datenstrukturen wie Bäume zu codieren, bei denen Zeiger für die Indirektion benötigt wurden. (Beachten Sie, dass ich nicht viel über das moderne Fortran weiß.)
Grundsätzlich gibt es immer Kompromisse. Abstrakter bedeutet entweder eine langsamere Laufzeit oder mehr Komplexität bei der Kompilierung. Mehr Funktionen bedeuten eine komplexere Sprache. Einige Funktionen machen bestimmte Dinge schnell und andere langsam, wie Zeiger und Rekursion. Es gibt keine perfekte Sprache, daher wird jede Sprache im Bereich der Sprachqualitäten eine Art lokales Maximum erreichen.
quelle
Die Einschränkungen einiger Sprachen erleichtern die Implementierung von schnellerem Code (z. B. Fortran vs C und das Aliasing von Zeigern), was einen Kompromiss zwischen sofortiger Leistung und Möglichkeiten darstellt.
Die Sprache ist nicht für bestimmte Aufgaben "optimiert", aber die Implementierung, Compiler und Einschränkungen, die es dem Compiler erleichtern, den Code zu verstehen, machen es so. Im Kern geht es um spezifische Bibliotheken. Algorithmen, die je nach Problemlänge eingesetzt werden, um den Prozess mit Switches zu beschleunigen, machen ihn optimal.
Die Multiplikation verwendet zum Beispiel verschiedene Fälle (siehe GMP-Multiplikation .
Wenn die Sprache die übergeordneten mathematischen Operationen angibt, ist ihre Implementierung optimal (in diesem Fall effizient), dies ist jedoch nicht der Teil der Sprachspezifikation.
Bitte werfen Sie einen Blick auf die Matrixrangberechnung in Matlab, Mathematica und Maple (ich kann im Moment nicht alle Tests selbst durchführen, aber diese stimmen mit meinen Tests überein). Alle diese Sprachen (Umgebungen) implementieren dieselbe Operation auf höherer Ebene, aber die Implementierungsdetails unterscheiden sich, was verschiedene Zeiten ergibt.
Wenn sich eine domänenspezifische Aufgabe (hier auch domänenspezifische Sprache) an bestimmten Berechnungen orientiert, werden sie (im Laufe der Jahre) für die Zielgruppe verbessert und optimiert. Aber optimal zu sein, ist nicht immer der Fall. Zum Beispiel hat Perl eine lange Geschichte im Umgang mit Strings, aber die PCRE (hier einfach Perls reguläre Ausdrücke) sind nicht die schnellsten existierenden (und verbrauchen viel Speicher), sondern sind extrem ausdrucksstark und leistungsstark.
Die Einschränkungen der Sprache machen einen Unterschied im Kompilierungsprozess, das erwähnte Pointer-Aliasing verhindert die Möglichkeit der Code-Neuordnung und erzwingt das Neuladen von Variablen.
quelle
Meiner Meinung nach lässt sich dies tatsächlich recht genau formulieren: Ein Tool (zum Beispiel eine Programmiersprache zusammen mit seinen Standardbibliotheken) ist das optimale Tool für eine bestimmte Klasse von Problemen, wenn es über alle möglichen Tools, die verwendet werden könnten, das minimiert erwartete Kosten für eine ausreichend korrekte und performante Lösung, bei der die Erwartung einer bestimmten Wahrscheinlichkeitsverteilung über alle Probleme in der Problemklasse übernommen wird. In den meisten Fällen handelt es sich dabei um Programmiererzeit , einschließlich der voraussichtlichen Entwurfszeit, der voraussichtlichen Debugging-Zeit, der voraussichtlichen Zeit, die erforderlich ist, um jemanden zu unterrichten, der mit dem Tool noch nicht vertraut ist usw.
In der Praxis kann fast keine dieser Größen tatsächlich gemessen werden. Trotzdem denke ich, dass es der richtige Weg ist, über das Problem nachzudenken.
quelle
Es ist eine ausgezeichnete Frage und nicht leicht zu beantworten. Gibt es irgendetwas an der Erlang-Sprache, das sie für Telekommunikationsanwendungen in Echtzeit geeignet macht? Oder geht es um den Erlang-Compiler? Oder geht es um die Erlang-Community und das Ökosystem? Vielleicht sind Leute, die wissen, wie man Telekommunikationsanwendungen schreibt, Experten für Erlang, und die Leute, die Erlang kennen, sind Experten für Telekommunikationsanwendungen? Ich vermute, dass all diese Faktoren eine Rolle spielen.
Es gibt wahrscheinlich zwei Funktionen in Erlang, die es für solche Anwendungen geeignet machen (Einschränkung: Ich habe die Sprache noch nie selbst verwendet) - es bietet eine gute Unterstützung für Parallelität und Unterstützung für dynamische Software-Upgrades. Diese Funktionen wären auch in vielen anderen Bereichen nützlich, aber Telekommunikationsingenieure sind von der Verfügbarkeit begeistert. Vielleicht wäre Erlang auch dort beliebt, wenn die Leute, die Websites erstellen, sich genauso Gedanken über hohe Verfügbarkeit machen wie die Leute, die Telefonzentralen bauen.
quelle
Bei den anderen Antworten geht es nicht darum, eine Sprache für eine bestimmte Aufgabe zu optimieren. Es geht nicht nur darum, wie Code auf einer bestimmten Hardware schneller ausgeführt wird. Es geht darum, wie klar und prägnant eine bestimmte Sprache es Ihnen ermöglicht, die Lösung eines Problems auszudrücken. Das hängt sehr stark von der Problemdomäne ab und (zusammen mit dem Marketing-Hype, der Unkenntnis bestehender Lösungen und der Ego-Reise, eine neue Sprache zu schreiben), haben wir mehrere Sprachen - das Ziel ist, dass der Programmierer weniger Code schreibt, der ist sowohl weniger fehleranfällig als auch für den nächsten Programmierer einfacher zu lesen / verstehen / reparieren / verbessern.
Beispielsweise können sowohl C als auch C ++ für die objektorientierte Programmierung verwendet werden - und in der Tat ist die GObject-Bibliothek ein gutes Beispiel für OO C. Eine AC-Struktur mit Funktionszeigern kann denselben Zweck erfüllen wie virtuelle Methoden in einer C ++ - Klasse und kann ausgeführt werden besser; Der Entwicklungsnachteil ist der Klebercode für die Zuweisung von Speicher, die Initialisierung der Funktionszeiger und die Auswahl einer Strategie für den Aufruf der übergeordneten Methoden. Meistens ist es klarer / sicherer zu tippen
Class klass * = new class()
alsstruct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ...
.quelle