Skalierbarkeit von Scala über Java

9

Ich habe einen Artikel gelesen, der besagt, dass Scala die Parallelität besser handhabt als Java.

http://www.theserverside.com/feature/Solving-the-Scalability-Paradox-with-Scala-Clojure-and-Groovy

... die Einschränkung der Skalierbarkeit beschränkt sich speziell auf die Java-Programmiersprache selbst, ist jedoch keine Einschränkung der gesamten Java-Plattform ...

Die Skalierbarkeitsprobleme mit Java sind keine neue Entdeckung. Tatsächlich wurde viel Arbeit geleistet, um genau diese Probleme anzugehen. Zwei der erfolgreichsten Projekte sind die Programmiersprachen Scala und Clojure ...

... Scala findet Wege um das problematische Thread- und Locking-Paradigma der Java-Sprache herum ...

Wie ist das möglich? Verwendet Scala nicht die Kernbibliotheken von Java, die alle Threading- und Sperrprobleme von Java auf Scala übertragen?

Marcus
quelle

Antworten:

16

Natürlich schon. Und Java verwendet die gesamte Infrastruktur der JVM, die in C geschrieben wurde, wieder und läuft letztendlich im Maschinencode!

Entwickler können ihre Anwendungen skalieren lassen, indem sie nicht mehr Rohleistung bereitstellen. Assembler verfügt bereits über die Leistung, die Ihre Hardware zulässt, und keine Sprache kann mehr bieten. Tatsächlich besteht der gesamte Sinn von Sprachen höherer Ordnung darin, einzuschränken, was Programmierer in ihnen tun können. Das klingt schrecklich, aber der Engpass beim Schreiben von großartigem, korrektem und effizientem Code ist nicht das Rechenmodell. Es ist das Gehirn der Menschen, die die für die Maschine geschriebenen Programme verstehen müssen. Die Erfahrung hat gezeigt, dass wir nicht klug genug sind, um die theoretisch optimale Lösung eines komplexen Rechenproblems zu verstehen. Wir würden es wahrscheinlich nicht einmal erkennen, wenn wir es sehen würden.

Im konkreten Beispiel bedeutet der Artikel vermutlich, dass Scala übergeordnete Bibliotheken und Konzepte bereitstellt, die es Entwicklern erleichtern, ihre Probleme unter dem Gesichtspunkt der Parallelität zu verstehen. Das Endergebnis ist daher besser und skalierbarer als das Codieren direkt in Java ( oder C oder Assembler) wäre gewesen. Dies widerspricht nicht der Tatsache, dass Scala vollständig auf einer virtuellen Java-Maschine ausgeführt wird. Die JVM ist eine schöne Erfindung, mit der alle Arten von netten Dingen einfacher geschrieben werden können, als dies ohne sie möglich wäre - einschließlich Frameworks und Bibliotheken, die noch komplexere Dinge einfacher machen. Erstaunlich, nicht wahr?

Kilian Foth
quelle
2
Sprachen höherer Ordnung können mehr als nur einschränken. Sie ermöglichen auch Abstraktionen - Assembler verfügt über die gesamte Leistung der Hardware, lässt Sie jedoch nur wenig darüber abstrahieren . Und in diesem speziellen Fall würde ich sagen, was Scala tut, ist 50% Einschränkung, 50% Abstraktion.
Daniel C. Sobral
1
@ Daniel - Ich stimme zu, dass Abstraktionen wertvoll sind, aber Abstraktion ist sicherlich nur eine Form der Einschränkung? Im Sinne, bestimmte Details konkreter Instanzen zu entfernen und nur das allgemeine Konzept beizubehalten? Wikipedia drückt es so aus: "Abstraktionen können gebildet werden, indem der Informationsgehalt eines Konzepts oder eines beobachtbaren Phänomens reduziert wird"
mikera
5

Es ist eine Frage der Bibliotheksunterstützung. Java verwendet das Low-Level-Thread-Konstrukt, um die Parallelität darzustellen (dies ist wie die Assemblersprache der Parallelitätswelt). Darüber hinaus können Sie zahlreiche Bibliotheken und Techniken verwenden, um skalierbare Lösungen zu erstellen, z. B. die Unterstützung des Pakets java.util.concurrent und die Befolgung der Techniken von Brian Goetz in seinem Buch Java Concurrency in Practice. Scala half bei der Einführung von Dingen wie dem Akka-Framework (das jetzt auch von Java verwendet werden kann), das einige dieser besseren Praktiken und die Unterstützung von Bibliotheken unterstützt. Das heißt nicht, dass Java, das die Sprache nicht einholen konnte (parallele Sammlungen usw.), wie Kilian feststellt, alles auf der JVM und damit auf der JMM läuft.

