Qu'est-ce que cela signifie pour un logiciel de s'exécuter en mode natif?

27

Je me demandais ce que cela signifie pour un logiciel de s'exécuter en mode natif. En quoi consiste exactement un tel logiciel et en quoi est-il différent d'un logiciel qui ne fonctionne pas en mode natif? Comment savoir si un morceau de logiciel donné s'exécutera en mode natif sur mon ordinateur? Y a-t-il probablement des logiciels sur mon ordinateur qui fonctionnent en natif?

Throsby
la source
2
"native" implique qu'il est conçu pour fonctionner sur n'importe quelle plate-forme / système d'
exploitation
Moi non plus ... il semble que les modérateurs aient du mal à lire les questions ...
5
@faB Vous vous rendez compte qu'aucun modérateur n'a participé à la clôture de la question?
slhck
J'avoue que le titre de la question m'a fait penser à la différence entre exécuter un "programme" sous un "système d'exploitation" ou sur le processeur lui-même (par exemple un accès direct au matériel).
Percée du
Ce n'est pas que la question soit mauvaise en soi, mais ce n'est pas bon pour ce site. Comme en témoignent les réponses, ce n'est pas quelque chose qui peut être répondu proprement et a un certain nombre d'arguments qui l'entourent, ce qui rend sa fermeture tout à fait appropriée selon la FAQ.
afrazier

Réponses:

43

Un logiciel est natif d'une plate-forme s'il a été conçu pour fonctionner sur cette plate-forme.

Une plate-forme fait généralement référence à un système d'exploitation, mais elle peut également être appliquée à des appareils tels que le Nintendo Game Boy.

En utilisant le Game Boy comme exemple, il obtient son logiciel à partir de cartouches. Ces cartouches contiennent du code qui s'exécute nativement sur le Game Boy.

Les émulateurs sont une couche qui permet aux logiciels conçus pour une plate-forme d'être exécutés sur une autre. Par exemple, il existe des émulateurs qui peuvent exécuter des images de cartouches Game Boy et vous permettre de jouer à des jeux Game Boy sur votre ordinateur ou même votre téléphone mobile.

Une couche de compatibilité est un peu comme un émulateur. Lorsque les ordinateurs et les systèmes d'exploitation 64 bits sont devenus courants, ils devaient être compatibles avec les technologies 32 bits existantes. Étant donné que les architectures 64 bits et 32 ​​bits sont très différentes, une couche de compatibilité est souvent nécessaire pour exécuter des logiciels 32 bits sur des machines 64 bits. Pour les éditions 64 bits de Microsoft Windows, Microsoft devait écrire une couche de compatibilité afin que les programmes 32 bits continuent de fonctionner sur le nouveau système 64 bits. C'est pourquoi certains programmes sont souvent installés dans un dossier appelé Program Files (x86), où x86signifie "32 bits".

Les couches de compatibilité ont tendance à être plus intimes avec le système natif que les émulateurs. VirtualBox émule du matériel pour les systèmes d'exploitation * , et les systèmes qu'il émule n'ont pas beaucoup d'interaction directe avec le système hôte. WoW64 est une couche de compatibilité en ce sens qu'elle permet aux programmes 32 bits de s'exécuter sur Windows 64 bits de manière plus intégrée. WoW64 permet de rendre les programmes compatibles plutôt que de les émuler dans un environnement isolé.

Une bibliothèque de traduction est un composant des couches de compatibilité. Chaque fois que le code binaire s'exécute de manière non native, une bibliothèque de traduction permet de rediriger les appels étrangers non natifs vers des appels natifs que le système peut comprendre. Les programmes d'assemblage écrits pour la TI-83 d'origine peuvent ne pas être compatibles avec les calculatrices TI-83/84 Plus plus récentes car certains appels qui avaient du sens dans l'architecture de la TI-83 peuvent ne plus être valides sur la TI-83/84 +. Une bibliothèque de traduction (probablement incluse dans des shells comme MirageOS ) garantit que les appels pour la TI-83 vont aux nouveaux emplacements mis à jour dans les calculatrices TI-83/84 +.

