Outils pour utilisateurs

Outils du site


jvm

Critiques du créateur du JRuby : http://blog.headius.com/2010/06/my-short-list-of-key-missing-jvm.html

Récursion terminale

la JVM, contrairement à .Net, ne gère pas la récursion terminale. Il n'existe pas d'instruction dans le bytecode pour indiquer un appel terminal. Certains langages (comme Scala) optimisent le cas le plus basique et transforment la récursion en une boucle, mais cela est loin d'être suffisant. Pour peu que l'on écrive des fonctions mutuellement récursives, l'erreur de type Stack overflow arrive rapidement.

Par ailleurs, le langage Java n'optimise même pas le cas le plus simple, alors que c'est le langage de la JVM.

Generics

La JVM ne supporte pas les generics, contrairement à .Net. Si une fonction a besoin d'être générique, il faut passer par une variable de type Object, ce qui est comparable au type void* du C. La fonction doit alors effectuer un cast et vérifier le type de son argument, ce qui a un coût non négligeable à l'exécution. Ce que l'on appelle les generics dans le langage Java n'est que du sucre syntaxique : il n'y a aucune différence dans le code compilé. Ce n'est en fait que de la bidouille.

De plus, cette implémentation s'accompagne de restrictions dans le langage. Par exemple, generics et exceptions se marient mal :

It is illegal to define generic types that are directly or indirectly derived from class Throwable.

Avec l'introspection, de nombreuses informations ne sont donc pas disponibles. Ainsi, il n'est pas possible de distinguer une liste d'entiers d'une liste de flottants.

Langages dynamiques

Le support des langages dynamiques dans la JVM est très pauvre. Bien sûr, cela sera fait un jour, mais la JVM a du retard, comme c'est souvent le cas.

http://jcp.org/en/jsr/detail?id=292

jvm.txt · Dernière modification: 2013/05/06 13:23 (modification externe)