まず、説明として、JavaはC ++の方法で完全に静的にコンパイルおよびリンクされていません。これはバイトコードにコンパイルされ、JVMによって解釈されます。JVMは、ネイティブマシン言語へのジャストインタイムのコンパイルを実行できますが、実行する必要はありません。
要点は次のとおりです。インタラクティブ機能が主な実用的な違いだと思います。すべてが解釈されるので、コードの小さな抜粋を取得して、環境の現在の状態に対して解析および実行できます。したがって、変数を初期化するコードをすでに実行している場合は、その変数などにアクセスできます。これは、関数スタイルなどに役立ちます。
ただし、解釈には多くのコストがかかります。特に、参照とコンテキストが多い大規模なシステムの場合はそうです。定義上、同一のコードを2回解釈して最適化する必要がある場合があるため、これは無駄です(ほとんどのランタイムには、キャッシュと最適化がいくつかあります)。それでも、ランタイムコストを支払い、ランタイム環境が必要になることがよくあります。また、現時点ではパフォーマンスが十分にインタラクティブではないため、複雑なプロシージャー間の最適化が見られる可能性も低くなります。
したがって、大きな変更が加えられない大規模なシステム、および特定の言語では、すべてをプリコンパイルおよびプリリンクして、実行できるすべての最適化を行う方が理にかなっています。これにより、ターゲットマシン用に既に最適化された非常にリーンなランタイムが実現します。
実行ファイルを生成することに関しては、それは私見とはほとんど関係ありません。多くの場合、コンパイルされた言語から実行可能ファイルを作成できます。ただし、インタープリターとランタイムがすでに実行可能ファイルにパッケージ化され、ユーザーから隠されている場合を除いて、インタープリター言語から実行可能ファイルを作成することもできます。これは、一般的には依然としてランタイムコストを支払うことを意味します(一部の言語では、すべてをツリーの実行可能ファイルに変換する方法があると確信しています)。
すべての言語をインタラクティブにすることができるとは思わない。Cのような特定の言語はマシンとリンク構造全体に非常に関連しているため、意味のある本格的なインタラクティブバージョンを構築できるかどうかはわかりません。