Primero, una aclaración, Java no está completamente compilado estático y vinculado en la forma C ++. Se compila en bytecode, que luego es interpretado por una JVM. La JVM puede ir y hacer una compilación justo a tiempo para el lenguaje nativo de la máquina, pero no tiene que hacerlo.
Más concretamente: creo que la interactividad es la principal diferencia práctica. Como todo está interpretado, puede tomar un pequeño extracto de código, analizarlo y ejecutarlo contra el estado actual del entorno. Por lo tanto, si ya hubiera ejecutado código que inicializara una variable, tendría acceso a esa variable, etc. Realmente se presta a cosas como el estilo funcional.
Sin embargo, la interpretación cuesta mucho, especialmente cuando tienes un sistema grande con muchas referencias y contexto. Por definición, es un desperdicio porque es posible que deba interpretarse y optimizarse un código idéntico dos veces (aunque la mayoría de los tiempos de ejecución tienen cierto almacenamiento en caché y optimizaciones para eso). Aún así, paga un costo de tiempo de ejecución y, a menudo, necesita un entorno de tiempo de ejecución. También es menos probable que vea optimizaciones complejas entre procedimientos porque en la actualidad su rendimiento no es lo suficientemente interactivo.
Por lo tanto, para sistemas grandes que no van a cambiar mucho, y para ciertos idiomas, tiene más sentido precompilar y vincular todo, hacer todas las optimizaciones que pueda hacer. Esto termina con un tiempo de ejecución muy reducido que ya está optimizado para la máquina de destino.
En cuanto a la generación de ejecutables, eso tiene poco que ver con eso, en mi humilde opinión. A menudo puede crear un ejecutable desde un lenguaje compilado. Pero también puede crear un ejecutable a partir de un lenguaje interpretado, excepto que el intérprete y el tiempo de ejecución ya están empaquetados en el ejecutable y ocultos para usted. Esto significa que generalmente todavía paga los costos de tiempo de ejecución (aunque estoy seguro de que para algunos idiomas hay formas de traducir todo a un árbol ejecutable).
No estoy de acuerdo con que todos los idiomas puedan ser interactivos. Ciertos lenguajes, como C, están tan vinculados a la máquina y a toda la estructura de enlaces que no estoy seguro de que pueda crear una versión interactiva con todas las de la ley.