Java est souvent loué pour sa portabilité incroyable, ce qui, je suppose, est dû à la JVM. Ma question est de savoir ce qui empêche C d'être compilé / interprété / JIT'ed., Si c'est le cas, C peut également être écrit une fois et le faire fonctionner sur n'importe quel appareil que vous avez. mais ce n'est pas un mécanisme populaire pour traiter un programme C.
Quels sont les inconvénients de traiter C de cette manière, quels sont également les avantages de traiter Java de cette manière et de ne pas compiler en code machine, à part la portabilité bien sûr?
Réponses:
C est ce que j'appellerais un langage de niveau intermédiaire. Son but est de servir d '«assembleur de très haut niveau», c'est pourquoi il fonctionne si bien en tant que cible de compilation et pourquoi il embrasse si bien la portabilité.
Historiquement, les interprètes ont généralement été utilisés avec des langages de haut niveau, dans le contexte des appels de méthode. Dans sa forme la plus simple, un interpréteur analyse simplement chaque mot-clé dans la langue source avec ses jetons associés, et les convertit en appels de méthode et paramètres. En pratique, ce que font la plupart des interprètes, c'est de convertir la langue source en une représentation intermédiaire, et c'est cette représentation qui est interprétée.
Qu'est-ce qui empêche C d'être interprété ou jeté? Rien. Mais ce n'est pas la raison d'être de C.
la source
Tout d'abord, il convient de noter que la JVM de Sun a été écrite en C. C est un langage très populaire lorsque la portabilité est nécessaire.
Le langage C est portable même si de nombreux programmes C ne le sont pas. En effet, C n'impose pas autant de restrictions au programmeur ni ne fait autant d'hypothèses. Si un programmeur C veut que ses programmes soient portables, il doit se mettre ces restrictions.
En pratique, ce n'est vraiment pas beaucoup plus difficile que de vivre avec les restrictions que Java vous impose. Il s'agit principalement de garder à l'esprit votre endianness et vos tailles primitives, et d'utiliser des bibliothèques portables comme GTK + au lieu de bibliothèques spécifiques à la plate-forme.
Vous pouvez créer une cible GTK + et un compilateur C qui prennent en charge une machine virtuelle, même probablement la JVM, et faire fonctionner le code existant avec très peu de modifications. En fait, sans le garbage collection, une machine virtuelle C serait probablement beaucoup plus simple. Pourquoi voudriez-vous, cependant?
L'inverse, la compilation de Java en code natif, est également réalisable. C'est essentiellement ce que fait le JIT. Pourquoi voudriez-vous, cependant? Je suis sûr qu'il existe des projets pour animaux de compagnie pour le faire «juste parce que», mais ils ne sont pas sérieusement utilisés.
la source
Tu as dit:
Et là, dans la première phrase, vous vous trompez. Java n'est pas portable à cause de la JVM. Java est portable, car le langage Java est défini d'une manière qui ne laisse à l'implémenteur aucune latitude quant au comportement d'un programme.
Par exemple, Java a deux types "int" (entier signé 32 bits) et "long" (entier signé 64 bits). C et C ++ ont "int" (signé au moins 16 bits), "long" (signé au moins 32 bits) et "long long" (signé au moins 64 bits). En effet, C est censé fonctionner sur de nombreux processeurs différents et leur permet de se comporter différemment.
C aurait pu définir des tailles fixes pour ces types. Si c'était le cas, les processeurs 36 bits n'auraient pas pu implémenter le langage C. Et ils ne peuvent en effet pas implémenter Java! C a donc permis au langage de fonctionner avec une variété d'ordinateurs différents. Il est inévitable que cela permette la création de code qui n'est pas portable. C'est une question de langue.
la source
Java est hautement portable, notamment parce que le langage cible la machine virtuelle Java, qui, comme son nom l'indique, n'est pas une vraie machine . Étant donné que vous pouvez implémenter une machine virtuelle sur l'architecture de nombreux types différents de machines réelles, un programme basé sur JVM est hautement portable.
C, d'autre part, est spécifiquement conçu pour être exécuté sur du matériel réel, car il a été créé dans le but spécifique de mettre en œuvre un système d'exploitation, qui nécessite un accès matériel complet. Cela signifie que le code C n'est pas particulièrement portable par conception , et lors du portage d'un programme C d'une plateforme à une autre, diverses parties spécifiques à l'architecture cible devront être réécrites à un degré ou un autre.
la source
Il existe en fait des versions interprétées de C , mais elles sont principalement destinées à être utilisées pour une expérimentation rapide plutôt que pour un système de production.
Ils ne sont pas courants, car après tout, pourquoi souffririez-vous de toutes les idiosyncrasies C sinon pour obtenir un petit exécutable rapide et statique?
la source
Théoriquement, C et Java peuvent tous deux être compilés en code natif, interprétés ou compilés sur une machine virtuelle.
La raison technique pour laquelle C n'est pas compilé sur une machine virtuelle, c'est qu'il n'y a tout simplement pas de machine C virtuelle standard .
Et personne ne semble vouloir définir une machine virtuelle C, ni même compiler vers la machine virtuelle Java (ce qui est parfaitement possible). Probablement parce que personne qui utilise C ne veut perdre sa vitesse inégalée. Probablement aussi parce que C est le plus fort dans la communauté open source qui peut facilement faire de la portabilité par compilation (distribuer et recompiler la source et exécuter), donc ils ne ressentent pas un tel besoin de portabilité d'exécution (distribuer et exécuter un binaire) comme fermé développeur source faire.
la source
En fait, cela se fait. Il existe des compilateurs majeurs qui prennent en charge la compilation vers LLVM (je sais que clang le fait, et je pense que gcc le fait aussi). Ce LLVM peut être JIT comme le code Java est compilé en bytecode qui est JIT.
Cependant, ce qui rend java "multiplateforme" par rapport à C, c'est que Java a une grande bibliothèque d'exécution qui a été portée sur de nombreuses plates-formes. C ne suit pas explicitement ce paradigme.
la source
Il existe des différences majeures entre Java et C. Java est isolé du système d'exploitation via la machine virtuelle java (JVM). La JVM extrait le système d'exploitation du programme. Une application java peut demander à la JVM un morceau de mémoire, et la JVM demande alors au système d'exploitation cette mémoire. Il existe de nombreuses JVM pour différentes plates-formes / systèmes d'exploitation. La JVM est ce qui permet au même programme java de s'exécuter sur différentes plateformes.
Avec C, il n'y a pas d'isolement du système d'exploitation. Les programmes C s'exécutent (généralement) directement sur le système d'exploitation, effectuant des appels directs au système d'exploitation. Cela crée des liens entre ce programme C et un système d'exploitation / plateforme spécifique. Tout programme non trivial va effectuer des appels dans le système d'exploitation. De plus, les programmes C sont compilés en code machine, qui est spécifique au matériel. Un programme C compilé pour x86 ne peut pas être exécuté directement sur un processeur ARM.
la source