38 votes

Quels sont les avantages de bytecode plus de code natif?

Il semble comme quelque chose que vous pouvez faire avec bytecode vous pouvez le faire aussi facilement et beaucoup plus rapidement dans le code natif. En théorie, on pourrait même conserver la plate-forme et de la langue de l'indépendance par la distribution de programmes et de bibliothèques en bytecode puis compiler en code natif lors de l'installation, plutôt que de JITing il.

Donc, en général, quand vous voulez exécuter du bytecode au lieu de maternelle?

31voto

Sean Points 2766

Hank Shiffman de SGI a dit (il y a longtemps, mais c'est jusqu'à true):

Il y a trois avantages de Java à l'aide de code octet au lieu d'aller à le code natif du système:

  1. Portabilité: Chaque ordinateur a sa propre instruction ensemble. Alors que certains processeurs incluent l' instructions pour leurs prédécesseurs, c'est généralement vrai qu'un programme qui s'exécute sur un type d'ordinateur ne fonctionne pas sur toutes les autres. Ajouter dans le les services fournis par l'exploitation le système, qui chaque système décrit dans sa propre manière unique, et vous avez une problème de compatibilité. En général, vous vous ne pouvez pas écrire et compiler un programme pour un type de système et l'exécuter sur n'importe quel d'autres, sans beaucoup de travail. Java obtient autour de cette limitation par l'insertion, sa machine virtuelle entre l' de l'application et de l'environnement réel (ordinateur + système d'exploitation). Si un l'application est compilé en Java code et que le byte-code est interprété de la même façon dans tous les milieux, alors vous pouvez écrire un programme unique qui fonctionne sur toutes les différentes les plates-formes où Java est pris en charge. (C'est la théorie, de toute façon. Dans la pratique il y a toujours des petits les incompatibilités à l'affût pour le programmeur.)

  2. Sécurité: l'Un, de Java, de vertus, c'est son intégration dans le Web. Charge une page web qui utilise Java dans votre navigateur et le code Java est automatiquement téléchargé et exécuté. Mais que faire si le code détruit les fichiers, que ce soit par malveillance ou de négligence sur le programmeur de la partie? Java empêche téléchargé applets de faire rien de destructeur en interdisant les opérations potentiellement dangereuses. Avant qu'il permet l'exécution de code il l'examine pour la tentative de contournement de sécurité. Il vérifie que les données sont utilisé régulièrement: le code que manipule un élément de données comme un entier à un moment, et puis essaie de l'utiliser comme un pointeur, plus tard, seront pris et empêché l'exécution. (La Java la langue ne permet pas de pointeur l'arithmétique, de sorte que vous ne pouvez pas écrire du Java code pour faire ce que nous venons de décrire. Toutefois, rien n'empêche quelqu'un à partir de l'écriture destructrice de l'octet code eux-mêmes à l'aide d'une hexadécimal l'éditeur ou encore la construction d'un octet Java le code assembleur.) Il n'est généralement pas possible d'analyser un programme code machine avant l'exécution et de déterminer si elle fait n'importe quoi mauvais. Des astuces comme l'écriture self-modifying code signifie que le mal les opérations peuvent même ne pas exister jusqu'à ce que plus tard. Mais Java byte code a été conçu pour ce type de validation: il ne pas avoir les instructions d'un malveillants programmeur devrait utiliser pour cacher leur agression.

  3. Taille: Dans le microprocesseur monde RISC est généralement préférable plus de la CDCI. C'est mieux d'avoir une petite jeu d'instructions et d'utilisation rapide instructions pour faire un travail que d'avoir de nombreuses opérations complexes mis en œuvre comme instructions uniques. RISC dessins besoin de moins de portes sur la puce mettre en œuvre leurs instructions, permettant pour avoir plus d'espace pour les pipelines et autres techniques pour faire de chaque instruction plus rapide. Un interprète, cependant, aucune de ces questions. Si vous voulez mettre en œuvre une seule instruction pour l' instruction switch avec une variable la longueur varie selon le nombre de cas clauses, il n'y a pas de raison de ne pas le faire donc. En fait, un complexe jeu d'instructions est un avantage pour un basé sur le web langue: cela signifie que le même le programme va être de plus petite taille (moins de les instructions d'une plus grande complexité), ce qui signifie moins de temps pour le transfert de l'ensemble de notre vitesse limitée dans le réseau.