Le code indépendant de la plate-forme est écrit dans un langage interprété par quelque chose qui s'exécute généralement en natif. Par exemple, PHP est un langage de programmation qui est interprété et exécuté par le binaire PHP installé, qui a déjà été compilé nativement pour les systèmes d'exploitation Windows, Mac et Unix. Le code PHP que les scripteurs Web écrivent sont indépendants de la plate-forme, ce qui permet au code de fonctionner sur plusieurs systèmes d'exploitation tant que PHP est installé pour ces systèmes d'exploitation.


Divers

Corrections

* Merci, Michael Kjörling , d'avoir attrapé quelques problèmes avec cette réponse .

Autre

La différence entre «natif» et «non natif» n'est pas en noir et blanc . (Crédits à afrazier )

Deltik
la source
3
Nitpick mineur: (c'est VirtualBox, pas VirualBox, et) VirtualBox n'émule pas le système d'exploitation, il émule le matériel . Vous pouvez donc installer n'importe quel système d'exploitation que vous aimez dans VirtualBox (sous réserve des limitations de virtualisation), ou même écrire le vôtre à partir de zéro.
un CVn du
1
Natif implique également souvent qu'il utilise l'ensemble de bibliothèques principal et l'API pour la plate-forme sous-jacente, ce qui peut rendre les distinctions un peu floues. Il y a pas mal de gens qui ne considèrent pas les applications .NET comme "natives" comme les applications API Win32 sont "natives", et de même certaines personnes ne considèrent pas un programme KDE fonctionnant sur un bureau Gnome "natif".
afrazier
@afrazier: En effet, les applications .NET sont conçues pour s'exécuter sur le "Common Language Runtime" et nécessitent une couche de compatibilité pour s'exécuter sur Windows. Ou une couche de compatibilité différente pour fonctionner sous Linux.
Ben Voigt
@Ben Voigt: Il s'agit toujours d'une API propriétaire, les binaires sont compilés en code natif x86 / amd64 (que ce soit au moment de l'exécution par le CLR ou à l'avance avec ngen), et le cadre a été livré avec des versions récentes de Windows. Cela fait partie d'un argument plus large cependant, et n'est pas vraiment approprié ici.
afrazier
Virtual Box n'est pas techniquement un émulateur mais un virtualiseur. Un émulateur des temps passés a toujours émulé un matériel complètement différent. Sous un virtualiseur, le système d'exploitation et le logiciel s'exécutent en fait de manière native sur le processeur hôte. La différence est que les appareils sont virtuels ou émulés. C'est une différence technique mineure que même le site Web Virtual Box souligne ici: virtualbox.org/wiki/Virtualization
Matt H
4

Le code natif est généralement utilisé à l'opposé du code indépendant de la plate-forme. Si vous exécutez un logiciel natif, vous exécutez un binaire compilé et non, par exemple, un script indépendant de la plate-forme tel que le javascript ou le bytecode Java. C compilé ou C ++ compilé sont les bons exemples de code natif.

Niklas Rosencrantz
la source
3

Il existe étonnamment quelques réponses possibles, mais la norme est généralement la suivante: du code compilé en opcodes pour le CPU et exécuté contre les bibliothèques de programmation du système d'exploitation qui a démarré l'ordinateur. Dans ce cas, la plupart du code que vous exécutez sera du code natif. Peut-être que certains contre-exemples éclairciront les choses.

Java n'est pas du code natif. Il est compilé en un bytecode intermédiaire, qui est ensuite exécuté sur le chipset spécifique. Java peut appeler du code natif. Eclipse est un excellent exemple - pour la vitesse, Java appelle certains appels graphiques natifs de la plate-forme.

Si vous exécutez WINE , un émulateur d'API MS Windows, ce n'est pas du code natif. Bien que vous exécutiez du code conçu pour ce chipset (x86), vous n'exécutez pas le code du système d'exploitation qui l'a démarré, mais des bibliothèques de remplacement. MAME exécute des binaires pour différents CPU et systèmes d'exploitation.

Les scripts ne sont pas du code natif. Ils sont écrits dans un langage de niveau supérieur qui doit ensuite être converti au moment de l'exécution en code qui s'exécute sur votre CPU.

Il y a des lignes floues. Votre navigateur Web fonctionne en code natif, mais il peut également exécuter Java (compilé en bytecode) ou Javascript (un langage interprété par script).

Rich Homolka
la source
.NET, VBA, XUL , IA-32 (sur les processeurs AMD64, au moins), ...
un CVn du
3

Cela dépend beaucoup du contexte. Pour moi, «natif» signifie qu'une application utilise les fonctionnalités et les mécanismes fournis par le système d'exploitation, plutôt que de rouler les leurs. Cela peut s'appliquer aux fonctionnalités de l'interface utilisateur (boutons, fenêtres, boîtes de dialogue de sélection de fichiers), ainsi qu'aux fonctionnalités sous le capot (par exemple, l'intégration avec "Ouvrir avec ...").

