J'ai exploré les nouvelles fonctionnalités du JDK8, comme les expressions lambda, les méthodes d'extension et la nouvelle API de flux.
Évidemment, aucune de ces fonctionnalités n'est nouvelle dans le monde de la programmation et cela a amené à se demander pourquoi toutes ces choses sont en Java jusqu'à présent.
Nous avions des expressions lambda dans Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) et 55 ans après Lisp et pratiquement tout le monde, dans Java (2013).
Et j'avais lu sur les streams dans SIC (1996).
Je me demandais pourquoi maintenant? Les preuves suggèrent que la concurrence avec d'autres langues n'est pas la motivation.
Il semblerait que toutes les nouvelles fonctionnalités intéressantes de cette version de Java ne soient qu'un sous-produit de l'implémentation du parallélisme. Nous avons des lambdas parce qu'ils simplifient l'écriture d'algorithmes parallèles, et nous avons des méthodes d'extension parce que nous en avions besoin pour prendre en charge les changements requis par les expressions lambda, etc., etc.
Donc, ma question est: pouvons-nous affirmer en toute sécurité que le sujet principal de cette prochaine version de Java est en fait le parallélisme? Ou peut-on justifier d'autres raisons de l'apparition des plus anciennes astuces du livre jusqu'à présent en Java?
la source
The evidence suggests
- veuillez partager vos recherches.Réponses:
Lorsque Java a été conçu pour la première fois, il a été jugé approprié de supprimer les fonctions anonymes. Je peux penser à deux raisons (mais elles peuvent être différentes des raisons officielles):
Au cours des années suivantes, comme l'a expliqué Robert Harvey, la politique de Sun a toujours été de maintenir Java rétrocompatible et très stable.
D'autre part, d'autres langages concurrents sont apparus (le plus important étant C #, qui est né comme un clone Java et a ensuite pris sa propre direction de développement).
Les langages concurrents ont mis Java sous pression pour deux raisons:
Puissance expressive
De nouvelles fonctionnalités peuvent rendre certains idiomes de programmation plus faciles à écrire, rendant le langage plus attrayant pour les programmeurs. Normalement, l'ensemble des fonctionnalités fournies par un langage est un compromis entre puissance expressive, complexité du langage, cohérence de conception: l'ajout de fonctionnalités rend un langage plus expressif mais aussi plus complexe et difficile à maîtriser.
Quoi qu'il en soit, au cours des dernières années, les concurrents de Java ont ajouté de nombreuses nouvelles fonctionnalités que Java n'avait pas, et cela peut être considéré comme un avantage.
Engouement
Oui, malheureusement, c'est un facteur de choix technologique, du moins d'après ce que je peux voir dans mon expérience quotidienne en tant que programmeur: un outil doit avoir une certaine fonctionnalité, même si la plupart des membres de l'équipe ne savent pas comment l'utiliser et ceux qui pourraient l'utiliser n'en ont pas besoin la plupart du temps.
Le battage médiatique peut être encore plus important pour les personnes non techniques comme les gestionnaires, qui peuvent être ceux qui décident de la plate-forme pour un certain projet. Les gestionnaires ne se souviennent parfois que de certains mots clés comme lambda, parallélisme, multicœur, programmation fonctionnelle, cloud computing, ... Si notre technologie de choix a une marque verte sur chaque élément de la liste, alors nous sommes à jour.
Donc, l'OMI depuis un certain temps, Java a été pris entre
Finalement, Oracle a décidé de mettre à niveau Java pour le rendre plus compétitif. À mon avis, les nouvelles fonctionnalités s'adressent en particulier aux programmeurs Java qui pourraient être tentés de passer en C # et qui voient d'autres langages comme Scala et Clojure comme trop différents de Java. D'un autre côté, les développeurs qui ont une certaine expérience de la programmation fonctionnelle et qui souhaitent toujours utiliser la JVM sont probablement déjà passés à Scala, Clojure ou à un autre langage.
Ainsi, les nouvelles fonctionnalités de Java 8 rendront Java plus puissant en tant que langage et l'objectif déclaré est la programmation simultanée et parallèle, mais la mise à niveau semble également aborder les aspects marketing (Mark Reinhold, architecte en chef de Java chez Oracle, a déclaré: "Certains dire que l'ajout d'expressions Lambda est juste pour suivre les enfants cool, et il y a du vrai là-dedans, mais la vraie raison est les processeurs multicœurs; la meilleure façon de les gérer est avec Lambda ", voir cet article ).
Donc, oui, de nombreuses (toutes) fonctionnalités Java 8 étaient déjà bien connues, mais pourquoi et quand une fonctionnalité est ajoutée à un langage dépend de nombreux facteurs: public cible, communauté existante, base de code existante, concurrents, marketing, etc.
ÉDITER
Une brève note concernant "... j'avais lu des informations sur les flux dans SIC (1996).": Voulez-vous dire que vous avez besoin de lambdas Java 8 pour implémenter des flux? En fait, vous pouvez les implémenter en utilisant des classes internes anonymes.
la source
Java a changé d'orientation avec le temps. Au début, il a été conçu comme un langage simple et puissant, en réaction à un C ++ «complexe puissant». Certaines fonctionnalités qui étaient en C ++ ont été intentionnellement omises, comme la surcharge des opérateurs, les modèles, les énumérations, qui ont été jugés trop compliqués ou des reliques de l'ère C, et la POO étant au sommet de sa popularité, tout a été transformé en objet en un seul. paradigme vision du monde. Les lambdas à cette époque étaient simplement considérés comme "non nécessaires" depuis l'introduction des classes anonymes / internes dans Java 1.1. Le fait que la syntaxe était beaucoup plus verbeuse était presque considéré comme une caractéristique .
Java ayant trouvé son public, il n'y avait aucune incitation à changer jusqu'à l'introduction par Microsoft de C #, qui a tiré les leçons des erreurs de conception Java et a lancé une série de nouvelles fonctionnalités de langage. Ils n'étaient pas contraints par une compatibilité ascendante. Je pense que les concepteurs Java ont réalisé le danger de la concurrence C # et libèrent Java 5 avec des génériques, des énumérations, etc.
L'inclusion de lambdas dans Java est discutée depuis ce temps et elle n'a été exacerbée que par la tendance actuelle à la programmation fonctionnelle. Mais des choses comme celle-ci sont lentes à s'arranger et il faut que ce soit bien la première fois. À mon avis, les génériques Java bâclés avec effacement de type parce que la compatibilité descendante était considérée comme une raison de l'implémenter comme rien de plus que du sucre syntaxique. Les fermetures ont été pensées de manière plus approfondie, semble-t-il, et ce sera plus que du sucre syntaxique.
En conclusion, quel est le sujet principal de Java 8? Je ne pense pas qu'une version linguistique ait un sujet. En tant que C ++ 11, la raison d'être de Java 8 est de suivre la concurrence en introduisant dans le langage les choses que de plus en plus de programmeurs tiennent pour acquis maintenant. Lisp a peut-être lambda depuis 1958, sa popularité a atteint un plateau depuis des décennies maintenant et ce n'est que récemment que la programmation fonctionnelle a été sérieusement envisagée pour la programmation «grand public» (faute d'un meilleur mot).
la source
Parce que Java doit passer par un processus d'approbation qui implique plusieurs parties prenantes à haute visibilité dans un processus semblable à la «conception par comité», et ce processus prend du temps, c'est tout.
Comparez cela avec d'autres langues et vous trouverez soit un dictateur bienveillant, soit un petit comité de concepteurs linguistiques qui travaillent en étroite collaboration et ne sont pas liés aux intérêts de l'entreprise.
Combinez cela avec une base de code établie de millions de lignes de code Java qui doit rester rétrocompatible, et vous avez tous les ingrédients du changement à un rythme glacial.
la source
Je dirais que l'objectif le plus important d'un langage de programmation est d'être utilisé; actuellement C et Java n'ont pas d'expressions lambda et ce sont les langages les plus utilisés (selon TIOBE par exemple).
Et pour répondre à la question, je crois que Java s'adresse à l'entreprise; dans ce domaine, les choses doivent être très stables et fiables; par exemple, Java 7 est apparu depuis près de 2 ans, mais je ne connais pas directement de projet en Java 7. Une autre chose importante est la compatibilité descendante qui est très importante pour l'entreprise.
la source