IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[Langage Alternatif] ThinScript TypeScript et les autres


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut [Langage Alternatif] ThinScript TypeScript et les autres
    Bonjour,

    Je suis de ceux qui pense qu'on ajoute bien trop de choses à EcmaScript et plus qu'un JS++ je préfèrerais un JS--

    Mais je comprends aussi le besoin de langages plus fortement typés, comme le sont Dart ou TypeScript.

    Il y a en général au moins deux points qui font qu'on recherche à changer JS pour ce qu'il n'est pas.
    Le premier, c'est de retrouver l'équivalent de la phase de compilation des langages comme Java ou C pour détecter au plus tôt les erreurs éventuelles. Alors qu'avec un interprète c'est à l'exécution que l'on trouve l'erreur.
    Le deuxième est la notion de classe qui force est de constater est une chose sinon maitrisé tout au moins connue de la grande majorité. Alors que la notion de prototype l'étant beaucoup moins demande une adaptation, voire un apprentissage important. Je pense que l'ajout à EcmaScript de l'opérateur new et du mot clef classe et autre bricole ne fait qu'ajouter de la confusion.

    J'ai donc regardé ce qui se fait pour répondre à cette demande. On peut de suite mettre dans le lot tous les langages compilés qui produisent du JavaScript. Objective-J, Dart, TypeScript, CofeeScript, JavaScript++ ....

    Comme je le disais en début d'article je suis un adepte de JS--. Alors j'ai regardé ce qu'il se faisait pour allier les deux aspects.

    En premier lieu TypeScript dont le compilateur produit du code JS qui au final n'utilise qu'un sous-ensemble de JS (pas de new pas de classes, etc.) le compilateur pour une définition de classe Typescript va produire un prototype JavaScript don la définition est faite dans une closure. Simple propre efficace, sans fioritures.
    Le transtypeur (compilateur) est lui-même écrit en TypeScript et produit donc un JavaScript qui est exécuté par nodeJS. (ou embarqué dans l'application)

    Ensuite non pas un langage, mais un outil : JSweet le but de celui-ci est de proposer un développement web en utilisant un langage grandement enseigné => Java. Il existe pour cela beaucoup de choses, mais nous parlons là de JavaScript. Il ne s'agit donc pas de faire du Web traditionnel comme avec tapestry, Struts et autre JEE tools. Il s'agit de compiler des classes Java en JavaScript.
    JSweet n'est donc pas Java, mais seulement la syntaxe Java pour tout le reste c'est du côté JS qu'il faut chercher. La difficulté est que lorsqu'on développe une application JS on fait appel a quantité d'éléments prédéfinis. Côté client le DOM, les Objets standards que sont Date et Math par exemple... Pour rendre la compilation cohérente, il est nécessaire d'avoir ces références accessibles. De même si on veut pouvoir éditer correctement il nous faut les définitions de ces éléments. JSweet est un projet qui utilise Maven (ce n'est pas obligatoire, mais ça facilite) un grand nombre de librairies ont été packages pour être disponible : les candies.
    Ces Candie ont quelque chose d'intéressant et pas seulement pour JSweet. Le compilateur JSweet se fait en deux étapes. De java vers TypeScript puis TypeScript vers JavaScript. L’avantage est de bénéficier des avancer du compilateur TypScript, mais aussi de sa bibliothèque. Une Candie est un Jar qui contient la définition Java, et TypScript de la librairie. Ainsi on trouve une Candie JQuery qui permet de l'utiliser en JSweet, mais aussi le TS qui va avec. Les Candies sont nombreuses et dans de nombreuses versions. Les jar sont ici http://repository.jsweet.org/artifac...sweet/candies/ par exemple angular-1.5.0-1.1.0-20160525.jar contient angular.d.ts ainsi que le code java correspondant. C’est donc une bonne source pour qui cherche une définition d'une lib JS pour l'utiliser avec TypeScript. L’outil est opérationnel, mais je ne me prononcerais pas sur son usage pour la production.

    Un autre outil autour de TypeScript : typescript-xtext xtext est une techno éclipse destinée à créer des DSL (Domain Specific Language) Le POC, est comme son nom l'indique une démo de faisabilité. xtext est un outils java qui va permette de produire un éditeur éclipse (mais aussi pour d'autres IDE) et un Générateur de code. Ce projet bien qu'incomplet démontre qu'il est possible de créer un compilateur TypeScript to JS en Java. Le projet n'est pas assez avancé pour le rendre utilisable. Il laisse entrevoir une issue pour tous les projets dont la chaine de production passe par Maven ou Gradle et qu'ils n'utilisent pas de gulp, grunt, nodeJS. En effet en étant full Java
    Les outils Maven, Gradle sont autosuffisant.

    Pour finir une approche totalement expérimentale dont l'objectif est autre: WASM. l'idée de WASM, est de proposer un assembleur pour le web. Ce qui permettrait de compiler le langage de son choix vers wasm et donc de l'exécuter sur le navigateur. Dans la construction d'un tel outil c'est posé la question du langage à compiler vers WASM (avant de s'attaquer au langage commun) c'est ainsi qu'est né ThinScript. Ce langage est proche de TypeScript tout comme TypeScript un compilateur a été écrit. Celui-ci écrit en ThinScript produit un compilateur en JavaScript exécutable avec nodeJS. un "exécutable" wasm, mais il produit aussi un source C qui permet d'obtenir un exécutable natif. Autre particularité intéressante est la réponse apportée à l'absence de disponibilité de WASM. l'assembleur du web n'existant que sur de rares plateformes le compilateur sait produit soit du wasm soit du JavaScript. https://evanw.github.io/thinscript/ (choisissez les options du compilateur pour visualiser le résultat) là encore on constate que le JavaScript produit est un sous-ensemble d'EcmaScript (utilisation des closures et prototype).

    Le niveau de maturité des différents projets et très inégal. Mais il semble se dessiner un schéma global.
    L’utilisation de chaine de production rapide et efficace (je pense au code natif ou java) et la production de code utilisant un sous-ensemble de JS.
    La diversité des voies montre bien qu'il y a une place pour d'autres approches. On voit aussi que le lien avec l'existant n'est pas oublié. Je pense que les Candies de JSweet sont une bonne idée dans le principe. (l'outillage pour les produire peut être encore plus ouvert) un repository à la Gradle Maven, etc. contenant pour chaque lib le fichier .js, le fichier .asm ainsi que les définitions pour les imports dans les principaux langages ts, thin, java, dart etc. faciliterait très grandement la création de chaines de productions automatisées. Je pense entre autres aux contraintes qu'impliquent les mélanges que l'on est obligé de mettre en oeuvre sur certains projets. Une application JEE dont le front est fait avec Angular se retrouve confrontée à une dualité gulp et grunt ne savent pas gérer correctement la partie back. Et Maven ne gère que mal la partie front. Du coup on voit beaucoup de projets avec des mix plus ou moins stables.
    Ces différents projets laissent espérer une simplification de ces chaines de production. je pense par exemple à une application dont le front est en Angular2 et le back en C++ un Make pourrait avec une techno similaire au compilateur thin compiler à la fois les classes ts d'angular et les classes C++ du back.
    Dans le même genre, un compilateur en java permettrait à Maven Gradle, etc. de se passer de nodeJS.
    Et on voit bien que tous gardent la possibilité de s'exécuter avec node se qui ouvre encore des portes.

    Pour finir un point qui me parait particulièrement intéressant est la notion de Candie. Cette approche répond à une difficulté rencontrée dans certaines entreprises. Le passage par le proxy. Cela n'a l'air de rien, mais j'ai constaté que ce n'est pas toujours simple de concilier la politique de sécurité et les outils que nous utilisons.
    Généralement la situation qui pose problème est la suivante. Les postes des développeurs n'ont accès à internet qu'au travers d'un proxy dont l'authentification est forte. Du coup les outils php gulp grunt etc. ne parviennent pas à travers. J’ai trouvé ça dans les boites qui ont une tradition Java. En java un repository internet est installé et celui-ci sert de frontal. Lorsque un développeur java à besoin d'un jar il le demande au repository qui au besoin ira sur le net le chercher. Les tenants de la sécurité apprécient cette approche, car elle permet de concentrer le point de contact internet sur le repository. Mais dans nos outils JS il faut invoquer de multiples URL pour obtenir tous les éléments. Les Candie apportent l'approche d'identification qu'un package indépendamment de sa localisation. Ce qui permet de mettre en oeuvre ce principe utilisé en java. Reste que les Candie telles quelles sont insuffisantes. En effet elles contiennent les définitions, mais pas la lib correspondante.
    Aujourd'hui pour mettre en oeuvre un repositiory interne il faut ajouter chaque lib dans chaque version utilisée à la main sur le serveur local. Mais en plus il faut redéfinir les URL pour que grunt gulp etc. s'adresse au serveur interne.

    Après toutes pages que j'ai lues sur le sujet. Je pense que nous ne sommes qu'au début d'un tournant qui ne fait aujourd'hui que se dessiner. Il est bien trop tôt à mon avis pour dire ce qu'il sera.

    A+JYT

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Pavé César Ça pourrait faire l'objet d'un article ou d'un blog post, si tu souhaites plus de visibilité. Ou bien on reste sur une discussion ouverte, comme tu veux.

    Je suis comme toi enthousiasmé par un JS--, sans pour autant que cela soit perçu comme un retour en arrière car il y a plein de bonnes choses à garder en ES6. Ce serait plutôt un JS tronqué par le haut. Je porte beaucoup d'espoir sur WASM, qui une fois largement adopté va faire tomber de nombreuses barrières. Mais en même temps je crains que certains en profitent pour essayer de se débarrasser de HTML et CSS, et jeter à la poubelle 20 ans de progrès en matière de standardisation et d'accessibilité au profit d'effets waouh et de fonctionnalités gadget.

    Pour ma part, question langages alternatifs c'est ClojureScript qui me fait de l'oeil pour mon prochain side-project. A quand ClosureWasm ?

  3. #3
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Comme je le disais précédemment une des difficulté qu'on rencontre en entreprise c'est l'accès du poste développeur à internet.

    pour le résoudre on mets en place un repository interne qui sert de proxy cache. le développeur ne s'adresse donc pas à internet mais au repository interne. il existe bon nombre de techno pour cela.
    généralement soit on a une politique d'approbation et lorsqu'un développeur ne trouve pas le paquet dans la version attendu sur le repository interne il doit en faire la demande au service charger d'approuver les versions. soit la politique est plus souple et le repository interne sert de proxy.

    Dans tout les cas le développeur ne s'adresse qu'au repository interne pour avoir ses paquets.

    Mais voilà qu'avec l'émergence du développement front est apparu d'autres façons de travailler qui sont en contradiction avec cela. en effet on ne demande pas un paquet en l'identifiant de façon unique indépendamment de sa localisation on va invoquer l'url directement.
    • RubyGems / Bundler (Ruby)
    • PIP / PyPI (Python)
    • Packagist / Composer (PHP)
    • NPM (Node.JS)
    • Bower (JS, CSS, HTML)
    • CocoaPods (Objective-C)
    • Maven (Java)
    • Lein (Clojure)

    Je disais plus haut que les Candie était une bonne idée.
    Les personnes travaillant en java sur des war ont eux aussi trouvé une solution qui garanti le passage par le repository interne.
    http://www.webjars.org/
    on trouve sous forme de jar bon nombre d'outils front. plus besoin d'invoquer les urls dans grunt gulp etc...
    la dépendance sur le jar l'importe directement dans le war.

    Mais un jar étant un zip on peut très bien utiliser une dépendance pour en extraire le contenu.

    un simple exemple d'utilisation avec maven
    dans le pom ajouter la dependance
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <property name="bootstrap-version">3.1.0</property>
    ...
    <dependencies>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>${bootstrap-version}</version>
        </dependency>
    </dependencies>
    et dans le code
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <!DOCTYPE html>
    <html>
    <head>
        <title>WebJars Sample</title>
        <link rel='stylesheet' href='webjars/bootstrap/${bootstrap-version}/css/bootstrap.min.css'>

    le repository est divisé en trois parties : les lib classiques, les lib issues de npm, les lib issues de bower.

    A+JYT
    PS: au passage on trouve sur le repos bon nombre de version (dont les anciennes)

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    Mais voilà qu'avec l'émergence du développement front est apparu d'autres façons de travailler qui sont en contradiction avec cela. en effet on ne demande pas un paquet en l'identifiant de façon unique indépendamment de sa localisation on va invoquer l'url directement.
    Ce n'est pas le cas pour NPM et Bower. On a la possibilité d'indiquer une URL mais 99% du temps c'est un identifiant unique qui est utilisé. D'ailleurs NPM est le package manager le plus simple que je connaisse pour s’approprier un identifiant global, ça se fait en une ligne de commande.

    Je te confirme aussi qu'on peut faire des repos internes avec ces technos là pour passer la politique de sécurité. Dans ma boîte on a un NPM et plusieurs repos Maven internes.

  5. #5
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    dans le même ordre d'idée
    http://st-js.github.io/
    qui comme JSweet propose d'utiliser la syntaxe java pour produire du javascript.
    http://st-js.github.io/reference.html#writing

    A+JYT

  6. #6
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    Comme je le disais précédemment une des difficulté qu'on rencontre en entreprise c'est l'accès du poste développeur à internet.

    pour le résoudre on mets en place un repository interne qui sert de proxy cache. le développeur ne s'adresse donc pas à internet mais au repository interne. il existe bon nombre de techno pour cela.
    généralement soit on a une politique d'approbation et lorsqu'un développeur ne trouve pas le paquet dans la version attendu sur le repository interne il doit en faire la demande au service charger d'approuver les versions. soit la politique est plus souple et le repository interne sert de proxy.

    Dans tout les cas le développeur ne s'adresse qu'au repository interne pour avoir ses paquets.
    Ouaip. Ya un vrai problème de mentalité à ce niveau. D'autant que l'accès à un repository interne ne suffit pas forcément. Certains paquets peuvent tout à fait tirer des dépendances depuis github ou le cloud Amazon (ça m'est arrivé plusieurs fois) et dans ce cas c'est le bordel pour faire maj le repo interne.

    Et ça m'arrive aussi régulièrement d'avoir besoin d'aller lire le code, ou tester un patch, j'aime bien pouvoir cloner le repo source qui est 99% du temps sur github mais malheureusement ce n'est souvent pas possible à cause de politiques de sécurité plus que douteuses.

    Bref, sur ce sujet il y a un problème de mentalité chez les admins réseaux. Utiliser un repo maven ou un artifactory ne suffit plus à combler les besoins. Il faut avoir un accès ouvert à internet pour les développeurs front. Il y a trop de dépendances différentes, construites de mille et une manières, quitte à un développer dans une bulle isolée du reste du réseau de l'entreprise et d'avoir une VM sur un autre réseau pour communiquer.

  7. #7
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Ouaip. Ya un vrai problème de mentalité à ce niveau. D'autant que l'accès à un repository interne ne suffit pas forcément. Certains paquets peuvent tout à fait tirer des dépendances depuis github ou le cloud Amazon (ça m'est arrivé plusieurs fois) et dans ce cas c'est le bordel pour faire maj le repo interne.

    Et ça m'arrive aussi régulièrement d'avoir besoin d'aller lire le code, ou tester un patch, j'aime bien pouvoir cloner le repo source qui est 99% du temps sur github mais malheureusement ce n'est souvent pas possible à cause de politiques de sécurité plus que douteuses.

    Bref, sur ce sujet il y a un problème de mentalité chez les admins réseaux. Utiliser un repo maven ou un artifactory ne suffit plus à combler les besoins. Il faut avoir un accès ouvert à internet pour les développeurs front. Il y a trop de dépendances différentes, construites de mille et une manières, quitte à un développer dans une bulle isolée du reste du réseau de l'entreprise et d'avoir une VM sur un autre réseau pour communiquer.
    je ne pense pas que l'ouverture totale soit la solution.
    comme le dit SylvainPV on peut faire des repos internes mais il est vrai que quelques projet pointent directement sur le net on ne sais où
    pas nécessairement sur Gihub

    ce que je constate ces dernier temps c'est qu'il y a des initiatives pour rendre plus simple et plus cohérent l'ensemble de la chaine de production.
    ce que j'aimerais voir arriver c'est un protocole commun aux repos
    RubyGems / Bundler (Ruby)
    PIP / PyPI (Python)
    Packagist / Composer (PHP)
    NPM (Node.JS)
    Bower (JS, CSS, HTML)
    CocoaPods (Objective-C)
    Maven (Java)
    Lein (Clojure)
    etc.

    si on parvenait à avoir une façon commune d'interroger les repos des différents outils on pourrait facilement avoir des projet qui mêlent différente techno mais aussi faire des repos internes qui agrègent de façon maitrisé les différentes source reconnue par l'entreprise.

    A+JYT

Discussions similaires

  1. Le PHP et les autres langages (Java, C++, etc)
    Par Deadern dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2008, 16h03
  2. Swing vs les autres langages
    Par Alec6 dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 14/03/2008, 09h40
  3. jboss - j2ee et les autres langages web
    Par damien77 dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 17/09/2007, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo