Was bestimmt die "Geschwindigkeit" einer Programmiersprache?

38

Angenommen, ein Programm wurde in zwei verschiedenen Sprachen geschrieben: Sprache X und Sprache Y. Wenn die Compiler denselben Bytecode generieren, warum sollte ich Sprache X anstelle von Sprache Y verwenden? Was macht aus, dass eine Sprache schneller ist als die andere?

Ich frage dies, weil oft Leute sagen: "C ist die schnellste Sprache, ATS ist eine Sprache, die so schnell ist wie C". Ich wollte die Definition von "schnell" für Programmiersprachen verstehen.

Rodrigo Valente
quelle
21
Wenn ein Programm schneller als ein anderes ist, bedeutet dies, dass es nicht denselben Bytecode haben kann.
Svick
5
Sprachen sind nur ein Begriff, den man zum Schreiben von Programmen verwendet, sodass man nicht wirklich über die Geschwindigkeit einer Sprache sprechen kann .
Juho
1
@Raphael Ich denke, es ist nicht zum Thema, unklar und viel zu weit gefasst. Das Thema ist zwar besser für das Software-Engineering geeignet , ich vermute jedoch, dass es dort als "zu breit" geschlossen wird.
David Richerby
2
Abgesehen von der Implementierung ist "Geschwindigkeit" nicht eindeutig, es gibt unterschiedliche Geschwindigkeiten für das Implementieren, Kompilieren, Ausführen und Debuggen, und Sie werden im Allgemeinen einige für die anderen austauschen (ansonsten würden wir alle die Programmiersprache verwenden)
Nick T
Wie oben. Die Sprachen erzeugen nicht den gleichen Bytecode. Einige Sprachen lassen sich leichter in Bytecode umwandeln. Einige haben einen höheren Abstraktionsgrad.
Superluminary

Antworten:

23

Es gibt viele Gründe, die für die Wahl einer Sprache X gegenüber einer Sprache Y in Betracht gezogen werden können. Programmlesbarkeit, einfache Programmierung, Portabilität auf viele Plattformen und das Vorhandensein guter Programmierumgebungen können solche Gründe sein. Ich werde jedoch nur die in der Anfrage geforderte Ausführungsgeschwindigkeit berücksichtigen. Die Frage scheint zum Beispiel die Geschwindigkeit der Entwicklung nicht zu berücksichtigen.

Zwei Sprachen können zu demselben Bytecode kompiliert werden, dies bedeutet jedoch nicht, dass derselbe Code erzeugt wird.

Eigentlich ist Bytecode nur Code für eine bestimmte virtuelle Maschine. Es hat technische Vorteile, führt jedoch keine grundlegenden Unterschiede zum direkten Kompilieren für eine bestimmte Hardware ein. Sie können also auch zwei Sprachen vergleichen, die für die direkte Ausführung auf demselben Computer kompiliert wurden.

Das Problem der relativen Geschwindigkeit von Sprachen ist jedoch alt und geht auf die ersten Compiler zurück.

In jenen frühen Zeiten war der Fachmann jahrelang der Ansicht, dass handgeschriebener Code schneller war als kompilierter Code. Mit anderen Worten, die Maschinensprache galt als schneller als Hochsprachen wie Cobol oder Fortran. Und es war sowohl schneller als auch normalerweise kleiner. Hochrangige Sprachen entwickelten sich immer noch, weil sie für viele Menschen, die keine Informatiker waren, viel einfacher zu benutzen waren. Die Kosten für die Verwendung von Hochsprachen hatten sogar einen Namen: das Erweiterungsverhältnis, das die Größe des generierten Codes (ein sehr wichtiges Problem in diesen Zeiten) oder die Anzahl der tatsächlich ausgeführten Anweisungen betreffen könnte. Das Konzept war hauptsächlich experimentell, aber das Verhältnis war anfangs größer als 1, da die Compiler nach heutigen Maßstäben eine relativ einfache Aufgabe erledigten.

So war die Maschinensprache schneller als etwa Fortran.

