Attention, pour analyser le problème de façon objective, il faut distinguer les langages "compilés", "interprétés" et les mixtes, souvent assimilés à tort aux langages interprétés.
C'est un sujet très vaste, je vais essayer de limiter mon analyes le + possible, mais...
La compilation est le fait de traduire un code écrit ou généré dans un langage en un code "fonctionellement" équivalant dans un autre langage, souvent de plus bas niveau.
En particulier, on appèle très souvent "langage compilé" un langage dont le code source (lisible parl'humain) en code machine (binaire et directement exécutable). Le code distribué, vendu (etc...) est déja pret à être exécuté. C'est par exemple le cas des langages C, C++, fortran,...
L'avantage est une haute performance du code (le code peut être envoyé de ma mémoire au processeur généralement sans conversion logicielle). par exemple, les codes destinés à des logiciels à haut besoins de performance (systèmes d'exploitation, bases de donnée à haut rendement comme Oracle, SQL Server, DB2 et tant d'autres, il y a encore peu de temps les jeux vidéo...) sont généralement écrits (directement ou non) en C ou C++).
C'est historiquement le premier mode de programmaation de "haut" niveau.
L'interprétation consiste à "compiler" les instructions au momment de l'exécution (c'est le cas de lisp, scheme, prolog,... ainsi que les shells unix/dos et autres).
l'inconvénient est biensur le coût de la compilation au dernier momment.
De plus, les versions finales des codes compilés le sont avec des options qui augmente le niveau d'optimisation du code au prix d'un temps de compilation significativement plus long (en compilant à l'exécution, ce temps devient très pénalisant, faisant perdre l'intérêt de l'optimisation).
Ajoutons que pour optimiser le code généré, les compilateurs utilisent des systèmes de factorisations et réorganisations d'instructions. Plus on interprête "ligne à ligne" plus ce concept devient inapplicable.
Enfin, des enjeux industriels et commerciaux sont quasi-incompatibles avec le code inteprété: la protection de propriété intéllectuelle (est algos en particulier) est biensur une notion des plus abstraite : le code est lisible! et en plus, comme il est lisible il est facile à modifier induement (crackage des protections logicielles...)
Maintenant : les aventages :
* indispensable aux interpréteurs de commandes comme les shells (et aux macros office & co, à mediter!).
* Permet la génération dynamique du code et l'autogénération, très voir extrèmement hardus avec les langages compilés.
* L'interpréteur, de plus haut niveau que le code, peut gérér des tâches comme l'allocatio, la désallocation, la refflexion...
Passons enfin aux langages "à la mode", les langages de dernière génération, Je parle biensur de Jave et des langages .NET:
L'idée de Sun dans les années 90 (sortie du JKD1.0 en 1995) puis de Microsoft (sortie du framework 1.0 en 2002) est, à mon sens, des plus intéressante :
* la compilation du code vers un langage binaire (langage machine ou assimilé) est indispensable à des performances acceptables
* le ratio complexité des programmes/moyens consentis pour les développer va toujours croissant. => besoin de simplifiet le code, en se débarassant notament de la gestion memoire
* sur les programmes complexes, la gestion mémoire nécessite de Très gros efforts, la moindre désallocation oubliée pouvant mettre le système en péril. => sécurité d'une récupération mémoire par garbage collector
* avec les langages compilés, on optimise a fond pour 1 ou quelques plateformes cibles et on assure ma compatibilité du code avec des temps de réponses supposs acceptables pour les autres => besoin de terminer les DERINERES phases de la compillation par les machines cibles, "les seules à savoir quels optimisations leurs sont les plus adaptées "
* les machines cibles, de plus en plus performantes, peuvent encaisser le coût CPU d'une compilation "just in time", si celle ci est linéaire (le bytecode java et le M.S.I.L. .NET sont des langages équivalents à du code assemblé (1 instruction = 4 octets), la transformation se fait 4 octets par 4 octets, c'est une bijection, très rapide et beneficiant des optimisations de la compilation .java -> .class et .vb, .css... -> formats de code managé).
IL EST FONDAMENTAL DE DIFFERENTIER CETTE INTERPRETATION TRES EFFICACE DE CELLE DES LANGAGES INTERPRETES CLASSIQUES
* Les propriétés d'un niveau supérieur au code (récupération d'exceptions plus sécurisées, refflexion...) permettent de développer + simplement et parfois + efficacement qu'en code compilé classique.
*Il y a encore de nombreuxarguments mais mon texte s'allonge dja pas mal
LES PBs :
*demande + de mémoire : la machine virtuelle consomme,
*les codes compilés simples ou développés à très fort coût surclassent leurs perfs
Je pense que les langages mixtes sont les + adaptés à la plus part des secteurs sauf par les rares domaines "chasse gardée les langages interprétés (shells & co)" et pour faire du code TRES optimisé, compilé spécialement pour une machine cible ou pour les besoins de perfs à fort bugdets
Notes : le marché du jeux vidéo passe du C++ (compilé) au (MC++ .NET ou C#).
Mais en quoi sont faites les machines virtuelles java et .NET? en C et C++ :-))