Machine virtuelle Java utilise code C pour convertir le code Java en langage machine? Alors pourquoi ne pouvons pas utiliser C de faire un programme réel, plutôt que d’utiliser Java?

Je comprends que Java fournit des concepts de OOPs et bien plus encore, cependant, ceux sont enfin obtenir comprises par C. Alors, pourquoi nous ne pouvons pas couper C pour l’utiliser comme C plutôt Java?

Réponse

La machine virtuelle Java n’utilise pas C pour convertir le code Java en langage machine, il est composé de deux choses :

Un compilateur (javac) qui convertit le code Java en bytecode de la JVM.
Une Machine virtuelle (java) qui prend en bytecode de la JVM et (1) convertit en une représentation interne ; (2) interprète cette représentation interne et analyse son exécution ; (3) les recompilations chaud codepaths à la volée directement en code machine.

Remarque :

Une implémentation Java peut également interagir avec C (ou toute autre langue) par l’utilisation d’Interfaces de fonction étrangers. Runtimes ont tendance à être écrit en C, ou dans la langue d’accueil gérés ones (p. ex.: le Runtime de Clojure est écrit en Java). Vous pouvez également facilement écrire tant la JVM et le compilateur javac dans Java lui-même, mais Java n’est pas un choix de bon langage pour écrire une Machine virtuelle avec un compilateur JIT.

Bien sûr, vous pouvez utiliser C pour faire la même chose que Java est. Et vous pouvez utiliser Java pour faire la même chose que c fait. Ils sont les deux langages de programmation généraliste turing-complet, ce qui signifie que vous pouvez faire quelque chose avec eux. Toutefois, cela ne signifie pas que faire tâche X ont sera aussi facile à faire en toutes les langues. La raison pour laquelle que nous écrivons à nouveau général but langages de programmation ne doit ne pas permettre aux gens de "faire plus de choses", c’est en fait pour contraindre le peuple, pour le rendre plus difficile pour les gens de faire quelque chose d’une certaine manière.

En limitant la façon dont les gens peuvent utiliser un langage de programmation, nous obtenons beaucoup d’elle :

  • Le compilateur peut faire des optimisations plus sur ses propres, parce qu’il peut faire plusieurs hypothèses au sujet de votre code et peut garantir que certaines façons de réécriture, il aura toujours le même comportement ;
  • Le runtime/compilateur peut vous donner des garanties de sécurité plus : par exemple: en interdisant les dépassements de tampon ;
  • La langue peut simplifier certaines opérations à raisonner sur et mettre en œuvre. Par exemple, travailler avec des objets est beaucoup plus simple si vous n’avez pas besoin se soucient manuellement allouant de la mémoire et libère manuellement leur mémoire une fois que tout le monde est fait avec elle, il suffit de laisser jusqu'à le Garbage Collector.
  • Il est plus facile d’écrire une preuve formelle pour votre programme.

Certaines langues peuvent faire encore plus, parce qu’ils sont encore plus limités. Par exemple, Haskell peut avoir son compilateur automatiquement évitant nombre d’itérations sur une structure de données en fusionnant les opérations dedans dans une boucle simple. Donc, si vous écrivez "list.map (_ + 1) filtre (isOdd) .map(_ + 2) ', même si elle ressemble à trois itérations sur la liste serait nécessaire, il va optimiser que pour faire un seul. Et il ne peut le faire que parce que la sémantique ne pas autoriser les mutations et les effets secondaires.


Tags: Apprendre à programme, Programmation informatique, Langages de programmation, Java (langage de programmation), C (langage), Compilateurs