Das änderte sich natürlich im Laufe der Jahre, als die Compiler immer ausgefeilter wurden und das Programmieren in Assemblersprache heutzutage sehr selten ist. In den meisten Anwendungen können Assembler-Programme nur schlecht mit Code mithalten, der durch die Optimierung von Compilern generiert wurde.

Dies zeigt, dass ein Hauptproblem die Qualität der für die jeweilige Sprache verfügbaren Compiler, ihre Fähigkeit, den Quellcode zu analysieren und entsprechend zu optimieren, ist.

Diese Fähigkeit kann in gewissem Umfang von den Merkmalen der Sprache abhängen, um die strukturellen und mathematischen Eigenschaften der Quelle hervorzuheben und dem Compiler die Arbeit zu erleichtern. Beispielsweise könnte eine Sprache die Aufnahme von Aussagen über die algebraischen Eigenschaften von benutzerdefinierten Funktionen ermöglichen, damit der Compiler diese Eigenschaften für Optimierungszwecke verwenden kann.

Der Kompilierungsprozess kann einfacher sein, wodurch ein besserer Code erzeugt wird, wenn das Programmierparadigma der Sprache näher an den Merkmalen der Maschinen liegt, die den Code interpretieren, egal ob es sich um eine reale oder eine virtuelle Maschine handelt.

Ein weiterer Punkt ist, ob die in der Sprache implementierten Paradigmen auf die Art des zu programmierenden Problems beschränkt sind. Es ist zu erwarten, dass eine Programmiersprache, die auf bestimmte Programmierparadigmen spezialisiert ist, Merkmale, die mit diesem Paradigma zusammenhängen, sehr effizient kompiliert. Daher kann die Wahl einer Programmiersprache aus Gründen der Klarheit und Geschwindigkeit von der Wahl einer Programmiersprache abhängen, die an die Art des zu programmierenden Problems angepaßt ist.

Die Popularität von C für die Systemprogrammierung ist wahrscheinlich darauf zurückzuführen, dass C der Maschinenarchitektur nahe kommt und dass die Systemprogrammierung auch direkt mit dieser Architektur zusammenhängt.

Einige andere Probleme lassen sich einfacher programmieren, da sie mithilfe von Logikprogrammierung und Sprachen für die Einschränkungsauflösung schneller ausgeführt werden können .

Komplexe reaktive Systeme können sehr effizient mit speziellen synchronen Programmiersprachen wie Esterel programmiert werden , die sehr spezielle Kenntnisse über solche Systeme enthalten und sehr schnellen Code generieren.

Um ein extremes Beispiel zu nennen: Einige Sprachen sind hochspezialisiert, z. B. Syntaxbeschreibungssprachen, die zum Programmieren von Parsern verwendet werden. Ein Parser-Generator ist nichts anderes als ein Compiler für solche Sprachen. Natürlich ist Turing nicht vollständig, aber diese Compiler sind für ihre Spezialität außerordentlich gut: Sie produzieren effiziente Parsing-Programme. Da der Wissensbereich eingeschränkt ist, können die Optimierungstechniken sehr spezialisiert und sehr fein abgestimmt werden. Diese Parser-Generatoren sind normalerweise viel besser als das, was man durch das Schreiben von Code in einer anderen Sprache erzielen kann. Es gibt viele hochspezialisierte Sprachen mit Compilern, die exzellenten und schnellen Code für eine eingeschränkte Klasse von Problemen produzieren.

Daher kann es beim Schreiben eines großen Systems ratsam sein, sich nicht auf eine einzelne Sprache zu verlassen, sondern die beste Sprache für verschiedene Komponenten des Systems zu wählen. Dies wirft natürlich Kompatibilitätsprobleme auf.

Ein weiterer häufig wichtiger Punkt ist einfach die Existenz effizienter Bibliotheken für die zu programmierenden Themen.

Schließlich ist die Geschwindigkeit nicht das einzige Kriterium und kann im Widerspruch zu anderen Kriterien stehen, z. B. zur Codesicherheit (z. B. in Bezug auf fehlerhafte Eingaben oder Ausfallsicherheit bei Systemfehlern), zur Speichernutzung und zur Erleichterung der Programmierung (obwohl die Paradigmenkompatibilität tatsächlich hilfreich sein kann) ), Objektcodegröße, Programmwartbarkeit usw.

