Tout d'abord, une clarification, Java n'est pas entièrement compilé statiquement et lié de la manière C ++. Il est compilé en bytecode, qui est ensuite interprété par une JVM. La machine virtuelle Java peut effectuer une compilation juste à temps dans le langage machine natif, mais n'a pas à le faire.
Plus précisément: je pense que l'interactivité est la principale différence pratique. Puisque tout est interprété, vous pouvez prendre un petit extrait de code, l'analyser et l'exécuter par rapport à l'état actuel de l'environnement. Ainsi, si vous aviez déjà exécuté du code qui initialisait une variable, vous auriez accès à cette variable, etc. Cela se prête vraiment à des choses comme le style fonctionnel.
L'interprétation, cependant, coûte cher, surtout lorsque vous avez un grand système avec beaucoup de références et de contexte. Par définition, c'est du gaspillage car un code identique peut devoir être interprété et optimisé deux fois (bien que la plupart des runtimes aient une mise en cache et des optimisations pour cela). Pourtant, vous payez un coût d'exécution et avez souvent besoin d'un environnement d'exécution. Vous êtes également moins susceptible de voir des optimisations interprocédurales complexes, car à l'heure actuelle, leurs performances ne sont pas suffisamment interactives.
Par conséquent, pour les grands systèmes qui ne changeront pas beaucoup, et pour certaines langues, il est plus logique de tout précompiler et de pré-lier tout, de faire toutes les optimisations que vous pouvez faire. Cela se termine par un runtime très léger qui est déjà optimisé pour la machine cible.
Quant à la génération d'exécutables, cela n'a pas grand-chose à voir avec ça, à mon humble avis. Vous pouvez souvent créer un exécutable à partir d'un langage compilé. Mais vous pouvez également créer un exécutable à partir d'un langage interprété, sauf que l'interpréteur et le runtime sont déjà emballés dans l'exectuable et cachés pour vous. Cela signifie que vous payez généralement les coûts d'exécution (même si je suis sûr que pour certains langages, il existe des moyens de tout traduire en un exécutable d'arbre).
Je ne suis pas d'accord pour dire que toutes les langues pourraient être rendues interactives. Certains langages, comme C, sont tellement liés à la machine et à la structure de liens complète que je ne suis pas sûr que vous puissiez créer une version interactive complète à part entière