Außerdem sind Javas Objekte standardmäßig veränderbar, und es sind einige nicht triviale Kenntnisse erforderlich, um sie effektiv unveränderlich zu machen. Scala macht es angeblich einfacher, unveränderliche Objekte zu erstellen

Martijn Verburg
quelle
2

Verwendet Scala nicht die Kernbibliotheken von Java, die alle Threading- und Sperrprobleme von Java auf Scala übertragen?

Ja, und wenn Sie sich in Scala einschließen, treten dieselben Probleme auf. Der Punkt ist jedoch, dass Sie dies nicht tun sollten, da Scala Ihnen Abstraktionen zur Verfügung stellt, die dieses Problem sicherer behandeln.

Jetzt macht Scala zwei Dinge, die wirklich helfen. Eines davon ist das Schauspieler-Modell, das als Parallelitätsmuster betrachtet werden kann und von Scala als Bibliothek bereitgestellt wird. Wenn Sie ein Java-Programmierer sind, empfehle ich Ihnen, zur Akka- Site zu gehen und sich deren Java-Inhalte anzusehen. Dies ist die Bibliothek, die die aktuelle Schauspieler-Bibliothek von Scala ersetzt, und Sie können sie von Java aus verwenden.

Das zweite, was Scala dabei hilft, ist die Verwendung unveränderlicher Datenstrukturen. Nichts hindert Java daran, unveränderliche Datenstrukturen zu verwenden - Stringzum einen ist es selbst unveränderlich! Unveränderliche Datenstrukturen leiden nicht unter Parallelitätsproblemen, da Threads sie nicht ändern können.

Es gibt andere Dinge, die dazu beitragen, vollständige Lösungen zu erstellen, wie z. B. Agenten und stm (beide von Akka erhältlich) oder Latches (von Java).

Nun können die beiden oben genannten Dinge in Java ausgeführt werden, wie ich selbst sagte. Sie können Akka in Java verwenden und unveränderliche Datenstrukturen in Java schreiben (oder aus Bibliotheken verwenden, die diese bereitstellen). Java macht es jedoch schwierig, dieses Zeug zu verwenden, da es weder Typen höherer Ordnung noch Schließungen und erstklassige Funktionen unterstützt.

Während Sie dies tun können, werden Programmierer dies normalerweise nicht tun, da das Schreiben eines solchen Codes in Java sehr ausführlich ist (ich meine, viel mehr als der Standard für Java).

Daniel C. Sobral
quelle
0

Der Hauptgedanke des Artikels, auf den verwiesen wird, ist:

Die Einschränkung der Skalierbarkeit ist speziell auf die Java-Programmiersprache selbst beschränkt, stellt jedoch keine Einschränkung der gesamten Java-Plattform dar. Wenn Programme so geschrieben werden, dass sie die zugrunde liegende Java-Plattform richtig nutzen, ist die lineare Skalierbarkeit kein Problem.

Wenn Sie eine massive Skalierbarkeit benötigen, können Sie jederzeit periphere JVM-Sprachen wie Scala und Clojure nutzen

Dem kann ich nicht zustimmen. Die Verwendung von JVM-Sprachen wie Scala impliziert:

  1. mit spezifischer Laufzeitunterstützung. Auf diese Unterstützung kann direkt von Java-Programmen aus zugegriffen werden.

  2. Spezifische Syntax, mit der präzise Ausdrücke den Zugriff auf die Laufzeitunterstützung vereinfachen und weniger fehleranfällig machen. Dies ist wahr, und das Schreiben in reinem Java ist ausführlicher und erfordert mehr Disziplin, aber die Lücke ist nicht so dramatisch.

Kurz gesagt, Scala verarbeitet Parallelität besser als Java, da das Actor-Modell verwendet wird. Das Akteurmodell kann gut in Java verwendet werden. Es gibt mehrere Akteursbibliotheken für Java, einschließlich Akka (von Scala verwendet). Ein Wechsel zu Scala ist daher nicht unbedingt erforderlich.

Die Verwendung des Actor-Modells über reines Java hat seine eigenen Vorteile:

  • einfacheres Debuggen
  • Möglichkeit, die verwendete Schauspieler-Bibliothek anzupassen. Dies gilt insbesondere dann, wenn die Bibliothek kompakt und damit verständlich ist, wie diese von mir: df4j
Alexei Kaigorodov
quelle