Geschwindigkeit ist nicht immer der wichtigste Parameter. Es kann auch verschiedene Erscheinungsformen annehmen, wie Komplexität, die durchschnittliche Komplexität oder Komplexität im schlimmsten Fall sein kann. Außerdem gibt es in einem großen System wie in einem kleineren Programm Teile, in denen die Geschwindigkeit entscheidend ist, und andere, in denen es wenig darauf ankommt. Und es ist nicht immer einfach, das im Voraus zu bestimmen.

babou
quelle
Vielen Dank. Es ist so ähnlich. Ich suchte. Es war schwierig, Material für das Thema zu finden. Dies wurde deutlich genug.
Rodrigo Valente
@ RodrigoAraújoValente Danke, Vielleicht möchten Sie sich diese Frage ansehen . Eine extremistische Ansicht ist, dass ein Compiler für die Sprache L nur einen Interpreter für L mit dem Quellcode des Programms bündeln kann, ohne etwas zu tun. Dann können Sie es besser machen, indem Sie versuchen, die Berechnung des Bündels zu optimieren (Teilauswertung). Je mehr Sie optimieren, desto schneller wird Ihre Sprache. Die Frage ist dann: Was kann Ihnen bei der Optimierung helfen? Die Antworten können gute Kenntnisse des Fachgebiets, Hilfe vom Programmierer, ausgefeilte Analyse, etc ...
babou
Mit "demselben Bytecode" meine ich "dieselbe Art von ausführbarer Darstellung". Offensichtlich werden identische ausführbare Dateien mit derselben Geschwindigkeit ausgeführt (unter der Annahme des gleichen Ausführungssystems). (Ich hätte dies wahrscheinlich aus der Informations- / Kommunikationsperspektive betrachtet. Theoretisch kann ein Programmierer alles über das Programm und die Hardware wissen, wohingegen eine Sprache häufig die Kommunikation einschränkt (was die zulässigen oder nützlichen Transformationen einschränkt) und der Compiler möglicherweise nicht weiß Details zur Mikroarchitektur Die Kompilierung und Compiler-Entwicklung sind für die Entwicklung und Schulung von entscheidender Bedeutung ....
Paul A. Clayton
Dies führt dann zu dem, was Menschen im Allgemeinen gut können (z. B. allgemeine Muster erkennen), und zu dem, was Computer im Allgemeinen gut können (z. B. Aufzeichnen und "Arithmetik"). Darüber hinaus ist die Kommunikation von Laufzeitinformationen häufig computerfreundlicher (die profilgesteuerte Optimierung kann einige Informationsmängel beheben, die über die Programmiersprache übertragen werden). Dynamische Optimierung wäre für menschliche Programmierer unpraktisch ...
Paul A. Clayton
(Das Gleiche gilt für das Schreiben sämtlicher Software in Assembler durch erfahrene Programmierer, die auf bestimmte Hardware abzielen. Zu dem Zeitpunkt, an dem die Software optimiert wurde, hätte sich nicht nur die Hardware geändert, sondern die Software wäre veraltet.)
Paul A. Clayton
16

Während letztendlich alles auf der CPU * läuft , gibt es verschiedene Unterschiede zwischen verschiedenen Sprachen. Hier sind einige Beispiele.

Interpretierte Sprachen Einige Sprachen werden eher interpretiert als kompiliert , zum Beispiel Python, Ruby und Matlab. Das bedeutet, dass Python- und Ruby-Code nicht zu Maschinencode kompiliert, sondern im laufenden Betrieb interpretiert wird. Es ist möglich, Python und Ruby zu einer virtuellen Maschine zu kompilieren (siehe nächster Punkt). Siehe auch diese Frage . Interpretiert wird in der Regel aus verschiedenen Gründen langsamer als kompilierter Code. Die Interpretation selbst kann nicht nur langsam sein, sondern es ist auch schwieriger, Optimierungen vorzunehmen. Wenn Ihr Code jedoch die meiste Zeit für Bibliotheksfunktionen verwendet (im Fall von Matlab), leidet die Leistung nicht.

Virtuelle Maschine Einige Sprachen werden in Bytecode kompiliert , einem erfundenen "Maschinencode", der dann interpretiert wird. Die wesentlichen Beispiele sind Java und C #. Während Bytecode im laufenden Betrieb in Maschinencode konvertiert werden kann, wird der Code wahrscheinlich immer noch langsamer ausgeführt. Im Falle von Java wird eine virtuelle Maschine für die Portabilität verwendet. Im Fall von C # können andere Probleme auftreten, z. B. die Sicherheit.

Overhead Einige Sprachen tauschen Effizienz gegen Sicherheit. Einige Versionen von Pascal überprüfen beispielsweise, ob Sie außerhalb der Grenzen auf ein Array zugreifen. C # -Code wird "verwaltet", und dies ist kostenpflichtig. Ein weiteres bekanntes Beispiel ist die Speicherbereinigung, die dem Programmierer Zeit spart, aber nicht so effizient ist wie die praktische Speicherverwaltung. Es gibt andere Overhead-Quellen, z. B. eine Infrastruktur zur Ausnahmebehandlung oder zur Unterstützung der objektorientierten Programmierung.

* Tatsächlich führen Hochleistungssysteme heutzutage auch Code auf GPUs und sogar auf FPGAs aus.

Yuval Filmus
quelle
Wenn ich also mehr Leistung benötige, sollte ich mich dann für kompilierte Sprachen entscheiden? Und über die Paradigmen? Gibt es einen Grund, funktional statt oop zu wählen oder umgekehrt?
Rodrigo Valente
Ihre Bemerkung zur Garbage Collection ist ein bisschen simpel. Es ist nicht immer statisch bestimmbar, wenn der zugewiesene Speicher nicht mehr verwendet wird. Auch wenn es sich um eine Entscheidung handelt, kann es sehr schwierig sein, eine Entscheidung zu treffen, ohne Fehler zu machen. Daher ist GC manchmal notwendig und oft sicherer (wie das Überprüfen von Array-Grenzen). Darüber hinaus kann es mit einer expliziten Freigabe kombiniert werden.
Babou
@ RodrigoAraújoValente Hängt ab. Crappy Code wird oft zu Crappy Code kompiliert. Vielleicht ist der Code, den Sie in Python schreiben können, tatsächlich schneller als der Code, den Sie in C schreiben können.
Raphael
nit: Wie in der Frage, mit der Sie verknüpft sind, erläutert, wird Python nicht "on-the-fly" interpretiert :)
Eevee
Keine der Sprachen, die Sie im übersetzten Abschnitt erwähnen, wird sofort übersetzt. Python wird zu Bytecode kompiliert, Ruby wurde zu AST kompiliert, aber ich glaube, es wird jetzt zu Bytecode kompiliert. Matlab ist meiner Meinung nach jetzt tatsächlich JIT kompiliert. Eigentlich kenne ich keine Nicht-Nischensprachenimplementierung, die Dinge im laufenden Betrieb interpretiert, anstatt zumindest eine Art virtuelle Maschinendarstellung zu kompilieren.
Winston Ewert
5

