Ich habe die neuen Funktionen im JDK8 untersucht, wie die Lambda-Ausdrücke, die Erweiterungsmethoden und die neue Stream-API.
Offensichtlich ist keine dieser Funktionen neu in der Programmierwelt, und das hat mich gefragt, warum all diese Dinge bis jetzt in Java verfügbar sind.
Wir hatten Lambda-Ausdrücke in Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) und 55 Jahre nach Lisp und praktisch alle anderen in Java (2013).
Und ich hatte in SIC (1996) über Streams gelesen .
Ich habe mich gefragt, warum jetzt? Die Beweise legen nahe, dass der Wettbewerb mit anderen Sprachen nicht die Motivation ist.
Es scheint, dass alle coolen neuen Funktionen in dieser Version von Java nur ein Nebenprodukt der Implementierung von Parallelität sind. Wir haben Lambdas, weil sie das Schreiben paralleler Algorithmen vereinfachen, und wir haben Erweiterungsmethoden, weil wir sie brauchten, um die Änderungen zu unterstützen, die Lambda-Ausdrücke usw. usw. benötigen.
Meine Frage lautet also: Können wir mit Sicherheit bestätigen, dass das Hauptthema in dieser kommenden Version von Java tatsächlich Parallelität ist? Oder können wir andere Gründe für das Erscheinen der ältesten Tricks im Buch bis jetzt in Java rechtfertigen?
quelle
The evidence suggests
- Bitte teilen Sie Ihre Forschung.Antworten:
Als Java zum ersten Mal entwickelt wurde, wurde es als angemessen erachtet, anonyme Funktionen wegzulassen. Ich kann mir zwei Gründe vorstellen (aber sie können sich von den offiziellen unterscheiden):
In den folgenden Jahren bestand die Politik von Sun, wie Robert Harvey erklärt hat, immer darin, Java abwärtskompatibel und sehr stabil zu halten.
Auf der anderen Seite sind andere konkurrierende Sprachen entstanden (das wichtigste ist C #, das als Java-Klon geboren wurde und dann seine eigene Entwicklungsrichtung einnahm).
Konkurrierende Sprachen haben Java aus zwei Gründen unter Druck gesetzt:
Ausdruckskraft
Neue Funktionen können das Schreiben bestimmter Programmiersprachen vereinfachen und die Sprache für Programmierer attraktiver machen. Normalerweise ist der Funktionsumfang einer Sprache ein Kompromiss zwischen Ausdruckskraft, Sprachkomplexität und Designkohärenz: Durch Hinzufügen weiterer Funktionen wird eine Sprache ausdrucksvoller, aber auch komplexer und schwieriger zu beherrschen.
Wie auch immer, in den letzten Jahren haben die Konkurrenten von Java viele neue Funktionen hinzugefügt, die Java nicht hatte, und dies kann als Vorteil angesehen werden.
Hype
Ja, leider ist dies ein Faktor bei der Wahl der Technologie, zumindest was ich in meiner täglichen Erfahrung als Programmierer sehen kann: Ein Tool muss eine bestimmte Funktion haben, auch wenn die meisten Mitglieder des Teams nicht wissen, wie man es verwendet und diejenigen, die es benutzen könnten, brauchen es meistens nicht.
Hype kann für nicht technische Leute wie Manager noch wichtiger sein, die möglicherweise die Plattform für ein bestimmtes Projekt bestimmen. Manager erinnern sich manchmal nur an einige Schlüsselwörter wie Lambda, Parallelität, Multicore, funktionale Programmierung, Cloud Computing usw. Wenn unsere Technologie der Wahl auf jedem Element der Liste eine grüne Markierung aufweist, sind wir auf dem neuesten Stand.
IMO ist also seit einiger Zeit zwischen Java gefangen
Schließlich beschloss Oracle, Java zu aktualisieren, um es wettbewerbsfähiger zu machen. Meiner Meinung nach richten sich die neuen Funktionen insbesondere an Java-Programmierer, die möglicherweise versucht sind, auf C # umzusteigen, und die andere Sprachen wie Scala und Clojure als zu unterschiedlich von Java ansehen. Auf der anderen Seite haben Entwickler, die Erfahrung mit funktionaler Programmierung haben und dennoch die JVM verwenden möchten, wahrscheinlich bereits auf Scala, Clojure oder eine andere Sprache umgestellt.
Die neuen Java 8-Funktionen werden Java als Sprache leistungsfähiger machen und der erklärte Fokus liegt auf der gleichzeitigen und parallelen Programmierung, aber das Upgrade scheint auch die Marketingaspekte zu berücksichtigen (Mark Reinhold, Chefarchitekt für Java bei Oracle, sagte: "Einige würden Das Hinzufügen von Lambda-Ausdrücken dient nur dazu, mit den coolen Kids Schritt zu halten, und das stimmt, aber der wahre Grund sind Multicore-Prozessoren. Der beste Weg, mit ihnen umzugehen, ist Lambda "(siehe diesen Artikel ).
Ja, viele (alle) Java 8-Funktionen waren bereits bekannt, aber warum und wann eine Funktion zu einer Sprache hinzugefügt wird, hängt von vielen Faktoren ab: Zielgruppe, vorhandene Community, vorhandene Codebasis, Konkurrenten, Marketing usw.
BEARBEITEN
Ein kurzer Hinweis zu "... ich hatte in SIC (1996) über Streams gelesen.": Meinen Sie, dass Sie Java 8-Lambdas benötigen, um Streams zu implementieren? Tatsächlich können Sie sie mit anonymen inneren Klassen implementieren.
quelle
Java hat mit der Zeit den Fokus geändert. Zunächst wurde es als einfache, leistungsstarke Sprache entwickelt, als Reaktion auf "leistungsstarkes komplexes" C ++. Einige Funktionen, die in C ++ enthalten waren, wurden absichtlich weggelassen, wie das Überladen von Operatoren, Vorlagen, Aufzählungen, die als zu kompliziert angesehen wurden, oder Relikte der C-Ära, und da OOP auf dem Höhepunkt seiner Popularität stand, wurde alles in einem einzigen Objekt zum Objekt gemacht. Paradigmen-Weltanschauung. Lambdas galten zu diesem Zeitpunkt seit Einführung der anonymen / inneren Klassen in Java 1.1 einfach als "nicht benötigt". Die Tatsache, dass die Syntax weitaus ausführlicher war, wurde fast als Merkmal angesehen .
Nachdem Java seine Öffentlichkeit gefunden hatte, gab es keinen Anreiz, Änderungen vorzunehmen, bis Microsoft C # einführte, das aus den Lehren aus Java-Designfehlern lernte und eine Reihe neuer Sprachfunktionen einführte. Sie waren nicht durch Abwärtskompatibilität eingeschränkt. Ich denke, dass Java-Konzeptoren die Gefahr der C # -Wettbewerb erkannt und Java 5 mit Generika, Aufzählungen usw. veröffentlicht haben.
Die Aufnahme von Lambdas in Java wird seit dieser Zeit diskutiert und nur durch den aktuellen Trend zur funktionalen Programmierung verschärft. Aber solche Dinge machen sich nur langsam richtig, und es muss beim ersten Mal richtig sein. Meiner Meinung nach hat Java Generika mit Typlöschung verpfuscht, da die Abwärtskompatibilität als Grund angesehen wurde, sie nur als syntaktischen Zucker zu implementieren. Verschlüsse wurden anscheinend gründlicher ausgearbeitet, und es wird mehr als nur syntaktischer Zucker sein.
Was ist abschließend das Hauptthema von Java 8? Ich glaube nicht, dass eine Sprachversion ein Thema hat. Als C ++ 11 besteht das Ziel von Java 8 darin, mit der Konkurrenz Schritt zu halten, indem in der Sprache die Dinge eingeführt werden, die immer mehr Programmierer für selbstverständlich halten. Lisp hat möglicherweise seit 1958 Lambda, seine Popularität ist seit Jahrzehnten auf einem Plateau und erst kürzlich wurde die funktionale Programmierung ernsthaft für die "Mainstream" -Programmierung in Betracht gezogen (mangels eines besseren Wortes).
quelle
Da Java einen Genehmigungsprozess durchlaufen muss, an dem mehrere Stakeholder mit hoher Sichtbarkeit beteiligt sind, der einem "Design by Committee" ähnelt, und dieser Prozess Zeit braucht, ist das alles.
Wenn Sie dies mit anderen Sprachen vergleichen, finden Sie entweder einen wohlwollenden Diktator oder ein kleines Komitee von Sprachdesignern, die eng zusammenarbeiten und nicht an Unternehmensinteressen gebunden sind.
Kombinieren Sie dies mit einer etablierten Codebasis aus Millionen von Zeilen Java-Code, die abwärtskompatibel bleiben muss, und Sie haben alle Zutaten für Änderungen in einem eiszeitlichen Tempo.
quelle
Ich würde sagen, dass der wichtigste Zweck einer Programmiersprache darin besteht, verwendet zu werden. Derzeit haben C und Java keine Lambda-Ausdrücke und sie sind die am häufigsten verwendeten Sprachen (laut TIOBE zum Beispiel).
Und um die Frage zu beantworten, glaube ich, dass Java an das Unternehmen gerichtet ist; In diesem Bereich müssen die Dinge sehr stabil und zuverlässig sein. Zum Beispiel ist Java 7 seit fast 2 Jahren erschienen, aber ich kenne kein Projekt direkt in Java 7. Ein weiteres wichtiges Element ist die Abwärtskompatibilität, die für das Unternehmen sehr wichtig ist.
quelle