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 :

Faut-il migrer de JavaScript vers PureScript ? Oui


Sujet :

JavaScript

  1. #21
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Citation Envoyé par AoCannaille Voir le message
    Avec un langage compilé , toutes les erreurs de syntaxes sont repérées à l'étape de développement, alors qu'avec un langage interprété, certaines peuvent être repérées pendant les TU (éventuellement toutes si les tests couvrent 100% du code), puis certaines peuvent être repérées pendant les tests composants puis certaines peuvent être repérées pendant les tests d'intégration, puis certaines peuvent être repérées pendant les test de validation, et enfin certaines peuvent être repérées en production.

    Là, je ne parle que de syntaxe (genre une typo dans un nom de variable et baaaam undefined reference) et pas d'erreur de typage.

    en ça, d'un point de vue industriel, professionnel, un langage interprété sera toujours inférieur à un langage compilé. Dans le cas particulier du JS, il y a beaucoup trop d'erreur de typages possible provoquant coup sur coup des bugs.
    Si tu veux réduire le nombre de bug dans tes applis ce n'est pas le fait d'avoir du typage statique ou non qui va jouer là dessus.

    Ce n'est pas parce que ton programme compile qu'il :

    - ne provoquera pas de crash à l'exécution
    - est valide fonctionnellement (qu'il satisfait le besoin)

    Pour savoir ça il n'y a qu'une bonne politique de test. Et avec une bonne politique de test tu vas couvrir les problèmes levés par le typage statique dans la foulée. Comment ton test peut-il s'exécuter si tu as un undefined au runtime ? Tu vois ça immédiatement.

    Perso j'ai fait plusieurs années de Java pour passer à du JavaScript et je ne constate pas une hausse du nombre de bugs du à l'absence de typage que ce soit de mon fait ou de celui des autres devs.

    C'est très très rare dans les faits.

    Là où le typage statique est surtout intéressant c'est qu'il documente et clarifie considérablement le code et sa conception. Pour avoir migré des projets de JS vers TS j'ai constaté ça. Ca n'a pas levé de bugs, par contre ça a forcé à clarifier les contrats et donc le code.

    Donc le typage statique a indéniablement un impact sur le cout de la TMA en faisant baisser le brain overloading du développeur parce qu'il force une clarification explicite des entrées / sorties des fonctions.

    Mais ça n'a pas de rapport avec les bugs, ça c'est du ressort des tests automatisés.

    Si tu as des bugs dont la source est l'absence de typage statique, la bonne conclusion ce n'est pas qu'il te faudrait un langage à typage statique mais c'est que tu testes mal ton application. Tu dois voir ces problèmes immédiatement.

    Pour être plus concret si ton commit ne contient les tests qui valident la révision, tu as un problème et ça n'a rien à voir avec la présence ou l'absence de typage statique.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  2. #22
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Points : 808
    Points
    808
    Par défaut
    Tout est dit ^^
    Afin d'obtenir plus facilement de l'aide, n'hésitez pas à poster votre code de carte bancaire

    Mon GitHub

    Une alternative à jQuery, Angular, Vue.js, React, ... ? Testez anticore, en quelques secondes à peine !
    (Contributions bienvenues)

  3. #23
    Membre expert Avatar de air-dex
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 1 655
    Points : 3 783
    Points
    3 783
    Par défaut Au bon endroit au bon moment
    Toujours la même chose avec JavaScript : de nombreuses critiques, mais au final il est et sera toujours là, encore plus vivant que jamais.

    La chance de JavaScript aura été d'être là au bon endroit et au bon moment. Nous sommes au carrefour des années 2000 et 2010. Steve Jobs puis Mozilla ont lancé la chasse aux sorcières consistant à éradiquer les plugins de nos navigateurs Web. Loin de moi l'idée de relancer ces débats là, ce n'est pas le sujet ni mon intention. Toujours est-il que sans Flash, ni Java, ni Silverlight, ni tous les autres, que reste-t-il aux développeurs pour faire du Développement Web côté client ? La réponse est très simple : "JavaScript, et rien que JavaScript". JS a beau être critiqué, toujours est-il que ça reste le seul langage tournant sur nos navigateurs Web et qu'il sera incontournable tant que ça sera le cas.

    Toutes les joyeusetés genre CoffeeScript, TypeScript, PureScript ne font au final qu'écrire du JS à la place du développeur, qui peut ainsi se vanter de ne pas s'être sali les mains avec ça. JS n'est pas aussi cryptique que de l'Assembleur. Faut pas déconner non plus.

    JS ne cédera sa place que lorsque d'autres langages seront interprétés par les navigateurs, ou plutôt massivement interprétés par tous les navigateurs. Google avait commencé quelque chose sur ce plan là avec Dart mais ils étaient seuls et ont échoué.

    Après reste la question de PureScript. Je trouve les arguments foireux :

    - Pourquoi migrer vers PureScript ?
    - Parce que c'est de la programmation fonctionnelle !
    - Pourquoi de la programmation fonctionnelle ?
    - Parce que c'est à la mode !
    En 2020 on aura le même article avec du C++ pour du Web côté client parce que la programmation fonctionnelle c'est "so 2019" et que la POO c'est "so 2020".

    Cela étant je reconnais que le monopole du trio HTML/CSS/JS sur navigateurs est problématique, tant pour les paradigmes de développement " " "backend" " " côté client que pour la conception d'interface.

    Parce que c'est pareil avec la conception d'interface. Le couple HTML/CSS n'est pas non plus ce qui se fait de mieux pour construire des interfaces. Du moins par pour tout le monde.

    Citation Envoyé par Daïmanu Voir le message
    Ma question peut paraître naïve, mais vu qu'à ma connaissance seul le javascript permet de scripter les pages web, peut-être il serait judicieux de permettre au navigateur d'interpréter d'autres langages ?
    À partir du moment ou ce remplaçant sait manipuler le DOM et d'autres APIs, et qu'il tourne dans une sandbox, ça doit être jouable ?
    Ça permettrait de programmer en Typescript, en Python ou autre.
    Et ça serait plus constructif que cet éternel débat sur la valeur du javascript.
    Idée de génie sur le papier, mais comment intègres-tu les langages ?
    • Soit le navigateur le supporte nativement et il n'y a rien à faire.
    • Soit le navigateur ne le supporte pas nativement. Dans ce cas là il te faut étendre le navigateur, donc l'affubler d'un plugin. Or je rappelle que les greffons sur les navigateurs Web c'est tabou depuis le début des années 2010. Donc pas possible.


    Il y aura également la question de qui couvre quoi. Un langage sera supporté par un navigateur mais pas par un autre. Sans parler de l'OS sur lequel tourne ton navigateur, ni des versions des navigateurs (mais ceci tend à disparaître, enfin je pense). Est-ce que les gens ont envie de revenir à "l'époque Flash" pour les greffons, au delà des problèmes de performances, de stabilité et de consommations de ressources ? Je ne pense pas. Est-ce que les développeurs ont envie de revenir à la bonne vieille époque où certaines choses étaient supportées par certains navigateurs et pas par d'autres, avec par exemple des sites qui boguent parce qu'ils utilisent du Python et parce que le navigateur du client ne comprend pas ce qui est écrit entre balises <script type="application/x-python"> ? Qui veut un nouveau VBScript, ou plutôt plein de nouveaux VBScript ?
    "Ils ne savaient pas que c'était impossible alors ils l'ont fait." Mark Twain

    Mon client Twitter Qt cross-platform Windows et Linux. (en cours de développement).

  4. #24
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Si tu veux réduire le nombre de bug dans tes applis ce n'est pas le fait d'avoir du typage statique ou non qui va jouer là dessus.

    Ce n'est pas parce que ton programme compile qu'il :

    - (1) ne provoquera pas de crash à l'exécution
    - (2) est valide fonctionnellement (qu'il satisfait le besoin)
    (1) Si ton système de types te le garantit, et il y en a, tu n'auras pas de crash.

    (2) Si tu as des types dépendants et que tu prends la peine de les utiliser pour spécifier le besoin, tu peux.

  5. #25
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Citation Envoyé par air-dex Voir le message
    Toutes les joyeusetés genre CoffeeScript, TypeScript, PureScript ne font au final qu'écrire du JS à la place du développeur, qui peut ainsi se vanter de ne pas s'être sali les mains avec ça.
    TypeScript n'est pas un langage à part entière, c'est une extension de JavaScript. Il ne peut pas être placé dans la même catégorie que CoffeeScript, PureScript ou Dart qui ont une syntaxe qui leur est propre.

    Citation Envoyé par air-dex Voir le message
    En 2020 on aura le même article avec du C++ pour du Web côté client parce que la programmation fonctionnelle c'est "so 2019" et que la POO c'est "so 2020".
    Ce n'est pas une mode par hasard, c'est une mode parce que ça répond à un besoin. Le dev d'applications web depuis quelques années c'est des Single Page Application. Donc de l'app qui s'exécute dans le browser en restant toujours sur la même page. Du coup gestion de state. Du rajoute à ça l'asynchrone et te retrouves avec un sacré bordel.

    L'immutabilité et l'absence d'effets de bord liés à ce paradigme facilitent considérablement l'écriture d'applications dans ce contexte.

    Regardez l'évolution des outils, on passe de plats de nouilles vers des choses structurées pour permettre facilement le paradigme fonctionnel : Backbone / ... -> AngularJS / Ember / ... -> React / Vue / ...
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Citation Envoyé par KsassPeuk Voir le message
    (1) Si ton système de types te le garantit, et il y en a, tu n'auras pas de crash.
    Que tu obtiennes le crash à la compilation ou lors de l'exécution d'un TU qu'est-ce que ça change ? Tu l'as 2s après avoir écrit le code dans les deux cas.

    Citation Envoyé par KsassPeuk Voir le message
    (2) Si tu as des types dépendants et que tu prends la peine de les utiliser pour spécifier le besoin, tu peux.
    Tu es entrain de dire que l'on peut vérifier la validité d'un programme sans l'exécuter ...
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  7. #27
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Que tu obtiennes le crash à la compilation ou lors de l'exécution d'un TU qu'est-ce que ça change ? Tu l'as 2s après avoir écrit le code dans les deux cas.
    Ça dépend de ton outillage. Mais c'est pas rare que de bons environnements te permettent de voir dès la sauvegarde de ton fichier que tu as fait une connerie avec tes types, c'est encore bien plus rapide que d'avoir à exécuter tes tests (exemple qui me vient en tête en premier, dans je dév en Ocaml avec Merlin, sauvegarder permet de voir le problème immédiatement pour ainsi dire tout le temps, et c'est assez rapide pour ne pas avoir la moindre latence même quand le fichier fait des milliers de lignes).

    Par ailleurs, la production des TUs pour les situations de crash, c'est toujours des TUs en plus que tu pourrais ne pas avoir à écrire.

    Après, je dis pas que l'autre solution est impraticable. Juste que certains systèmes de types te garantissent effectivement l'absence crash for free.


    Citation Envoyé par Marco46 Voir le message
    Tu es entrain de dire que l'on peut vérifier la validité d'un programme sans l'exécuter ...
    Bien sûr, ça existe depuis pas mal d'années déjà, et c'est lié aux méthodes formelles. Il y a diverses manière de faire, ça peut être par un outil externe quand le langage n'est pas directement outillé pour ça (voir par exemple, Spark (Ada), Microsoft VCC (C), EVE Autoproof (Eiffel), KeY (Java), Frama-C (C), et bien d'autres), ou ça peut être fait directement au niveau du langage (F-Star, Coq, Agda, Idris, ...).

  8. #28
    Expert confirmé Avatar de AoCannaille
    Inscrit en
    Juin 2009
    Messages
    1 413
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 1 413
    Points : 4 734
    Points
    4 734
    Par défaut
    Citation Envoyé par Marco46 Voir le message

    Si tu as des bugs dont la source est l'absence de typage statique, la bonne conclusion ce n'est pas qu'il te faudrait un langage à typage statique mais c'est que tu testes mal ton application.
    Citation Envoyé par Marco46 Voir le message
    Que tu obtiennes le crash à la compilation ou lors de l'exécution d'un TU qu'est-ce que ça change ? Tu l'as 2s après avoir écrit le code dans les deux cas.
    Au prix d'une couverture de TU à 100% (comme dit dans mon premier message hein...)
    Peut être que je taffe dans des mauvaises boites, j'aimerais bien vos avis là dessus, mais en pourcentage de projets de plus de 50kloc, combien en avez-vous couvert à 100%?

    Même en avionique on n'y arrive pas forcément! On arrivait à 97% de couverture, les 3autres% étant démontrés mathématiquement comme , le reste de mes projets allant de 20 à 50% de couverture.

    Si là, vous me dites tous en coeur "tous mes projets JS ont une couverture à 100%", je m'incline, pas de soucis. En attendant, même avec 0% de couverture de code, un langage compilé d'aura, pas définition, aucune chance d'avoir un undefined à cause d'une typo dans le nom d'une variable.


    Tu es entrain de dire que l'on peut vérifier la validité d'un programme sans l'exécuter ...
    La validité de type, oui, évidement, c'est une des particularités essentielles des langages fonctionnels type OCaml, Haskell et autre.

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Oui, c'est un vieil article, mais juste pour le LOL, et parce que le JS c'est beau :

    http://sametmax.com/un-gros-troll-de...r-javacscript/

  10. #30
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Citation Envoyé par KsassPeuk Voir le message
    Ça dépend de ton outillage. Mais c'est pas rare que de bons environnements te permettent de voir dès la sauvegarde de ton fichier que tu as fait une connerie avec tes types, c'est encore bien plus rapide que d'avoir à exécuter tes tests
    T'es quand même entrain de me dire que c'est mieux parce que tu gagnes 1 ou 2 secondes, parce que lancer l'exécution du TU concerné et avoir son résultat c'est cet ordre de grandeur hein ... Tu chipoterais pas un peu ?

    T'as même des outils qui s'intègrent à ton EDI qui exécutent les TU correspondant au fichier que tu es entrain de modifier qui te pointent en temps réel pendant que tu codes quelle ligne est en échec sur un TU.

    Donc oui c'est une question d'outillage. Donc est bien d'accord que ça n'a plus aucun rapport avec la présence ou l'absence de typage statique ?

    Citation Envoyé par KsassPeuk Voir le message
    Par ailleurs, la production des TUs pour les situations de crash, c'est toujours des TUs en plus que tu pourrais ne pas avoir à écrire.
    Dans la mesure où je commence par écrire un test avant d'écrire du code cette phrase me pose problème.

    Avant d'écrire du code je détermine ce que j'ai en entrée et ce que je veux en sortie. Et je le documente sous la forme d'un test exécutable.

    Ensuite j'écris mon code. Il n'y a pas à éviter d'écrire un test, ce n'est pas une contrainte.

    Après la nature du test dépend aussi beaucoup de la nature du livrable, si j'écris un outil CLI qui manipule uniquement le filesystem je vais faire du e2e, mais sur un stack web là je vais faire du TU en mockant les I/O.

    Bref.

    Tout ça a manifestement aussi beaucoup de rapport avec la manière de travailler.

    Citation Envoyé par KsassPeuk Voir le message
    Bien sûr, ça existe depuis pas mal d'années déjà, et c'est lié aux méthodes formelles. Il y a diverses manière de faire, ça peut être par un outil externe quand le langage n'est pas directement outillé pour ça (voir par exemple, Spark (Ada), Microsoft VCC (C), EVE Autoproof (Eiffel), KeY (Java), Frama-C (C), et bien d'autres), ou ça peut être fait directement au niveau du langage (F-Star, Coq, Agda, Idris, ...).
    Je pense qu'on se comprend mal, quand je parle d'exécuter le programme je veux dire exécuter le code. Exécuter un TU c'est exécuter le code. Typer ton code ne garanti en aucune façon que son exécution sera correcte fonctionnellement. Un test oui.

    Citation Envoyé par AoCannaille
    Au prix d'une couverture de TU à 100% (comme dit dans mon premier message hein...)
    Pas tout à fait il y a toujours des morceaux qui ne le sont pas selon comment tu calibres ton outil de coverage mais oui et je ne vois pas où est le problème.

    Ça permet au contraire d'aller plus vite. Évidemment il faut avoir assez de pratique pour que ça soit rentable, comme pour tout.

    Citation Envoyé par AoCannaille
    Peut être que je taffe dans des mauvaises boites, j'aimerais bien vos avis là dessus, mais en pourcentage de projets de plus de 50kloc, combien en avez-vous couvert à 100%?
    Ca dépend effectivement de la boite et des pratiques. J'ai eu l'occasion de pouvoir lead et de faire ce que je voulais et on était autour de 80%.

    Citation Envoyé par AoCannaille
    En attendant, même avec 0% de couverture de code, un langage compilé d'aura, pas définition, aucune chance d'avoir un undefined à cause d'une typo dans le nom d'une variable.
    Avec un IDE digne de ce nom tu sauras ça avant même de compiler ou d'exécuter les tests.

    Je parlais plutôt du cas ou tu appelles une variable qui existe, donc spellée correctement mais qui dans ce contexte est undefined ou null. C'est là où le typage statique est intéressant mais tu vas couvrir ce cas avec tes tests, et si tu ne le fais pas avec des tests ça veut dire que tu testes à la main (ce qui est certes la pratique la plus répandue) en lançant ton appli ou pire que tu livres sans tester.

    Citation Envoyé par AoCannaille
    La validité de type, oui, évidement, c'est une des particularités essentielles des langages fonctionnels type OCaml, Haskell et autre.
    Je ne parlais pas de la validité de type mais de la validité du programme par rapport au besoin.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  11. #31
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    T'es quand même entrain de me dire que c'est mieux parce que tu gagnes 1 ou 2 secondes, parce que lancer l'exécution du TU concerné et avoir son résultat c'est cet ordre de grandeur hein ... Tu chipoterais pas un peu ?
    Sur un langage compilé, ça implique potentiellement de recompiler des parties d'un projet juste de pouvoir exécuter les tests (et généralement c'est plus d'une ou deux secondes ...), et plus tu es "haut" dans ton projet plus tu vas potentiellement payer le temps d'exécution du test qui peut être long. Le retypage automatique c'est instantané. Le temps d'attente c'est 0. Mais comme je l'ai dit j'ai pas dit que c'était la seule solution. Par contre, si il y a des gros avantages sur le typage même pour l'absence de crash, voir plus bas.

    Citation Envoyé par Marco46 Voir le message
    Dans la mesure où je commence par écrire un test avant d'écrire du code cette phrase me pose problème.
    Ça dépend ce que concerne le dit test. Avec des tests, on vise la réponse à deux questions :

    - trouver des potentiels crash
    - trouver des potentiels problèmes fonctionnels

    Un test ça montre la présence d'un bug, jamais l'absence de bugs. Tu ne peux pas écrire des tests qui t'apportent la garantie qu'il n'y a pas de crash par exemple parce qu'il faudrait tester exhaustivement, ce qui est irréaliste. Pour la garantie d'absence de crash, un système de type bien foutu garantit l'absence de crash quel que soit le chemin d'exécution parce que c'est pas basé sur du test, c'est de la correction par construction (et généralement c'est basé sur une preuve mathématique, et quand bien même le typeur ne serait pas prouvé, s'il y avait un bug de ce côté, c'est le typeur qu'il faudrait corriger). Dans les faits, on peut effectivement écrire des tests avant de coder, et on s'en servira très probablement pour cibler le deuxième objectif.

    Donc à partir de là tu as deux choix :

    - considérer que si ton test fonctionnel passe tu as aussi de bonnes raisons de penser que tu n'as pas de crash
    - estimer qu'il faut ajouter des tests pour garantir plus finement l'absence de crash.

    Dans le premier cas, le typage statique est meilleur que ton test unitaire (qui ne considère qu'un nombre limité de scénario) parce qu'il donne la garantie pour tout scénario qu'il n'y a pas de crash. Dans le second cas, tu as besoin d'écrire des tests dont tu n'aurais pas eu besoin avec un typage statique (et tu resteras non exhaustif, donc moins bon). En l'occurrence ...

    Citation Envoyé par Marco46 Voir le message
    Ensuite j'écris mon code. Il n'y a pas à éviter d'écrire un test, ce n'est pas une contrainte.
    Si, ce que le langage t'apporte gratuitement par le typage, tu n'as pas à le tester, c'est une perte d'énergie.

    Citation Envoyé par Marco46 Voir le message
    Je pense qu'on se comprend mal, quand je parle d'exécuter le programme je veux dire exécuter le code. Exécuter un TU c'est exécuter le code. Typer ton code ne garanti en aucune façon que son exécution sera correcte fonctionnellement. Un test oui.
    Fait quelques recherches avec les mots clés que j'ai donné. Tu n'es pas obligé d'exécuter un code pour garantir sa correction. Exemple,

    • tu peux développer un programme écrit en langage C
    • le spécifier formellement avec un langage de spécification
    • établir mathématiquement la preuve que le code correspond à la spec (avec un outil comme Frama-C par exemple)
    • compiler ton code avec un compilateur prouvé comme CompCert


    Dans le cas d'un langage comme C, en réalité il est probable que tu aies eu une phase de test par le passé parce que le langage n'est pas outillé pour passer facilement les étapes 2 et 3. Mais une fois que tu arrives à la fin de l'étape 3, tes tests tu t'en fous, t'as une garantie mathématique que le programme est correct. Et un compilateur prouvé te garantit que tu produis un code sémantiquement équivalent à ton code d'entrée.

    Exemple simple pour donner l'idée des étapes 2 et 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    /*@ requires 0 < length;
        requires \valid_read(array + (0 .. length-1));
      
        assigns  \nothing;
     
        behavior in:
          assumes \exists size_t off ; 0 <= off < length && array[off] == element;
          ensures array <= \result < array+length && *\result == element;
     
        behavior notin:
          assumes \forall size_t off ; 0 <= off < length ==> array[off] != element;
          ensures \result == NULL;
     
        disjoint behaviors; complete behaviors; */
    int* search(int* array, size_t length, int element){
      /*@ loop invariant 0 <= i <= length;
          loop invariant \forall size_t j; 0 <= j < i ==> array[j] != element;
          loop assigns i;
          loop variant length-i; */ 
      for(size_t i = 0; i < length; i++)
        if(array[i] == element) return &array[i];
      return NULL;
    }
    Si tu files ce code à un outil de preuve, sans exécuter ton programme, il te dira "oui, ton programme est correct, quelque soit les entrées, tant qu'elles respectent la précondition".

    Ensuite, pour le fait que le typage ne garantit pas la correction fonctionnelle, ça dépend du système de types. Si ton système de types ne permet pas l'expression de propriétés fonctionnelles, effectivement. Mais il y a des systèmes de types qui le permettent, notamment dans les langages à types dépendants (voir la liste que j'ai donné plus haut). Et dans un langage à type dépendants, équipés pour ce genre de tâches, tu écris le programme en même temps que sa preuve. Et comme ils sont généralement super bien outillés pour ce genre de tâches, c'est relativement accessible, et tu n'auras pas à faire de tests pour montrer que le programme fonctionne.

  12. #32
    Membre chevronné

    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2004
    Messages : 758
    Points : 2 084
    Points
    2 084
    Par défaut
    Citation Envoyé par KsassPeuk Voir le message
    - considérer que si ton test fonctionnel passe tu as aussi de bonnes raisons de penser que tu n'as pas de crash
    - estimer qu'il faut ajouter des tests pour garantir plus finement l'absence de crash.

    Dans le premier cas, le typage statique est meilleur que ton test unitaire (qui ne considère qu'un nombre limité de scénario) parce qu'il donne la garantie pour tout scénario qu'il n'y a pas de crash. Dans le second cas, tu as besoin d'écrire des tests dont tu n'aurais pas eu besoin avec un typage statique (et tu resteras non exhaustif, donc moins bon). En l'occurrence ...
    Le typage statique meilleur que des tests (ici en particulier TDD). Ca m'apprendra à manger devant le PC, j'ai faillit m'étouffer.

    Citation Envoyé par AoCannaille Voir le message
    En attendant, même avec 0% de couverture de code, un langage compilé d'aura, pas définition, aucune chance d'avoir un undefined à cause d'une typo dans le nom d'une variable.
    Avec un IDE de ce nom, c'est le cas dans n'importe quel langage. Et encore une fois, ces fameuses erreurs que vous redoutez tant, elles n'arrivent réellement quasiment plus jamais, en JS ou en autre chose.

  13. #33
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Citation Envoyé par blbird Voir le message
    Le typage statique meilleur que des tests (ici en particulier TDD). Ca m'apprendra à manger devant le PC, j'ai faillit m'étouffer.
    Peut être que ce n'était pas clair : pour la partie absence de crash, dans le cadre de l'exécution du test d'absence de problème fonctionnel.

    Après relecture, je vois pas comment ça pouvait ne pas être clair :

    Citation Envoyé par KsassPeuk Voir le message
    - considérer que si ton test fonctionnel passe tu as aussi de bonnes raisons de penser que tu n'as pas de crash
    - estimer qu'il faut ajouter des tests pour garantir plus finement l'absence de crash.

    Dans le premier cas, le typage statique est meilleur que ton test unitaire (qui ne considère qu'un nombre limité de scénario) parce qu'il donne la garantie pour tout scénario qu'il n'y a pas de crash.

  14. #34
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Citation Envoyé par KsassPeuk Voir le message
    Sur un langage compilé, ça implique potentiellement de recompiler des parties d'un projet juste de pouvoir exécuter les tests (et généralement c'est plus d'une ou deux secondes ...), et plus tu es "haut" dans ton projet plus tu vas potentiellement payer le temps d'exécution du test qui peut être long. Le retypage automatique c'est instantané. Le temps d'attente c'est 0.
    Sur JavaScript le temps d'attente pour avoir le résultat est de l'ordre de la seconde.

    Citation Envoyé par KsassPeuk Voir le message
    Un test ça montre la présence d'un bug, jamais l'absence de bugs. Tu ne peux pas écrire des tests qui t'apportent la garantie qu'il n'y a pas de crash par exemple parce qu'il faudrait tester exhaustivement, ce qui est irréaliste.
    Oui évidemment. Je disais juste que tu vas asserter ton fonctionnel. Je ne parlais pas d'absence de bugs dans l'absolu ...

    Citation Envoyé par KsassPeuk Voir le message
    Dans le premier cas, le typage statique est meilleur que ton test unitaire (qui ne considère qu'un nombre limité de scénario) parce qu'il donne la garantie pour tout scénario qu'il n'y a pas de crash. Dans le second cas, tu as besoin d'écrire des tests dont tu n'aurais pas eu besoin avec un typage statique (et tu resteras non exhaustif, donc moins bon). En l'occurrence ...

    [...]

    Si, ce que le langage t'apporte gratuitement par le typage, tu n'as pas à le tester, c'est une perte d'énergie.

    [...]

    Et dans un langage à type dépendants, équipés pour ce genre de tâches, tu écris le programme en même temps que sa preuve. Et comme ils sont généralement super bien outillés pour ce genre de tâches, c'est relativement accessible, et tu n'auras pas à faire de tests pour montrer que le programme fonctionne.
    Du coup il ne s'agit pas de tous les langages à typage statique mais de certains ?

    On est d'accord que ce que tu viens de dire ne s'applique ni au Java ni au C# par exemple ?

    Du coup l'argumentaire d'ensemble tombe à l'eau puisque pour avoir le bénéfice de ce "type" de typage statique qui permet d'éviter du testing il faut utiliser des langages qui ne sont à peu près jamais utilisé par 99% des développeurs qu'ils soient chez des éditeurs ou en SS2I.

    Ça confirme simplement que les tests sont bien plus importants pour diminuer le nombre de bugs que d'avoir du typage statique puisque les fonctionnalités nécessaires ne sont pas présentes dans tous les langages à typage statique.


    Ceci dit, je te remercie pour les infos et l'exemple concret, pas le temps d'analyser maintenant, je ne connais pas ces notions là, mais je me les mets de côté pour plus tard
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  15. #35
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Du coup il ne s'agit pas de tous les langages à typage statique mais de certains ?
    Il faut regarder au cas par cas, les garanties sont légèrement différentes d'un langage à l'autre.

    Citation Envoyé par Marco46 Voir le message
    On est d'accord que ce que tu viens de dire ne s'applique ni au Java ni au C# par exemple ?
    Aucune idée pour le système de types de ces deux là. De mémoire il garantissent l'impossibilité de forger une référence depuis nulle part, mais j'en mettrais pas ma main à couper.

    Citation Envoyé par Marco46 Voir le message
    Du coup l'argumentaire d'ensemble tombe à l'eau puisque pour avoir le bénéfice de ce "type" de typage statique qui permet d'éviter du testing il faut utiliser des langages qui ne sont à peu près jamais utilisé par 99% des développeurs qu'ils soient chez des éditeurs ou en SS2I.
    Je parle de l'avantage d'un système de type dans l'absolu. Il y a pas mal de langages qui entrent progressivement en industrie qui peuvent donner des garanties semblables. Parfois dans une moindre mesure, encore une fois c'est au cas par cas. Une constante malgré tout, il est plus facile de corriger un système de types qui merde que d'écrire des tests qui font le boulot d'un système de types tout le temps.

    Citation Envoyé par Marco46 Voir le message
    Ça confirme simplement que les tests sont bien plus importants pour diminuer le nombre de bugs que d'avoir du typage statique puisque les fonctionnalités nécessaires ne sont pas présentes dans tous les langages à typage statique.
    Pour les propriétés fonctionnelles oui. Pour l'absence de crash, ça va dépendre du système de types. Et il y a aussi la question des interactions à plus large échelle qui peut être plus ou moins difficile à tester. Après j'avais vu passer des études sur l'influence de la taille d'une base de tests pour évolution d'un projet, mais impossible de remettre la main dessus.

  16. #36
    Membre chevronné

    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2004
    Messages : 758
    Points : 2 084
    Points
    2 084
    Par défaut
    Citation Envoyé par KsassPeuk Voir le message
    Peut être que ce n'était pas clair : pour la partie absence de crash, dans le cadre de l'exécution du test d'absence de problème fonctionnel.
    Et moi je ne vois pas comment tu peux comparer des tests TDD unitaires à un simple système de typage statique...

    Dans un cas tu ne vérifies que le type à la compilation, dans l'autre tu peux vérifier le contenu, l'existence, les limites, et même si tu as besoin comparer à d'autres valeurs, tout dépend de tes contrats. Rien à voir en fait.

    Un typage statique ne ta sauvera pas non plus à la connexion à des données externes asynchrones dont le contenu t'arrive forcément de manière dynamique et que tu ne maitrise pas souvent, ces cas sont monnaie courant maintenant. Pourtant tout le monde y arrive, et sans typage statique... Incroyable. Il faut juste respecter le contrat et ses évolutions.

  17. #37
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2016
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 223
    Points : 561
    Points
    561
    Par défaut
    Citation Envoyé par shenron42 Voir le message
    Oui, c'est un vieil article, mais juste pour le LOL, et parce que le JS c'est beau :

    http://sametmax.com/un-gros-troll-de...r-javacscript/
    comme c'est le status quo, c'est toujour valable bon je sort j'ai des bugs à corriger sur des parseInt ^ ^

  18. #38
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par blbird Voir le message
    Et moi je ne vois pas comment tu peux comparer des tests TDD unitaires à un simple système de typage statique...

    Dans un cas tu ne vérifies que le type à la compilation, dans l'autre tu peux vérifier le contenu, l'existence, les limites, et même si tu as besoin comparer à d'autres valeurs, tout dépend de tes contrats. Rien à voir en fait.

    Un typage statique ne ta sauvera pas non plus à la connexion à des données externes asynchrones dont le contenu t'arrive forcément de manière dynamique et que tu ne maitrise pas souvent, ces cas sont monnaie courant maintenant. Pourtant tout le monde y arrive, et sans typage statique... Incroyable. Il faut juste respecter le contrat et ses évolutions.
    KsassPeuk a raison : les langages fonctionnels à typage fort, comme purescript ou elm, apportent des garanties sur la cohérence des types, la gestion des erreurs, les data asynchrones, etc, qu'un langage "classique", même avec des tests unitaires ou un IDE performant, ne peut pas apporter. Il y a de nombreux travaux, articles et présentations à ce sujet,

    https://hackernoon.com/error-handlin...lm-7ffaf9ff3f8


  19. #39
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2016
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 223
    Points : 561
    Points
    561
    Par défaut
    bein tout ce que j'ai trouvé se résume à

    Async Failures

    When making HTTP requests those requests can ultimately fail for a variety of reasons. With Javascript you’ll pass a success callback to handle successful responses and there’s an optional failure callback to handle failures.

    Elm is different. Rather than exposing an optional failure callback you’ll instead be asked to provide a callback that accepts a Result (the same specialized either type discussed above) as input and that callback returns a Message that will likely be different depending on the Result.

    What this means is async errors have to be explicitly handled, as opposed to being accidentally forgotten.
    je vais pas me fouetter pour si peu, la conclusion est explicite

    I find handling error situations in Elm to be a rather pleasant experience. Elm will force you to handle errors essentially by leveraging the type system which is great both in its simplicity and the resulting developer experience.

  20. #40
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Un pattern assez générique pour garantir la safety par le typage :

    - pour tout ce qui est prévisible, garantir que le développeur ne peut pas créer les comportements problématiques,
    - pour tout ce qui est imprévisible, créer des chemins d'erreur que le développeur ne peut pas ignorer en le forçant à traiter une donnée qui est dans un type qu'il ne peut pas directement manipuler.

Discussions similaires

  1. Faut il migrer de Java vers Kotlin ?
    Par young077 dans le forum Kotlin
    Réponses: 26
    Dernier message: 21/11/2018, 11h59
  2. [Prototype] Faut-il migrer vers Prototype UI ?
    Par guy on luck dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 26/10/2009, 09h38
  3. [PHP-JS] lien javascript vers php
    Par guttts dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/08/2005, 23h00
  4. Migrer de MySQL vers PostgreSQL
    Par Acti dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 25/02/2005, 14h20
  5. Migrer de kmail vers Thunderbird
    Par calfater dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 13/07/2004, 14h23

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