Es gibt verschiedene Faktoren, um X anstelle von Y zu wählen

  • Einfaches Lernen
  • Verständlichkeit
  • Geschwindigkeit der Entwicklung
  • Hilfe bei der Durchsetzung des richtigen Codes
  • Performance von kompiliertem Code
  • Unterstützte Plattformumgebungen
  • Portabilität
  • Für den Zweck geeignet

Einige Sprachen eignen sich für die Entwicklung von Geschäftsprojekten wie C # oder Python, andere eignen sich für die Systemprogrammierung wie C ++.

Sie müssen festlegen, unter welcher Plattform Sie arbeiten und welche Anwendung Sie erstellen möchten.

M ama D
quelle
1
Wie bestimme ich die Leistung des kompilierten Codes? Deshalb habe ich diese Frage gestellt.
Rodrigo Valente
6
Diese Antwort hat sicherlich gute Ratschläge, aber ich verstehe nicht, wie sie die Frage beantwortet, bei der es um Geschwindigkeit als Auswahlfaktor für eine Sprache geht.
Babou
@ RodrigoAraújoValente können Sie nicht einmal sein (wird interpretiert , wenn Ihre Sprache) kompilierten Code.
Raphael
1
Möglicherweise möchten Sie "Gute Bibliotheken" und "Gute Werkzeuge" hinzufügen.
Raphael
@ RodrigoAraújoValente Sie führen es aus und profilieren es.
Kyle
2

