Qu'est-ce que la portabilité? Comment est-java plus portable que les autres langues?
Je me demande comment Java est plus portable que C, C++ et .NET et dans toute autre langue. J'ai lu de nombreuses fois sur java pour portable en raison de l'interprète et de la JVM, mais la JVM vient se cache l'architecture des différences dans le matériel et la droite? Nous avions encore besoin de plusieurs machines virtuelles pour les différentes architectures de machines. Ce qui me manque ici? Donc, si quelqu'un écrit une couche d'abstraction pour C pour les architectures les plus communes, disons que le CVM, puis tout C programme sera exécuté sur ces architectures, une fois CVM est installé, n'est-ce pas?
Ce qu'est exactement cette portabilité? Pouvez .NET être appelé portable?
- Je pense que c'est exactement le genre de question qu'ils veulent voir sur programmers.stackexchange.com
- Java la portabilité est beaucoup mieux expliqué ici : Voir ce lien
- Je vais voter pour fermer cette question hors-sujet, car il appartient à Software Engineering mais il est trop vieux pour migrer.
Vous devez vous connecter pour publier un commentaire.
La portabilité n'est pas noir et blanc, oui ou non, genre de chose. La portabilité est combien il est facile de me prendre un programme et l'exécuter sur toutes les plates-formes un se soucie.
Il y a quelques choses qui touchent cette. L'un est le langage lui-même. Le langage Java spec généralement laisse beaucoup moins de place à "la mise en œuvre". Par exemple, "i = i++" n'est pas défini dans le C et le C++, mais a une signification bien définie en Java. De plus, pratiquement parlant, de type "int" ont une taille spécifique en Java (par exemple: int est toujours en 32 bits), tandis que dans le C et le C++ la taille varie en fonction de la plateforme et du compilateur. Ces différences ne suffisent pas à vous empêcher d'écrire du code portable en C et C++, mais vous devez être beaucoup plus diligente.
Un autre est les bibliothèques. Java a un tas de bibliothèques C et C++ n'ont pas. Par exemple, le filetage, la mise en réseau et de l'interface utilisateur des bibliothèques. Les bibliothèques de ces sortes existent pour le C et le C++, mais ils ne font pas partie de la norme et les bibliothèques correspondantes disponibles peuvent varier d'une plateforme à une autre.
Enfin, il y a toute la question de savoir si vous pouvez simplement prendre un fichier exécutable et de le déposer sur l'autre plate-forme et de le faire travailler là. En général, cela fonctionne avec Java, en supposant il y a une JVM pour la plate-forme cible. (et il y a des machines virtuelles pour beaucoup de/la plupart des plates-formes de soins de personnes environ) Ce n'est généralement pas vrai avec le C et le C++. Vous êtes généralement à moins besoin de recompiler, et c'est en supposant que vous avez déjà pris soin de les deux points précédents.
Oui, si un "CVM" existait pour de multiples plates-formes, qui rendrait le C et le C++ plus portable -- en quelque sorte. Vous souhaitez toujours besoin d'écrire votre code en C, soit de façon portable (par exemple: en supposant que rien au sujet de la taille d'un int autre que ce que dit la norme) ou si vous voulez écrire à la CVM (en supposant qu'il a pris une décision uniforme pour toutes ces sortes de choses à travers toutes les plateformes cibles). Vous auriez également besoin de renoncer à l'utilisation de la non-bibliothèques standard (pas de mise en réseau, de filetage ou GUI) ou écrire à la CVM des bibliothèques spécifiques à ces fins. Alors nous ne sommes pas vraiment parler de prise en C et C++ plus portable, mais un spécial MCV-C/C++ qui est portable.
Une fois de plus, la portabilité n'est pas noir et blanc chose. Même avec Java il peut encore y avoir des incompatibilités. Le GUI bibliothèques (en particulier AWT) étaient connus pour avoir un comportement incohérent, et tout ce qui concerne les threads peuvent se comporter différemment si vous obtenez bâclée. En général, cependant, il est beaucoup plus facile de prendre une non-trivial programme Java écrit sur une seule plate-forme et de l'exécuter sur un autre que c'est pour faire la même chose avec un programme écrit en C ou C++.
Comme d'autres l'ont déjà dit, la portabilité est un peu floue concept. À partir d'un certain point de vue, C est en fait plus portable de Java. C fait très peu d'hypothèses sur le matériel sous-jacent. Il n'a même pas supposer qu'il y a 8 bits dans un octet, ou que les nombres négatifs devraient être représentés en utilisant en complément à deux. En théorie, tant que vous avez un Von Neumann en fonction de la machine et du compilateur, vous êtes bon pour aller avec C.
En fait, un "Hello world" programme écrit en C fonctionne sur de nombreuses plates-formes que un "Hello world" programme écrit en Java. Vous pourriez probablement avoir le même programme "hello world" pour travailler sur un PDP-11 et un iPhone.
Cependant, la réalité est que la plupart des monde réel programmes de faire beaucoup plus que la sortie de "Hello world". Java a la réputation d'être plus portable que C parce que dans la pratique, il prend beaucoup plus d'efforts pour port du monde réel programmes en C pour différentes plates-formes que dans le monde réel des programmes Java.
C'est parce que le langage C est vraiment ANSI-C, ce qui est très polyvalent, bare-bones langue. Il n'a pas de support pour la programmation réseau, de filetage ou de développement du GUI. Par conséquent, dès que vous écrivez un programme qui comprend toutes ces choses, vous devez vous rabattre sur une moins-portable extension à C, comme Win32 ou POSIX ou quoi que ce soit.
Mais avec Java, la programmation réseau, le filetage et le GUI outils sont définis par la langue et intégré dans chaque VM mise en œuvre.
Cela dit, je pense que beaucoup de programmeurs a également sous-estimer le progrès moderne, C/C++ a fait en ce qui concerne la portabilité de ces jours. POSIX va un long chemin vers la fourniture de croix-plate-forme de thread, et quand il s'agit de C++, Boost fournit le réseautage et le filetage des bibliothèques qui sont en fait tout aussi portable que rien en Java. Ces bibliothèques ont certains de la plate-forme spécifique bizarreries, mais le fait de Java.
Essentiellement, Java repose sur chaque plate-forme ayant une VM de mise en œuvre qui va interpréter le code octet de manière prévisible, et C/C++ s'appuie sur les bibliothèques qui intègrent à la plate-forme spécifique du code en utilisant le préprocesseur (
#ifdef
s). Les deux stratégies permettent de croix-plate-forme de filetage, de réseautage et de développement du GUI. C'est simplement que Java a fait des progrès plus rapides que C/C++ quand il s'agit de la portabilité. Le langage Java spec avait threading, de réseautage et de développement du GUI presque dès le premier jour, alors que la poussée de la mise en réseau de la bibliothèque ne sont venus autour de 2005, et il n'était pas jusqu'en 2011 avec le C++11 qui portable standard filetage a été inclus dans C++.int
est de 32 bits ne peut pas offrir n'importe quel type qui fonctionne de la manièreuint16_t
fonctionne sur les plates-formes 16 bits, et les plates-formes oùint
est de 16 bits ne peut pas offrir n'importe quel type qui fonctionne commeuint16_t
fonctionne sur les plates-formes 32 bits.Lorsque vous écrivez un programme Java, il fonctionne sur toutes les plates-formes qui ont JVM écrit pour eux - Windows, Linux, MacOS, etc.
Si vous écrivez un programme C++, vous devrez compiler spécifiquement pour chaque plate-forme.
Maintenant, il est dit que la devise de Java "écrire une fois, exécuter partout" est un mythe. Ce n'est pas tout à fait vrai pour les applications de bureau, qui ont besoin de l'interaction avec de nombreuses ressources autochtones, mais chaque JavaEE application peut être exécutée sur n'importe quelle plateforme. Actuellement je travaille sur windows, et d'autres collègues travaillent sur Linux sans aucun problème.
(Une autre chose lié à la portabilité est JavaEE (enterprise edition). Il est dit que les applications écrites avec JavaEE technologies de courir dans tous les JavaEE-certifié serveur d'application. Ceci, cependant, n'est pas vrai, au moins jusqu'à ce que JavaEE6. (voir ici))
La portabilité est une mesure de la quantité d'effort pour rendre l'exécution d'un programme sur un autre environnement que celui où il est originaire.
Maintenant, vous pouvez débat si une machine virtuelle java sur Linux est un environnement différent de celui sur Windows (je dirais que oui), mais le fait demeure que, dans de nombreux cas, il n'y a pas d'effort si vous prenez soin d'éviter quelques pièges.
De la CVM vous parlez est bien ce que l'POSIX bibliothèques et les bibliothèques d'exécution, essayez de fournir, cependant, il existe de grandes différences d'implémentation qui font les obstacles haut de la croix. Certainement dans le cas de Microsoft et Apple, ce sont probablement intentionnellement dans le but de garder les développeurs de sortir des produits sur les plateformes concurrentes.
Sur le .net avant, si vous pouvez vous en tenir à ce que mono fournit, open source .Net mise en œuvre, vous pourrez profiter à peu près le même type de portabilité de Java, mais à partir de mono est nettement derrière les versions de Windows, ce n'est pas un choix populaire. Je ne sais pas comment populaire c'est pour le serveur de base de développement où je peux imaginer que c'est moins un problème.
Java est portable du point de vue de l'éditeur: le code écrit en Java peut être exécuté dans n'importe quel environnement sans avoir besoin de recompiler. C est pas portable, car non seulement est-il lié à un système d'exploitation spécifique dans de nombreux cas, il est toujours lié à une architecture matérielle une fois qu'il a été compilé. Le même est vrai pour C++. .Net est plus portable que les C/C++, car il s'appuie également sur une machine virtuelle et n'est donc pas lié à une architecture matérielle au moment de la compilation, mais il est limité à des machines Windows (officiellement).
Vous sont corrects, la JVM est une plate-forme spécifique (il le faut bien!), mais quand vous dites que Java est portable, vous parlez d'elle à partir d'un point de vue développeur et standard de Java développeurs de ne pas écrire la JVM, ils l'utilisent :-).
Modifier @Raze2Dust à répondre À votre question. Oui, vous le pouvez. En fait, vous pourriez faire de la plate-forme Java spécifique par l'écriture d'un compilateur, qui permettrait de générer du code machine plutôt que de bytecode. Mais comme certains autres commentaires le suggèrent, pourquoi voudriez-vous faire cela? Vous devez créer un interprète qui mappe le code compilé pour les opérations de la même façon que la machine fonctionne. Ainsi, le long et à court de celui-ci est, absolument, vous avez certainement pu, mais pourquoi le feriez-vous?
make
.Vous demander si l'on pouvait écrire un "C VM". Pas exactement. "Java est un terme utilisé par Sun signifier beaucoup de choses, y compris à la fois le langage de programmation, et la machine virtuelle. "C" est juste un langage de programmation: c'est le compilateur et les OS et le PROCESSEUR de décider quel format le binaire résultant devrait être.
C est parfois dit que les portables parce que il ne précise pas le moment de l'exécution. Les personnes qui ont écrit de votre compilateur été en mesure de choisir les choses qui ont du sens pour cette plate-forme. L'inconvénient est que C est de bas niveau suffisant, et les plates-formes sont assez différentes, qu'il est courant pour les programmes en C pour fonctionner sur un système et pas du tout sur l'autre.
Si vous combinez le langage C avec un ABI, vous pouvez définir une VM pour elle, analogue à la JVM. Il ya quelques choses comme ça déjà, par exemple:
Tous ces C VMs sont en fait une véritable machine -- personne, autant que je sache, n'a jamais fait une C VM qui a été purement virtuel. Ce n'est pas surprenant, puisque C a été conçu pour fonctionner efficacement sur le matériel, de sorte que vous pourriez aussi bien le faire fonctionner normalement sur un seul système. Que HP a montré, vous pouvez toujours faire un JIT pour exécuter le code de manière plus efficace, même sur la même plate-forme.
Java fournit trois types distincts de portabilité:
Code Source de la portabilité: Un programme Java doit produire des résultats identiques quel que soit le sous-jacent de PROCESSEUR, système d'exploitation, ou compilateur Java.
Architecture du PROCESSEUR portabilité: l'actuel compilateurs Java produire le code de l'objet (appelé byte-code) pour un CPU qui n'existe pas encore. Pour chaque PROCESSEUR sur lequel les programmes Java sont conçus pour s'exécuter, un interprète de Java, la machine virtuelle ou le, "exécute" le J-code. Cette inexistante CPU permet le même objet code à exécuter sur n'importe quel CPU pour laquelle un interprète de Java existe.
OS/GUI portabilité: Java résout ce problème en fournissant un ensemble de fonctions de la bibliothèque (contenues dans Java fournis par les bibliothèques comme awt, util, et lang) qui parlez-en à un imaginaire de l'OS et de l'imaginaire de l'interface graphique. Tout comme la JVM présente un PROCESSEUR virtuel, les bibliothèques Java présenter un système d'exploitation virtuel/GUI. Chaque implémentation Java fournit des bibliothèques de la mise en œuvre de ce système d'exploitation virtuel/GUI. Les programmes Java qui utilisent ces bibliothèques à offrir des OS et de l'interface utilisateur de la fonctionnalité de port assez facilement.
Voir ce lien
Vous avez besoin de la JVM pour différentes architectures, mais, bien sûr, vos programmes Java exécuter sur la JVM. Donc, une fois que vous avez une JVM pour une architecture, vos programmes Java sont disponibles pour l'architecture.
Afin que je puisse écrire un programme Java, compiler vers le bas pour le bytecode Java (qui est de l'architecture-agnostique), et cela signifie que je peux exécuter sur n'importe quelle JVM sur n'importe quelle architecture. La JVM abstraction de l'architecture sous-jacente et mon programme s'exécute sur une machine virtuelle.
L'idée est que le Java langue est portable (ou, plus précisément, l'compilé en byte-code est portable). Vous avez raison en ce que chaque machine virtuelle nécessite une mise en œuvre spécifique pour un profil matériel. Cependant, une fois que les efforts ont été faits, tous bytecode java sera exécuté sur la plate-forme. Vous écrivez java/bytecode une fois, et il fonctionne sur n'importe quel JVM.
.NET est assez similaire, mais avec une bien moindre accent sur le principe. Le CLR est analogue à la JVM et il a son propre bytecode. Mono existe sur *nix, mais il est exact que ce n'est pas "officiel".
De la portabilité ou comme écrit dans Wikipédia, Logiciel De Portabilité est la possibilité de réutiliser le même logiciel (code) dans plusieurs environnements (Systèmes d'exploitation). La java JVM est une machine qui peut être exécuté sur tous les systèmes d'exploitation, il a été conçu pour: Windows, Linux, Mac Os, etc.
Sur .NET, il est possible de porter votre logiciel pour différentes plates-formes. De Wikipédia:
Et parce que Microsoft n'a jamais mis la .NET framework en dehors de Windows, et de voir que .NET est une plate-forme agnostique, Mono a fait possible d'exécuter .NET applications et compiler le code à exécuter dans Linux.
Pour des langages comme C++, Pascal, etc. vous aurez à aller à chaque OS et de construire sur cette plate-forme afin de l'exécuter sur la plate-forme. Le fichier EXE dans Windows n'est pas le même que le
.so
dans linux (le code machine), puisque les deux utilisations différentes bibliothèques de parler au noyau et à chaque OS a son propre noyau.PORTAIT - Écrire une Fois, Exécuter Partout
Dans la réalité, c'est limité pour les plates-formes qui ont une JVM, mais qui couvre au large de la majorité des plates-formes que vous souhaitez déployer. C'est presque à mi-chemin entre un langage interprété, et un langage compilé, gagne les avantages des deux.