Frage

Ist es möglich, etwas wie Ruby oder Clojure ohne erheblichen Leistungsverlust in vielen Situationen im Vergleich zu C / Java zu entwerfen? Hat Hardware-Design eine Rolle spielen?

Edit: Mit signifikanten ich in einem um Größenordnungen bedeuten, nicht nur zehn procent

Edit: Ich vermute, dass delnan korrekt mit mir dynamischen Sprachen bedeutet so dass ich den Titel geändert

War es hilfreich?

Lösung

Die Leistung hängt von vielen Dingen ab. Natürlich ist die Semantik der Sprache selbst werden muß, erhalten, wenn wir es kompilieren - Sie dynamischen Dispatch von Ruby nicht entfernen können, würde es die Dinge beschleunigen drmatically, aber es wäre völlig 95% des gesamten Ruby-Code in der Welt brechen. Aber immer noch ein großer Teil der Leistung hängt davon ab, wie intelligent die Umsetzung ist.

Ich gehe davon aus, durch "High-Level", meinen Sie "dynamisch"? Haskell und OCaml sind extrem hohe Niveau, doch ist nativ kompiliert und C # oder Java, auch C und C ++ in einigen Fällen Ecke übertreffen - vor allem, wenn Parallelität ins Spiel kommt. Und sie wurden schon gar nicht mit Leistung als Ziel # 1 entworfen. Aber Compiler Schriftsteller, vor allem diejenigen konzentrierten onfunctional Sprachen, sind ein sehr klug Leute. Wenn Sie oder ich begann Sprache einer High-Level, auch wenn wir verwenden z.B. LLVM als Backend für die native Kompilierung, wir würden nicht überall in der Nähe von dieser Leistung.

Erstellen dynamische Sprachen schnell laufen ist schwieriger - sie viele Entscheidungen (Typen, Mitglieder einer Klasse / ein Objekt, ...) verzögern statt compiletime zur Laufzeit und während statische Code-Analyse manchmal nachweisen kann, ist es nicht möglich, in den Zeilen n und m, müssen Sie noch eine erweiterte Laufzeit herum tragen und tun schon einige Dinge, die eine statische Sprache des Compilers bei compiletime tun können. Auch dynamische Dispatch kann mit einer intelligenteren VM optimiert werden ( Inline Cache anyone?), Aber es ist ein viel Arbeit. Mehr als eine kleine neue fangeled Sprache tun könnte, das ist.

Siehe auch Steve Yegge Dynamic Languages ??Strike Back .

Und natürlich, was ist ein wichtiger peformance Verlust? 100-mal langsamer als C liest sich wie eine Menge, aber wie wir alle wissen, 80% der Ausführungszeit wird in 20% des Codes = 80% des Codes nicht haben bemerkenswerte Auswirkungen auf die wahrgenommene Leistung des gesamten Programms ausgegeben. Für die restlichen 20% können Sie immer neu schreiben sie in C oder C ++ und es von der dynamischen Sprache nennen. Für viele Anwendungen ist dies genügt (für einige, brauchen Sie nicht einmal zu optimieren). Für den Rest ... na ja, das kritisch, wenn die Leistung ist, sollten Sie propably schreiben sie in einer Sprache für Leistung.

Andere Tipps

Do die Sprache Design mit der Plattform nicht verwirren, dass es läuft.

Zum Beispiel Java ist eine höhere Programmiersprache. Es läuft auf der JVM (wie auch Clojure - oben identifiziert und JRuby - eine Java-Version von Ruby). Die JVM wird Byte-Code-Analyse und Optimierung, wie der Code ausgeführt wird (unter Verwendung von Escape-Analyse, Just-in-Time-Kompilierung etc.) durchzuführen. So ist die Plattform eine Auswirkung auf die Leistung hat, die weitgehend unabhängig von der Sprache selbst ist (siehe hier für weitere Informationen über Java-Performance und Vergleiche zu C / C ++)

Der Verlust zu dem, was im Vergleich? Wenn Sie einen Garbage Collector oder Verschlüsse müssen, dann müssen Sie sie, und Sie werden den Preis unabhängig zu zahlen. Wenn eine Sprache macht sie leicht für Sie zu bekommen, bedeutet das nicht, dass Sie sie benutzen, wenn Sie sie nicht brauchen.

Wenn eine Sprache statt kompiliert interpretiert wird, das wird eine Größenordnung Verlangsamung einzuführen. Aber eine solche Sprache kann Vorteile haben Kompensation, wie Benutzerfreundlichkeit, Plattformunabhängigkeit und mit nicht zu kompilieren. Und die Programme, die Sie in sie schreiben kann nicht lang genug für Geschwindigkeit laufen ein Problem zu sein.

Es kann Sprachimplementierungen, die Langsamkeit ohne guten Grund vorstellen, aber die haben nicht verwendet werden.

Sie könnten wollen, betrachten, was die DARPA HPCS Initiative kommen mit hat. Es gab 3 Programmiersprachen vorgeschlagen: Sun-Festung, IBM X10 und Cray-Kapelle. Die beiden letzteren sind noch in der Entwicklung. Ob eines dieser treffen Ihre Definition von High-Level Ich weiß es nicht.

Und ja, Hardware-Design hat sicherlich eine Rolle spielen. Alle drei dieser Sprachen bei Supercomputern ausgerichtet sind, mit sehr vielen Prozessoren und Ausstellungs verfügt über entsprechende an diese Domäne.

Es ist sicherlich möglich. Zum Beispiel ist Objective-C eine dynamisch typisierte Sprache, die Leistung vergleichbar mit C ++ hat (wenn auch ein bisschen langsamer, allgemein gesprochen, aber immer noch in etwa gleichwertig).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top