Die "schnellste" Programmiersprache, die Sie mit jeder Plattform bekommen können, ist die Assemblersprache für den Chipsatz, mit dem Sie es zu tun haben. Auf dieser Ebene gibt es keine Übersetzungen. Es müssen jedoch einige Kenntnisse darüber vorhanden sein, wie der Chipsatz Befehle ausführt, insbesondere solche, die parallel arbeiten können.

Die Konvertierung von C nach Assembly ist sehr "flach", da sie nahe eins zu eins liegt, aber besser lesbar ist. Aufgrund der Standardbibliotheken befinden sich jedoch viele Ebenen darüber, um die Portabilität zu verbessern. Es gibt nicht so viele Dinge, die der Compiler tun müsste, um zum Assembly-Code zu gelangen, und die stärkeren Optimierungen sind im Allgemeinen vorhanden, um maschinenspezifische Änderungen vorzunehmen.

C ++ fügt eine reichhaltigere Sprache hinzu. Da die Sprache jedoch zu viel Komplexität beiträgt, wird es für den Compiler schwieriger, optimalen Code für die Plattform zu erstellen.

Dann gehen wir auf die andere Seite der Skala. Interpretierte Sprachen. Diese sind in der Regel am langsamsten, da neben der Arbeit einige Zeit aufgewendet wird, um den Code zu analysieren und in Maschinenaufrufe umzuwandeln.

Dann haben wir die dazwischen. Im Allgemeinen verfügen sie über eine virtuelle Maschinenschicht, die für die Plattform optimiert ist. Der Compiler erstellt dann Code für die Ausführung der virtuellen Maschine. Manchmal passiert das auf einmal wie Perl oder Pascal oder Ruby oder Python. Oder in mehreren Stufen wie Java.

Einige dieser virtuellen Maschinen enthalten den Begriff eines JIT-Compilers, der auch die Laufzeit beschleunigt, indem er Code auf Computerebene erstellt und keinen Zwischen-Byte-Code übersetzt.

Einige virtuelle Maschinen sind auf niedrigem Niveau, was eine geringere Übersetzung von Bytecode zu Maschinencode ermöglicht. Was die Dinge beschleunigt und gleichzeitig die Portabilität beibehält.

Archimedes Trajano
quelle
In der Vergangenheit war C so konzipiert, dass eine einfache Übersetzung in Maschinencode möglich war. In zunehmendem Maße erfordert das Umwandeln von C in effizienten C-Code jedoch, dass ein Compiler herausfindet, was ein Programmierer versucht hat, und diese Absicht dann in Maschinencode umsetzt. In der *p++=*q++;Vergangenheit war beispielsweise der Maschinencode, der dem entspricht , auf vielen Maschinen schneller als array1[i]=array2[i];bei vielen Prozessoren, häufig umgekehrt, und daher konvertieren Compiler möglicherweise den ersteren Codestil in den letzteren - kaum eine "flache" Konvertierung.
Supercat
In der Regel -O0werden dadurch keine Optimierungen vorgenommen. Optimierungen sind ein Bonus, den Sie mit dem Compiler erhalten, aber die Sprache selbst kann nahezu eins zu eins in Assembler übersetzt werden.
Archimedes Trajano
2

