Was ist der Hauptfokus von Java? Warum dauert es so lange, bis neue Funktionen verfügbar sind?

10

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?

edalorzo
quelle
4
Alles, was daraus werden kann, ist ein Flammenkrieg über Javas Hinter-den-Zeiten-Ness.
Michael K
5
The evidence suggests- Bitte teilen Sie Ihre Forschung.
2
Keine der Funktionen in Java, in der JVM oder in der JRE war jemals neu. Und selbst die Kombination von Funktionen ist nicht neu, Eiffel hatte all diese Funktionen im Jahr 1985 (GC, OO, Typensicherheit, sogar Generika, die Java erst 2003 erhalten hat). In der Tat hat es sehr viel ein erklärtes Ziel der Java gewesen Designer nicht etwas Neues einzuführen.
Jörg W Mittag
2
@ MichaelK - Ich bin damit einverstanden, dass dies zu einem Flammenkrieg werden könnte. Es könnte sich auch zu einer gültigen Antwort auf die herausfordernde Geschichte von Sun entwickeln. Übernahme von Sun und Java durch Oracle; und wie die aktuellen Java-Betreuer versuchen, die Sprache zu steuern. Ich hoffe, dass sich die Antworten auf die konstruktiven Aspekte dieser Frage konzentrieren.
@ MichaelT: Ich hoffe, es wird kein Flammenkrieg und es könnten einige interessante Ideen entstehen. Zum Beispiel nehmen wir oft an, dass eine Sprache, die sich nicht ständig weiterentwickelt, hinter der Zeit liegt. IMO ist dies nicht wahr, da davon ausgegangen wird, dass die Sprachentwicklung linear ist (dass alle neuen Funktionen, die populär werden, gut sind und von allen modernen Sprachen übernommen werden sollten). Die Betreuer einer Sprache könnten jedoch entscheiden, dass eine neue Funktion nicht zum Rest der Sprache passt. Bedenken Sie auch, dass es standardisierte, stabile Sprachen gibt, die definitiv nicht hinter der Zeit liegen (z. B. Common Lisp).
Giorgio

Antworten:

12

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):

  1. Java wurde als objektorientierte Sprache ohne Funktionen entwickelt, daher war es nicht ganz natürlich, anonyme Funktionen in einer Sprache ohne Funktionen zu haben. Zumindest hätte dies das Design der Sprache stark beeinflusst.
  2. Anonyme Funktionen waren in den Programmierergemeinschaften, die Java anziehen sollte, nicht beliebt (C, C ++, Pascal?). Selbst jetzt scheinen viele Java-Programmierer diese Funktionen als ziemlich exotisch zu betrachten (dies wird sich jedoch mit Java 8 wahrscheinlich sehr schnell ändern).

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

  • die ursprüngliche Politik der Sprachstabilität und der Einfachheit des Designs, einerseits eine riesige Codebasis und Entwickler-Community, und
  • der Druck konkurrierender Sprachen, die Java-Programmierer anziehen könnten, zuerst C # und dann Scala, Clojure, F # (ich nenne diejenigen, die mir bekannt sind, es kann andere geben).

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.

Giorgio
quelle
+1 Und ich wünschte, ich könnte Ihnen mehr Punkte geben, da dies die bisher beste Antwort auf die Frage ist.
Edalorzo
Aufgrund Ihrer Antwort habe ich mehr darüber untersucht, was Mark Reinhold gesagt hat, ich habe einen interessanten Artikel gefunden. Ich werde es hier mit Ihrer Antwort als Referenz veröffentlichen: Closures for Java von Mark Reinhold .
Edalorzo
Und dieser Artikel bezieht sich tatsächlich auf diesen anderen Closures for Java .
Edalorzo
1
Über den von Ihnen gesendeten Link habe ich Folgendes gefunden: ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0 . Java kann anonyme innere Klassen verwenden, diese sind jedoch zu ausführlich. Java 8-Closure sind jedoch nicht nur syntaktischer Zucker für anonyme innere Klassen. Jetzt wird Java ZWEI (semantisch) verschiedene Arten von Abschlüssen haben: anonyme innere Klassen und Lambda-Ausdrücke.
Giorgio
11

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).

Cyrille Ka
quelle
"Lisp hat möglicherweise Lambda seit 1958, 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: Die Popularität einer Sprache scheint kein guter Indikator für ihre Wirksamkeit zu sein. Funktionale Programmierung wird seit vielen Jahren befürwortet, aber die meisten Leute in der Branche betrachteten sie als die Art von Dingen, mit denen Forscher gerne spielen, um ihre Doktorarbeit zu schreiben. Jetzt wacht die Branche plötzlich auf und gibt ihr eine Chance, vielleicht weil sie jetzt, da OOP Mainstream ist, nach dem nächsten großen Ding suchen.
Giorgio
1
Der Grund, warum Closures ursprünglich nicht in Java enthalten waren, lautet : Grundlegendes zur Closures-Debatte . Dort sagte James Gossling: "Schließungen wurden anfangs mehr aus Zeitdruck als aus irgendetwas anderem aus Java herausgelassen. In den frühen Tagen von Java war das Fehlen von Schließungen ziemlich schmerzhaft, und so wurden innere Klassen geboren: ein unangenehmer Kompromiss, der zu vermeiden versuchte eine Reihe schwieriger Probleme. Aber wie es bei so vielen Designproblemen üblich ist, haben die Vereinfachungen keine Probleme wirklich gelöst, sondern sie nur verschoben. "
Edalorzo
"Die Aufnahme von Lambdas in Java wird seit dieser Zeit diskutiert und nur durch den aktuellen Trend zur funktionalen Programmierung verschärft.": Ich finde es interessant, dass in einigen Communities (C ++, Java, ...) "die Verwendung von Lambdas" oft bedeutet " funktionale Programmierung durchführen ".
Giorgio
8

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.

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.

Robert Harvey
quelle
1
OTOH, Sie haben auch die Zutaten für wirklich starke und allgemein akzeptierte Standards. Vergleichen Sie zB JPA mit der Situation für PHP, wo jedes Webframework sein eigenes halbherziges ORM hat.
Michael Borgwardt
Ich kann mich irren, aber ich verstehe, dass Haskell auch eine "Design by Committee" -Sprache ist und eine hochmoderne Sprache. Vielleicht ist das nicht das, was Java behindert?
Andres F.
@AndresF. Ja, aber ich stelle mir vor, dass Sie keine großen, monolithischen Unternehmen im Haskell-Komitee haben. Siehe auch das Gespräch in den Kommentaren hier .
Robert Harvey
1

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.

m3th0dman
quelle
Ich stimme Ihnen zu (+1): Ich schätze Java sehr (als Sprache und für sein riesiges Ökosystem), aber ich hätte es besser gefunden, die Sprache in Java 6 einzufrieren. Ich werde mich nicht um das Lernen bemühen Java 7 oder 8, wenn ich nicht dazu gezwungen bin (ein sehr interessantes Projekt, in dem Java 7 oder 8 ein Muss ist), verbringe ich meine Zeit lieber damit, Scala und Clojure zu lernen.
Giorgio