Donc, lors de l'examen du code octet vs natif, considérer le compromis que vous voulez faire entre la portabilité, la sécurité, la taille et la vitesse d'exécution. Si la vitesse est le seul facteur important, allez natif. Si tout les autres sont de plus en plus important, aller avec le bytecode.

Je vais aussi ajouter que le maintien d'une série d'OS et de l'architecture ciblée des compilations de la même base de code pour chaque version peut devenir très fastidieux. C'est une grande victoire pour utiliser le même bytecode Java sur de multiples plates-formes et de l'avoir "seulement les travaux."

15voto

DGentry Points 10759

La performance de n'importe quel programme permettra d'améliorer si il est compilé, exécuté avec le profilage, et les résultats renvoyés dans le compilateur pour un second passage. Les chemins de code qui sont effectivement utilisés seront de façon plus agressive optimisé, boucles déroulé exactement à la bonne mesure et le chaud chemins d'instructions arrangé pour maximiser j'$ hits.

Toutes les bonnes choses, mais il n'est presque jamais fait parce que c'est ennuyeux de passer par de nombreuses étapes pour créer un fichier binaire.

C'est l'avantage de l'exécution du bytecode pour un certain temps avant de le compiler en code natif: les informations de profilage est automatiquement disponible. Le résultat après Juste-À-Temps de compilation est hautement optimisé en code natif pour les données spécifiques, le programme est en cours de traitement.

Être en mesure d'exécuter le bytecode permet également plus agressif natif d'optimisation de statique compilateur peut utiliser en toute sécurité. Par exemple si l'un des arguments d'une fonction est noté pour toujours NULL, toutes les manipulations pour cet argument peut être simplement omis dans le code natif. Il y aura une brève vérification de la validité des arguments de la fonction prologue, si cet argument n'est pas NULL, la VM abandonne retour à la bytecode et commence à le profilage de nouveau.

9voto

Brian R. Bondy Points 141769

Bytecode crée un niveau supplémentaire d'indirection.

Les avantages de ce niveau supplémentaire d'indirection sont:

  • Indépendance de plate-forme
  • Pouvez créer n'importe quel nombre de langages de programmation (la syntaxe) et de les compiler en bas de la même bytecode.
  • Pourrait facilement créer des croix de langage les convertisseurs
  • x86, x64 et IA64 n'ont plus besoin d'être compilé comme séparés binaires. Que le bon de la machine virtuelle doit être installé.
  • Chaque OS a besoin tout simplement de créer une machine virtuelle et il aura le soutien pour le même programme.
  • Juste le temps de compilation permet de mettre à jour un programme simplement en remplaçant un seul patché le fichier source. (Très utile pour les pages web)

Quelques-uns des inconvénients:

  • Performance
  • Plus facile à décompiler

3voto

Mike Dunlavey Points 25419

Toutes les bonnes réponses, mais mon hot-bouton a été frappé performance.

Si le code en cours d'exécution passe tout son temps à l'appel de la bibliothèque/système de routines - opérations sur les fichiers, opérations de base de données, l'envoi de messages de windows, alors il n'a pas beaucoup d'importance si c'est JITted, parce que la plupart du temps de l'horloge est passé à attendre pour ceux de niveau inférieur opérations pour terminer.

Cependant, si le code contient des choses que nous avons l'habitude de les appeler des "algorithmes", que faut être rapide et ne pas passer beaucoup de temps à appeler des fonctions, et si ceux-ci sont utilisées assez souvent pour être un problème de performance, puis JIT est très important.

2voto

Kyle Cronin Points 35834

Je pense que vous avez répondu à votre propre question: indépendance de plate-forme. Indépendant de la plate-bytecode est produite et distribuée à sa plate-forme cible. Lors de l'exécution, il est rapidement compilé en code natif, soit avant l'exécution commence, ou simultanément (Juste À Temps). La Java JVM et sans doute le .NET runtimes fonctionnent sur ce principe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X