Ein Punkt, der noch nicht erwähnt wurde, ist, dass in einigen Sprachen immer die gleiche Abfolge von Aktionen ausgeführt wird, wenn derselbe Code mehrmals ausgeführt wird. Der Computer muss also nur einmal festlegen, was der Codeabschnitt tun soll. Einer der Hauptvorteile des "use strict" -Dialekts von JavaScript besteht darin, dass die JavaScript-Engine, sobald sie herausgefunden hat, was ein Teil des Codes tut, diese Informationen beim nächsten Ausführen verwenden kann. ohne "use strict" geht das nicht.

Wenn zum Beispiel "use strict" fehlt, kann ein Stück Code wie:

function f() { return x; }

kann eine Variable X im unmittelbaren aufrufenden Kontext, falls vorhanden, oder eine Variable X aus einem äußeren aufrufenden Kontext zurückgeben oder sie kann zurückgeben Undefined. Schlimmer noch, in einer Schleife wie:

for (i=0; i<40; i+=1) { g(i); }

Es gibt keine Möglichkeit für die JavaScript-Engine zu wissen, was g()mit i[oder für sich gselbst in dieser Angelegenheit tun könnte . Da goder ikönnte durchaus legitim Änderung iin einen String, kann der JavaScript - Engine einfach nicht eine numerische Addition und numerischen Vergleich in der Schleife verwenden, sondern muss bei jedem Durchlauf durch die Schleife geprüft, ob eine der beiden Funktionsaufrufe etwas getan haben ioder g. Im Gegensatz dazu kann die JavaScipt-Engine im Dialekt "use strict" den obigen Code untersuchen und wissen, dass jeder Durchlauf durch die Schleife dieselbe numerische Variable verwendet und dieselbe Funktion aufruft. Es muss sich also nur identifizieren iund funktioniereng einmal, anstatt sie bei jedem Durchgang durch die Schleife nachschlagen zu müssen - eine große Zeitersparnis.

Superkatze
quelle
2

Hier gibt es einige recht professionelle Antworten, diese sind ihnen nicht nah, könnten aber für Sie intuitiv sein.

Möglicherweise haben Sie schon oft gehört, dass Sie, wenn Sie eine Aufgabe so schnell wie möglich ausführen möchten, den Code schreiben möchten, der sie in der Assembly ausführt. Das liegt daran, dass Sie nur Befehle ausführen, die Sie zum Ausführen der Aufgabe tatsächlich benötigen, und nicht mehr. Während Sie diese Aufgabe in einer höheren Sprache in mehreren Zeilen implementieren können, muss der Compiler sie dennoch in die Maschinensprache übersetzen. Diese Übersetzung ist nicht immer minimalistisch, da Sie sie direkt schreiben könnten. Das bedeutet, dass die Maschine viele Stunden damit verbringt, Befehle auszuführen, die Sie sparen könnten.

Obwohl Compiler heutzutage sehr hoch entwickelt sind, sind sie immer noch nicht so effektiv, wie es die besten Assembler-Programmierer können.

Wenn Sie in diese Richtung fortfahren, werden diese nicht benötigten Befehle (normalerweise) umso umfangreicher, je höher die Sprachstufe ist. (Dies gilt nicht zu 100% für alle Hochsprachen.)

Für mich ist die Sprache X schneller als die Sprache Y (zur Laufzeit), wenn für bestimmte Codeteile der Maschinencode von X kürzer als der von Y ist.

Johni
quelle
Montage rockt total. Es braucht einen wahren Künstler, um die besten Compiler zu übertreffen.
Johan
1

Es ist schwierig, diese Frage definitiv zu beantworten, da sie so komplex und mehrdimensional ist (es ist fast so, als würde man beispielsweise Automarken anhand verschiedener Kriterien vergleichen), aber es gibt neue wissenschaftliche Studien, darunter ein ausgezeichnetes Code-Repository, das als Rosetta-Code bekannt ist ( Wikipedia-Übersicht ). Diese Umfrage von Nanz und Furia aus dem Jahr 2014 untersucht diese Frage ziemlich eindeutig und wissenschaftlich auf der Grundlage der folgenden typischen Kriterien und einer seltenen quantitativen Analyse der typisch subjektiven Codequalitäten. Das Abstract enthält einige objektiv begründete Befunde und Verallgemeinerungen. (Hoffentlich können in Zukunft weitere Studien durchgeführt werden, die auf diesen Ergebnissen aufbauen.)

  • RQ1. Welche Programmiersprachen sorgen für präziseren Code?

  • RQ2. Welche Programmiersprachen werden in kleinere ausführbare Dateien kompiliert?

  • RQ3. Welche Programmiersprachen haben eine bessere Laufzeitleistung?

  • RQ4. Welche Programmiersprachen nutzen den Speicher effizienter?

  • RQ5. Welche Programmiersprachen sind weniger störanfällig?

Zusammenfassung - Manchmal sind Debatten über Programmiersprachen eher religiös als wissenschaftlich. Fragen, welche Sprache prägnanter oder effizienter ist oder Entwickler produktiver macht, werden mit Inbrunst diskutiert, und ihre Antworten basieren zu oft auf Anekdoten und unbegründeten Überzeugungen. In dieser Studie nutzen wir das weitgehend ungenutzte Forschungspotenzial von Rosetta Code, einem Code-Repository mit Lösungen für gängige Programmieraufgaben in verschiedenen Sprachen, das einen großen Datensatz für die Analyse bietet. Unsere Studie basiert auf 7.087 Lösungsprogrammen, die 745 Aufgaben in 8 weit verbreiteten Sprachen entsprechen und die wichtigsten Programmierparadigmen darstellen (Prozedur: C und Go; Objektorientiert: C # und Java; Funktional: F # und Haskell; Skripterstellung: Python und Ruby). Unsere statistische Analyse zeigt vor allem, dass: Funktions- und Skriptsprachen sind prägnanter als prozedurale und objektorientierte Sprachen. C ist kaum zu übertreffen, wenn es um die rohe Geschwindigkeit bei großen Eingaben geht, aber die Leistungsunterschiede zu Eingaben mittlerer Größe sind weniger ausgeprägt und ermöglichen es, dass selbst interpretierte Sprachen wettbewerbsfähig sind. Kompilierte stark typisierte Sprachen, bei denen zur Kompilierungszeit mehr Fehler festgestellt werden können, sind weniger anfällig für Laufzeitfehler als interpretierte oder schwach typisierte Sprachen. Wir diskutieren die Auswirkungen dieser Ergebnisse auf Entwickler, Sprachdesigner und Pädagogen. Wenn während der Kompilierung mehr Fehler festgestellt werden, ist die Wahrscheinlichkeit von Laufzeitfehlern geringer als bei interpretierten oder schwach typisierten Sprachen. Wir diskutieren die Auswirkungen dieser Ergebnisse auf Entwickler, Sprachdesigner und Pädagogen. Wenn während der Kompilierung mehr Fehler festgestellt werden, ist die Wahrscheinlichkeit von Laufzeitfehlern geringer als bei interpretierten oder schwach typisierten Sprachen. Wir diskutieren die Auswirkungen dieser Ergebnisse auf Entwickler, Sprachdesigner und Pädagogen.

vzn
quelle
0

Computersprachen sind nur eine Abstraktion von Befehlen, um dem Computer zu erklären, was zu tun ist.

Sie können sogar in der Computersprache schreiben Pythonund mit einem C-Compiler (Cython) kompilieren.

Vor diesem Hintergrund ist die Geschwindigkeit von Computersprachen nicht zu vergleichen.

Sie können jedoch bis zu einem gewissen Grad Compiler für dieselbe Sprache vergleichen. Zum Beispiel GNU CCompiler versus Intel CCompiler. (Suche nach Compiler-Benchmark)

Jonas Stein
quelle
2
Wenn Sie Kommentare zu der Frage abgeben möchten, verwenden Sie bitte das Kommentarfeld und nicht Ihre Antwort. Beachten Sie, dass dies Computer Science Stack Exchange ist und Computer Science nicht programmiert, so wie Literatur keine Textverarbeitung ist. Programmierfragen live auf Software Engineering oder Stack Overflow .
David Richerby