Was macht eine Sprache für eine bestimmte Aufgabe "optimiert"?

15

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.

esote
quelle
1
Dies ist eine enzyklopädische Frage. Ich schlage vor, dass Sie es auf irgendeine Weise aufschlüsseln, es spezifischer machen.
André Souza Lemos
5
Wäre es falsch, "Marketing" zu sagen?
CorsiKa
2
@corsiKa Ja, ich denke, es ist mehr als nur eine Frage des Marketings.
Jeremy West

Antworten:

18

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.

jmite
quelle
8

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.

Böse
quelle
9
Die meisten Sprachen sind nach Spezifikation vollständig, da nicht alle in ihrer Spezifikation feste Adressgrößen angeben. Und es ist ziemlich einschränkend, die Unterscheidung zwischen Dingen wie C, die Turing Complete-Modulo-Adressgröße sind, und Dingen wie Coq, Agda oder System F, die überhaupt nicht Turing Complete sind, zu verlieren.
Mittwoch,
1
@jmite danke. Ich hoffe, dass dies die Unterschiede nicht länger in den Schatten stellt
Evil
@Evil: Nun, ich denke, deine Aussage, dass Sprachen nicht für Aufgaben optimiert werden, ist falsch. Sie sehen, wie das Wort aus der Sicht des Computers optimiert wird. Einige Sprachen sind jedoch so konzipiert, dass sie nur dem Programmierer die Arbeit erleichtern und es den Implementierern ermöglichen, die Leistung zu optimieren.
TheDoctor
Dies ist aus der Sicht der Effizienz, es ist also nicht falsch, ich habe nur diesen Blickwinkel gewählt, Sie könnten den anderen betrachten (optimiert, was bedeutet, dass es einfacher ist, bestimmte Aufgaben darin zu schreiben). "Was ist mit einer Sprache, die für eine bestimmte Aufgabe oder ein bestimmtes Endziel besser ist als andere Sprachen [...]?" Der Autor akzeptierte weder eine Antwort, noch fügte er Klarstellungen oder Kommentare hinzu, dass es sich bei den Antworten nicht um Fragen handelt. Abgesehen davon ist es einer der Faktoren, die für manche Menschen wichtiger sind als für andere
böse
5

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.

j_random_hacker
quelle
4

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.

Michael Kay
quelle
3

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()als struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....

Phil Lello
quelle
Nun, die Antwort von jmite enthält einen Punkt, an dem die Dinge fehlen, die Sie geschrieben haben. Ich schrieb über domänenspezifische Aufgaben, die für diese Angelegenheit optimiert sind. Ich mag C, ich weiß Dinge wie OCC, aber es macht C nicht objektorientiert (der Compiler hilft nicht dabei und viele Optimierungen werden verhindert, es gibt keinen Garbage Collector usw.). Sie können C-Funktionen nicht wie in C ++ überladen, aber Sie können natürlich jedes Verhalten emulieren (jmite hat auch darüber geschrieben). Ich verstehe nicht, wie dies die gestellte Frage beantwortet.
Evil
2
@Evil: Objektorientierte Programmierung und objektorientierte Programmiersprache sind zwei unterschiedliche Konzepte. Objektorientierte Programmierung erfordert keine objektorientierte Sprache. Möglicherweise ist nur das Vorhandensein von Papier oder Whiteboards erforderlich, damit Sie Ihr UML-Design erstellen können.
Slebetman
@slebetman Das habe ich nicht kommen sehen. Möglicherweise brauchen Sie weder Papier noch Whiteboard, Sie können sich Objekte vorstellen, und nach Ansicht einiger Leute denken wir so, aber dies kommt der sprachlichen Unterstützung von OOP-Konzepten nicht näher. Es tut mir leid, aber das ist Streit, den ich nicht auswählen möchte.
Evil
@Evil: Ich bin mir nicht so sicher, ob ich in der Lage bin, den Überblick zu behalten, ohne eine Abstraktion, die dir hilft. Mein erster Auftrag bestand darin, einen großen Teil des C-Codes zu bekommen, der aussah wie alle Arrays mit Funktionszeigern (ich brauchte eine Weile, um herauszufinden, was die seltsame Syntax bedeutete - damals noch kein Google), und ich kämpfte damit, bis ich ein Muster sah und erkannte, dass diese Arrays Objekte und diese Funktionszeiger Methoden waren. Ich kaufte mir ein kleines Whiteboard und verbrauchte viel A4-Papier, aber schließlich konnte ich den Code verstehen
slebetman
1
@slebetman Da die objektorientierte Programmierung mindestens 20 Jahre älter ist als UML, erscheint Ihre Behauptung, dass UML-Entwürfe für die Objektorientierung erforderlich sind, völlig falsch.
David Richerby