Developpez.com

Le Club des Développeurs et IT Pro

Java : le projet Kulla approuvé

Il permettra de doter la plateforme d'un interpréteur boucle : lecture - évaluation - impression (REPL)

Le 2014-09-04 18:25:06, par Hinault Romaric, Responsable .NET
Mise à jour du 02/10/2014 : le projet Kulla approuvé

Le JDK sera doté dans une version future de fonctionnalités REPL (Read Evaluate Print Loop). Après un vote qui a eu lieu le 15 septembre dernier, le projet Kulla a été adopté par 14 voix pour, contre 0 vote négatif et aucun veto.

La JEP (JDK Enhancement Proposal) du projet est déjà disponible en ligne. Elle servira de feuille de route pour son développement. Elle décrit notamment les objectifs du projet, les motivations, les alternatives, les risques, etc.

Dans ce document, on apprend que la rétroaction immédiate qu’apportera ce projet est importante lors de l’apprentissage d’un langage de programmation. En raison de cette omission, de nombreuses écoles se sont éloignées de Java pour adopter des langages comme Python, qui disposent d’un REPL.

Selon la JEP du projet, ces fonctionnalités feront partie du JDK 9.

Consulter la JEP du projet

Maj de Hinault Romaric

La plateforme Java pourrait dans le futur être dotée de fonctionnalités REPL (Read Evaluate Print Loop) comme pour le langage de programmation LISP.

Les développeurs d’OpenJDK, la déclinaison open source de Java, étudient la possibilité d’ajouter officiellement l’outil au langage de programmation.

La discussion est effectuée dans le cadre du projet Kulla, qui a vu le jour le 27 août dernier. La mise en œuvre d’un tel programme permettra une programmation interactive, de telle sorte que tout ce qui entre au clavier est systématiquement évalué.

Avec ce mode de fonctionnement basé sur une boucle : lecture - évaluation – impression (REPL), l'interpréteur :

  • R : lit une expression ;
  • E : évalue (calcule le résultat de) cette expression ;
  • P : imprime sur la sortie standard le résultat de l'évaluation ;
  • L : recommence en R.


« Du point de vue du développeur, il est agréable d’être en mesure d’interagir avec le code pendant son exécution en temps réel, sans avoir à recompiler/redéployer », soutient Michael Facemire, analyste chez Forrester.

REPL est déjà implémenté dans la plupart des langages dynamiques et fonctionnels, y compris Scala et Clojure. Une implémentation pour Java existe même déjà en ligne sur GitHub. Cependant, Martin Odersky, fondateur de Scala, voit des limites à l’utilisation de REPL dans Java.

« Le problème avec Java est que c’est un langage fondamentalement orienté déclaration. Vous écrivez une déclaration, et c’est lorsqu’elle s’exécute qu’elle a un effet. REPL en revanche est orienté expression. Vous écrivez une expression et REPL montre le résultat, un peu comme une calculatrice », explique Martin Odersky, qui estime que REPL ne sera pas aussi utile avec Java que pour un langage orienté expression.

Le vote pour le projet va débuter le 10 septembre prochain. S’il est approuvé, le code cloné à partir de JDK9 sera utilisé pour créer l’outil.

Source : OpenJDK

Et vous ?

Que pensez-vous de ce projet ? REPL est-il utile pour le langage Java ?
  Discussion forum
