Comparaison machines virtuelles Java/C#

Comparaison des caractéristiques de VMs

Cette page présente succinctement l'historique des langages Java et C# de 1995 jusqu'à 2014. Nous détaillerons les fonctionnalités dans les parties suivantes

Compilation d'un programme et execution

La compilation et l'execution des programmes est similaire en Java et en C#



compilation



On voit que la compilation et l'execution est similaire en Java et en C# tout comme la compilation "Just In Time" que nous allons voir:

L'execution "Just In Time" (JIT)

Comme on vient de le voir la compilation s'effectue de la même façon en C# et en Java.
Tout comme l'execution qui se passe de la même façon dans les deux langages

Les VM utilisent la compilation "Just In Time" pendant l'execution.
Au fur et à mesure que la machine virtuelle interprète le code elle le compile en langage machine (Code natif), c'est la fonction du JIT Compiler.
Le code ainsi compilé est gardé en mémoire afin d'être executé plus rapidement lors de la prochaine passe.
Tout le code n'est pas compilé à la première passe (Les blocks de code qui ne sont pas exécuté ne sont pas compilés)


execution

Les Code Intermediaire

Prenons l'exemple simple suivant composé d'une classe BasicProgram contenant une variable entière value, de son accesseur et d'un main créant notre classe principale et modifiant la valeur value.


Pulpit rock



Ce code sera compilé en langage intermédiaire puis désassembler afin de pouvoir visualiser ce code généré
On voit à gauche le code IL C# et a droite le ByteCode Java

intermediateLangage

On voit que le code intermediaire C# est un peu plus verbeux que le code intermediaire Java.
Cela vient du fait que la machine virtuelle C# contient plus d'instruction que la machine virtuelle Java.

Nous allons voir que ces choix fait par les designer des VM sur le code intermediaire ont en fait un interet lors l'optimisation et de l'execution: Le ByteCode Java est moins verbeux permettant une lecture plus rapide qu'avec l'IL du C#, mais le CLR préfère compiler le code dès la première passe

Les Optimisation et profiling

La JVM tout comme le CLR optimisent le code qu'elle execute mais leurs techniques d'optimisations sont toutefois différentes:


Les Types primitifs et les Types génériques


Benchmarks

Tableau comparatifs des vitesses d'execution de plusieurs langages sur des environnement différents:

benchmarks

On remarque une légère avance du .NET sur le Java pour un environnement Windows et inversement sur un environnement Linux (le C++ est quand a lui toujours gagnant puisqu'il est compilé et non interprété)