Trop de sémantique et de déclarations basées sur l'opinion.
Tout d'abord : C# n'est pas un langage interprété ; le CLR et la JVM sont considérés comme des "runtimes" ou des "middleware", mais le même nom s'applique à des choses comme Perl. Cela crée beaucoup de confusion parmi les personnes concernées par les noms.
Le terme "interprète" faisant référence à un runtime signifie généralement que le code existant interprète un code non natif. Il existe deux grands paradigmes : L'analyse syntaxique lit le code source brut et effectue des actions logiques ; l'exécution de bytecode compile d'abord le code en une représentation binaire non native, dont l'interprétation nécessite beaucoup moins de cycles CPU.
À l'origine, Java était compilé en bytecode, puis passait par un interpréteur ; aujourd'hui, la JVM lit le bytecode et le compile juste à temps en code natif. Le CIL fait de même : le CLR utilise la compilation juste-à-temps en code natif.
Envisagez toutes les combinaisons de l'exécution du code source, de l'exécution du bytecode, de la compilation en mode natif, de la compilation juste à temps, de l'exécution du code source par un compilateur en mode natif juste à temps, etc. La sémantique de la compilation ou de l'interprétation d'un langage n'a plus de sens.
À titre d'exemple : de nombreux langages interprétés utilisent la compilation en bytecode juste à temps. C# compile en CIL, qui compile en JIT en natif ; en revanche, Perl compile immédiatement un script en bytecode, puis exécute ce bytecode à travers un interpréteur. Vous ne pouvez exécuter une assembly C# qu'au format bytecode CIL ; vous ne pouvez exécuter un script Perl qu'au format code source brut.
Les compilateurs juste-à-temps exécutent également beaucoup d'instrumentation externe et interne. Le moteur d'exécution suit l'exécution de diverses fonctions, puis ajuste la disposition du code afin d'optimiser les branches et l'organisation du code pour son flux d'exécution particulier. Cela signifie que le code JIT peut s'exécuter plus rapidement que le code compilé en mode natif (comme le C++ en général, ou comme le C# exécuté via IL2CPP), car le JIT adapte sa stratégie d'optimisation au cas d'exécution réel du code pendant son exécution.
Bienvenue dans le monde de la programmation informatique. Nous avons décidé de le rendre extrêmement compliqué, puis d'attacher des noms non descriptifs à tout. Le but est de créer des guerres de mots sur la définition de mots qui n'ont aucune signification pratique.
1 votes
Duplicata possible de Le C# est-il interprété ou compilé ?
0 votes
Poste connexe - Si le C# n'est pas interprété, alors pourquoi une VM est-elle nécessaire ?
0 votes
En attendant que quelqu'un invente un langage qui se distribue sous forme de LLVM IR et qui nécessite que les utilisateurs installent une instance autonome de LLVM.
0 votes
Je sais que c'est vieux, mais je pense que c'est toujours d'actualité. La plupart des discussions ici proviennent des différentes définitions de "langage interprété" vs "langage compilé". La question pourrait être améliorée (1) en clarifiant la définition spécifique du PO de ces termes ou (2) en séparant la question de "interpréter" vs "compiler" de la question de ce qui est disponible/standard pour construire/exécuter du code C#. Pour ceux qui s'intéressent aux progrès de la compilation native en avance sur le temps (Native AOT) de C# .NET, voir ce référentiel .