68 commentaires
  • adiGuba
    Expert éminent sénior
    Envoyé par sekaijin
    la JSR-223, Scripting for the Java Platform permet de changer de langage
    jjs utilise le moteur Nashorn intégré au JDK, donc cela n'exécute pas du Java mais du JavaScript...

    Donc l'objectif de cette JEP c'est de proposer la même chose en Java...

    a++
  • yahiko
    Rédacteur/Modérateur
    Cet outil donne une vision un peu erronée de la structure et de la logique d'un programme Java. Pas certain que le but pédagogique soit bien atteint avec une telle approche.
  • Lacunasaurus
    Membre régulier
    La prise en charge de REPL est l’une des fonctionnalités les plus attendues de Java 9
    Plus que le projet Jigsaw, l'api Json, et autres ?

    Personnellement, sans vouloir critiquer négativement cet ajout qui reste bon à prendre, je ne vois pas trop ce que ça va apporter en plus à part à ne pas à avoir à lancer un IDE pour pouvoir tester en live 3 ligne de codes.

    Tant d'énergie dépensée pour séduire des débutants qui n'en seront pas moins performant en java en ayant commencé (et continué) sur un langage permettant une plus grande facilité de compréhension de la programmation.

    Ça me donne l'image d'un vendeur de produit qui va faire les sorties d'écoles afin de rendre le plus tôt possible accro à sa marque...

    Pendant ce temps Microsoft sort son IDE phare en gratuit avec un émulateur Android et des fonctionnalités web qui semble (sur le papier) géniales,
    Google prévois un langage spécifique à Android et le support de Dart pour cette dernière plateforme histoire de ne plus être dépendant d'Oracle (sans compter les X langages et frameworks avant-gardistes),
    Php améliore ses performances,
    Javascript permet de faire des applications robustes aussi bien en client qu'en serveur....

    Bref si oracle veut prendre la place des langages débutants, autant qu'ils le fasse en améliorant le langage, ses fonctionnalités, son accèssiblité, sa pérennité (cf: google et android) ... pas en lachant un shell qui sera utilisé pendant 4 heures par les débutant avant de lancer un éclipse, netbeans, intellij, etc...
  • Cyäegha
    Membre régulier
    Pour ma part, en Scala, je n'utilise guère le REPL, mais j'utilise bien les worksheets proposées par le plugin Scala pour Intellij IDEA (il y a la même chose dans le plugin pour Eclipse), qui ont grosso modo la même utilité, mais en plus flexible (on peut modifier les expressions déjà entrées, et écrire des expressions sur plusieurs lignes sans se poser de questions). Si Java se dote d'un REPL, on verra peut-être aussi arriver des worksheets dans les IDE.

    Quand à l'intérêt de ce genre de choses, j'en vois deux (par rapport à faire la même chose dans un main en Java) :
    - on n'a pas besoin d'ajouter des logs ou de débugger pour voir immédiatement la valeur d'une expression
    - l'exécution est immédiate, le cycle compilation/exécution est masqué
    Ça ne parait peut-être pas beaucoup à première vue, mais ça fait gagner un peu de temps quand on expérimente ou test de nouvelles choses, et surtout, ça fait paraitre ce genre d'expérimentation plus "naturelle" (pour moi en tous cas).
  • Cyäegha
    Membre régulier
    Envoyé par thelvin
    Si on veut du typage dynamique et qu'on "aime bien des trucs de Java" il y a plusieurs solutions :
    - Langages de scripts basés sur une JVM et ayant donc accès aux classes Java, mais qui ne sont pas le langage Java lui-même : Groovy, Scala, Clojure, etc.
    - Faire du Java d'habitude et déléguer ce qu'on aimerait faire en langage de script, à un langage de script : JavaScript, Python, autre...
    Scala est typé statiquement. Accessoirement, je connais peu de monde qui le présenterait comme un "langage de script". On peut faire du scripting avec si on en a vraiment envie, mais ça n'est pas franchement l'utilisation prépondérante...

    Envoyé par sekaijin
    si j'ai bien compris il s'agit de faire un truc à la jline
    Non. Jline est une librairie pour faciliter l'écriture d'applications présentant une interface en ligne de commande, dans laquelle on va entrer des commandes spécifiques à l'application en question. Son but n'est pas d'interpréter du code Java.

    Envoyé par sekaijin
    je ne saisi pas bien le but du projet
    Le but est de doter le langage JAVA d'un REPL, ni plus, ni moins. Si tu es familier avec jjs, tu connais le principe ; sauf que jjs sert à exécuter du javascript (sur le moteur Nashorn), et qu'on parle ici d'exécuter du java.
    Quand à l'utilité d'un REPL (s'il est bien conçu), je vois au moins quatre raisons (mais il y en a surement d'autres) :
    - Pour un débutant, c'est une façon plus immédiate de découvrir la syntaxe d'un langage que de passer explicitement par les étapes d'écriture dans un fichier source/compilation/exécution. Le feedback est plus rapide.
    - Si on a dans le classpath du REPL les classes du projet sur lequel on est en train de travailler*, on peut appeler des méthodes pour les tester de façon interactive : c'est un outil de debugging supplémentaire.
    - Pendant le développement, c'est utile pour expérimenter des bouts de code rapidement - c'est une façon instantanée de faire du prototypage (à petite échelle, s'entend).
    - Quand on répond à une question sur StackOverflow et qu'on a une ou deux lignes de code d'exemple à ajouter, c'est bien pratique pour vérifier rapidement qu'on n'a pas fais d'erreur de syntaxe. Bon, OK, ce n'est pas le cas d'utilisation le plus important...

    * : Ça peut être facilité par l'outil de build utilisé - c'est le cas avec SBT en Scala par exemple, et ça arrivera surement aussi en Java.
  • adiGuba
    Expert éminent sénior
    Envoyé par sekaijin
    je maistrise suffisement JS pour le savoir
    mais là dans JJS il s'agit de manipuler des objet Java de la JVM
    il s'agit d'instance de classe java.
    Oui il s'agit d'instance de classe Java manipulé en JavaScript.
    C'est une des fonctionnalité du moteur Nashorn...

    Et ?
    Ca ne change rien au fait que le language soit du JavaScript... pas du Java.

    Et je ne vois toujours pas le problème à proposer deux "REPL" pour deux langages distinct.

    a++
  • professeur shadoko
    Membre chevronné
    Envoyé par Battant

    J'ai compris que vous êtes septique face à python mais alors pourquoi ne pas inclure les points avantageux de python dans open jdk 7 ?
    C'est quoi py4j ?
    eh eh j'aime le "septique" c'est effectivement pour des raisons d'hygiène que je tiens Python à distance ....
    py4J est un canevas de code qui permet la communication entre du code Python et du code Java: j'ai bien aimé l'idée de principe mais j'ai pas expérimenté ... je pourrais être déçu
  • sekaijin
    Expert éminent
    Je ne comprends toujours pas

    que fais de plus ce projet qu'on n'a pas déjà dans la JVM en standard

    Aujourd'hui sans ce projet je lance une JVM
    j'ai un prompt
    je tappe une commande
    j'obtient une réponse
    je tape une autre commande
    j'ai une autre réponse
    etc.
    Code :
    1
    2
    3
    jjs> var date = Date()
    jjs> "Date and time: ${date}"
    Date and time: Mon Aug 19 2013 19:43:08 GMT+0400 (MSK)
    dans ces commande je peux créer des objets appeler des méthode voir des attributs
    faire des loops des ifs des switchs
    la JSR-223, Scripting for the Java Platform permet de changer de langage

    Qu'apporte de plus ce projet ?

    A+JYT
  • sekaijin
    Expert éminent
    Envoyé par Cyäegha
    Le but est de doter le langage JAVA d'un REPL, ni plus, ni moins. Si tu es familier avec jjs, tu connais le principe ; sauf que jjs sert à exécuter du javascript (sur le moteur Nashorn), et qu'on parle ici d'exécuter du java.
    Quand à l'utilité d'un REPL (s'il est bien conçu), je vois au moins quatre raisons (mais il y en a surement d'autres) :
    - Pour un débutant, c'est une façon plus immédiate de découvrir la syntaxe d'un langage que de passer explicitement par les étapes d'écriture dans un fichier source/compilation/exécution. Le feedback est plus rapide.
    quoi qu'il arrive si on peut taper à l'interface du java vu que java est conçu pour être compiler il faudra faire quelques concessions. Je ne suis pas sur que ce soit la meilleure solution pour un débutant.
    Envoyé par Cyäegha
    - Si on a dans le classpath du REPL les classes du projet sur lequel on est en train de travailler*, on peut appeler des méthodes pour les tester de façon interactive : c'est un outil de debugging supplémentaire.
    On peut très bien faire ça avec jjs invoquer les méthode des objets du projet instancier des classes tester in situ.
    Envoyé par Cyäegha
    - Pendant le développement, c'est utile pour expérimenter des bouts de code rapidement - c'est une façon instantanée de faire du prototypage (à petite échelle, s'entend).
    La aussi on peut très bien faire ça avec jjsi la seul chose qu'on ne peut pas faire c'est créer des classes. (enfin c'est compliqué)
    Soit le REPL utilise la syntaxe Java pure et il n'est pas possible d'ajouter dynamiquement des méthodes donc on en revient à ce que fait aujourd'hui jjs (à la syntaxe près)
    soit le REPL permet d'injecter et de modifier des méthodes dynamiquement est on n'a plus la syntaxe Java pure. le projet perds donc sont intérêt puisque d'autre langage de la jvm savent le faire aujourd'hui et le scripting langage framework permet de faire un REPL avec l'un d'entre eux.
    Envoyé par Cyäegha
    - Quand on répond à une question sur StackOverflow et qu'on a une ou deux lignes de code d'exemple à ajouter, c'est bien pratique pour vérifier rapidement qu'on n'a pas fais d'erreur de syntaxe. Bon, OK, ce n'est pas le cas d'utilisation le plus important...

    * : Ça peut être facilité par l'outil de build utilisé - c'est le cas avec SBT en Scala par exemple, et ça arrivera surement aussi en Java.
    Je ne suis toujours pas convaincu.
    Pourquoi pas.
    Mais je pense qu'il y a bien des choses à améliorer dans Java.

    A+JYT
  • OPi
    Membre actif
    Envoyé par sazearte
    Python […] langage non typé
    Python est fortement typé, mais typé dynamiquement.