JSweet -- www.jsweet.org Transpiler Java vers JavaScript en passant par TypeScript 1 JSweet: pourquoi et comment? 2 Utiliser des librairies JavaScript… en Java! Serveurs Java Clients JavaScript Java data objects 3 Approche générale: émuler Java guava java.lang Programme Java java.util sdk java…. wrappers TRANSFORMATEUR runtime js Programme JavaScript librairies JS 4 L’approche JSweet jQuery Core JS Programme Java DOM JS Angular underscore Autres libs JS TRANSFORMATEUR Programme JavaScript librairies JS 5 DefinitelyTyped ● ● ● ● > 1500 librairies JavaScript bien typées 6500 pull requests 1680 contributeurs Vers un HTML5 bien typé et des outils plus professionnels 6 Comment ca marche? DefinitelyTyped TS defs JSweet repository Traducteur d’API Jars Java Java 2 TS TS TS 2 JS (tsc) TS defs JS Transpiler 7 Les intérêts de passer par TypeScript ● Un transpiler très léger avec du code propre et lisible (comme TypeScript) ○ Rien à voir avec GWT par exemple... ● Une intégration facile vers TypeScript (génération des définitions) ● Un design robuste (double vérification du programme et des APIs), avec une garantie de compatibilité TypeScript (réversibilité) ● Un support facile des différentes options de génération TypeScript ○ ○ Modules (AMD, UMD, commonjs, …) Versions (ES3 => ES6) ● Au niveau du langage, le mapping de Java vers TypeScript permet de réutiliser les concepts TypeScript, en particulier pour le typage 8 JSweet: mapping TypeScript 9 Principes ● Une API Java minimale pour les types de base (java.lang) ○ ○ Object, String, Boolean, Integer, Number, Throwable, arrays, … java.util.function (partiellement) ● Une API JavaScript (jsweet.lang) ● Passage de l’une à l’autre via: jsweet.util.Globals ○ ○ ○ ○ ○ ○ ○ ● object (jsweet.lang.Object ⇔ java.lang.Object) boolean (jsweet.lang.Boolean ⇔ java.lang.Boolean|boolean) string (jsweet.lang.String ⇔ java.lang.String) number ( jsweet.lang.Number ⇔ java.lang.Integer|java.lang.Double|int|...) array (jsweet.lang.Array<T> ⇔ T[]) function (jsweet.lang.Function ⇔ java.util.function.*) ... Types auxiliaires effacés (@Erased) ou transformés vers TypeScript 10 Structures mappées (extrait) ● ● ● ● ● Modules/namespaces (packages Java) Classes, Interfaces (@Interface), Enums Fonctions et variables globales (Globals), fonctions main Champs, fonctions, constructeurs, initialiseurs Valeurs optionnelles ○ ○ ● ● ● ● champs d’interfaces (@Optional) paramètres de fonctions (overloading) Déclarations (@Ambient) Lambdas Java 8 et pointeurs de fonctions: p-> { … } ⇔ p => { … } Objets: new MyObject {{ b=true; }} ⇔ {b:true} Accès indexés: o.$get(“key”) ⇔ o[“key”] 11 Types mappés (résumé) ● ● ● ● ● ● ● ● Types de bases: object, string, boolean, number Tableaux Types objets Types fonctionnels (lambdas Java 8) Types strings (@StringType et jsweet.util.StringTypes) Types tuples (jsweet.util.tuple.Tuple*) Types unions (jsweet.util.union.Union) Types intersections (comme les unions) 12 Exemples en live http://www.jsweet.org/jsweet-live-sandbox/ 13 Limitations et avantages ● Limitations ○ ○ ○ ○ Pas encore de support des annotations Intersections et unions pas aussi complets Pas de support des APIs Java (système de plugin à venir) Emulation de l’héritage multiple d’interfaces ● Avantages ○ ○ ○ Structure plus contraignante ■ appels de fonctions ■ variables globales ■ any Support possible de ASM.js (int/float vs number) Tooling 14 Demos 15 Contributions ● Angular + Node.js + Socket.io: https://github.com/lgrignon/jsweet-node-example ● Babylon.js: http://ssatguru.appspot.com/babylonjs/Vishva/webapp/index.html 16 En savoir plus: http://www.jsweet.org 17