Par exemple, sous Windows, une application native utiliserait "WinAPI" pour obtenir les mêmes boutons, barres de défilement, etc. que d'autres applications. Ils se comportent exactement de la même manière dans les applications système (bloc-notes) que dans les applications tierces natives.

Les applications Java utilisent souvent "Swing" et ont un aspect complètement différent, car elles dessinent elles-mêmes leurs contrôles, plutôt que d'utiliser ceux du système. L'avantage est que le programme est identique sur tous les systèmes d'exploitation.

Une autre option pour construire une interface graphique est une boîte à outils multiplateforme comme "QT". QT demandera au système d'exploitation de dessiner les contrôles pour cela, ils devraient donc être très natifs, que vous exécutiez Windows, OSX ou Linux. Une zone de texte QT ressemblera à une zone de texte Windows, mais ce n'est pas exatly natif, mais une sorte d'émulation. Vous remarquerez peut-être de petites différences dans les détails (par exemple, le menu contextuel, les méthodes de saisie, etc.).

Notez que lorsque les gens disent «natif», cela signifie souvent qu'un programme est compilé en code machine plutôt qu'en code intermédiaire, qui est exécuté sur une machine virtuelle (comme les programmes Java et .NET). Dans les exemples ci-dessus, WinAPI et l'application QT utilisent du code machine, tandis que le programme Java est compilé en bytecode Java. Cette utilisation est un peu problématique de nos jours, car de nombreux utilisateurs considéreraient une application .NET native bien conçue pour Windows - c'est juste un .exe, utilise exactement les mêmes contrôles et API sous le capot, et est presque impossible à distinguer d'un programme compilé en langage machine.

De même, je considérerais un programme qui utilise GTK, connaît la structure du système de fichiers Unix et est peut-être livré dans un package .deb natif pour Ubuntu ou Gnome. Il existe même des applications Gnome propriétaires écrites en javascript que l'on pourrait appeler natif! La même chose s'applique aux applications "Metro" de Windows 8, qui peuvent être écrites dans une variété de langues, certaines compilées, d'autres non.

jdm
la source
2

En termes plus abstraits, c'est comme laisser à quelqu'un d'autre votre confiance exécuter un programme dans une langue différente.

  • Natif signifie que le système d'exploitation utilisera le dialecte le plus rapide et le plus simple qu'il connaisse, le binaire.

    Avantages: grande disponibilité rapide de la langue qui peut se parler, car c'est du métal. Inconvénients: sécurité, API complexe, limitée aux capacités du système d'exploitation, les compilateurs sont également difficiles à créer, car un programme, une fois compilé, est publié dans la nature.

  • Non natif, signifie que votre code ne sera pas exécuté directement par le système d'exploitation. Il peut être exécuté de nombreuses manières différentes, les principales étant interprétées et exécutant une version bytecode de votre programme dans une machine virtuelle.

    Avantages: l'API change presque toujours, il est donc beaucoup plus facile pour les programmeurs de travailler (au moins lorsqu'ils s'en tiennent à ce langage particulier). Inconvénients: performances (c'est souvent une légère diminution, cela peut rarement devenir un problème), et tout le monde n'utilisera pas réellement ce langage particulier, donc il peut également être difficile d'adopter cette technologie. La sécurité peut également être un problème, mais elle est beaucoup plus sous contrôle. En quelque sorte.

jokoon
la source