Les bons élèves et les cancres du typage dynamique
- On a beaucoup parlé typage dynamique ces derniers temps
- On a vu que certains langages annoncaient un typage fort mais ça ne les empêchait pas de faire n'importe quoi, y compris des erreurs de calcul.
- Oui, et quelques langages arrivent quand même à mieux contrôler les types à l'exécution malgré ce typage dynamique.
- Alors c'est quoi la conclusion ?
- Ma conclusion, c'est que j'ai essayé d'exécuter le même petit script avec un max de ces langages.
- Et donc ?
- Et donc ça m'a permis de faire un tri entre les bons élèves 🥇 et les cancres 💩.
- Un max de langages, ça en fait combien ?
- Je ne sais pas. Le code est dans ce repo git. Tu les compteras.
- Tout ou rien. C'est radical comme classification.
- En fait il y a des inclassables, comme Erlang, mais on ne va pas s'attarder dessus. A l'exécution, il ne vérifie rien mais, avec les outils adaptés, on a une vérification en amont très proche du typage statique.
- Mais tous les autres ont les mêmes comportements que l'on a déjà vu ?
- Non, on a aussi PHP qui est un cas étonnant. Quand un paramètre de fonction est déclaré comme entier, il peut lever une erreur en cas d'arrondi implicite lors de l'appel de la fonction.
1Fatal error: Uncaught ErrorException: Implicit conversion from float 47.99999999999999 to int loses precision in /app/pgcd.php:10
2Stack trace:
3#0 /app/pgcd.php(10): {closure}(8192, 'Implicit conver...', '/app/pgcd.php', 10)
4#1 /app/pgcd.php(18): pgcd(48.0, 18.0)
5#2 /app/pgcd.php(23): affiche_pgcd(48.0, 18.0)
6#3 {main}
7 thrown in /app/pgcd.php on line 10
- Ok alors quels sont les langages qui vérifient le type à l'exécution des appels de fonction comme on l'a déjà vu pour C#, Dart et Groovy.
- Bah c'est C#, Dart et Groovy.
- Super. Tous les autres font l'erreur de calcul que l'on a vue en Python ?
- Ouais c'est assez courant. On a une ribambelle 🧵 de cancres : Python, Ruby, TypeScript, JavaScript, Lua, R... Tous produisent exactement le même résultat
PGCD(48,18) = 6
PGCD(48.0,18.0) = 6.0
PGCD(48.0+0.3-0.1-0.2,18.0) = 7.105427357601002e-15
- Donc en fait, là, ce que tu es en train de dire, c'est que les langages les plus utilisés aujourd'hui dans le web, sont tes cancres du typage dynamique ? 🤯
- C'est pas moi qui le dit, c'est le code.
- Et tes bons élèves ce sont 2 langages, associés à Microsoft et Google, et qui peinent à convaincre au delà de leur base. Et un 3ème que personne ou presque n'utilise sur la JVM vu qu'il n'est même pas dans le top 50 du TIOBE Index ? Tu expliques ça comment ?
- Le système de typage n'est qu'un aspect. Les cancres ont probablement d'autres qualités.
- Mais ces erreurs sur les types devraient les pénaliser, non ?
- J'ai deux hypothèses. La première, c'est que les gens se croient trop souvent plus futés que leur code 🧠. Les erreurs de typage, c'est chez les autres.
- C'est vrai pour certaines personnes mais ça n'expliquerait pas tout.
- La deuxième hypothèse : les gens pensent que le typage c'est un détail. Avec des langages qui imposent peu de contraintes, ils voient leur code rapidement fonctionner et ils sous-estiment les erreurs qui s'y cachent. 🙈
- Donc tes deux hypothèses, c'est que les bugs ont le plus souvent leur origine entre la chaise 🪑 et le clavier ⌨️ ?
- Et les gens n'envisagent pas le langage comme un allié 💪 qui permet d'écrire moins de bugs. Ce n'est pas qu'un outil que l'on voudrait le moins contraignant ⛓️ possible.
- Ça fera une bonne conclusion.