Comment la portabilité d'un langage comme C est-elle déterminée exactement? J'ai appris que les compilateurs sont spécifiques à ISA. Si cela est vrai, comment C est-il portable? Ou est-ce que seul le code source écrit en C est portable mais pas les exécutables? Les exécutables ISA ne sont-ils pas spécifiques aux exemples d'applications pour x86 qui sont distinctes des applications pour Apple (en supposant qu'Apple utilise le microprocesseur Motorola / PowerPC)?
10
Ce n'est pas seulement spécifique à l'ISA. Par exemple, vous demandez:
Oui, ils le sont, même si Apple utilise du matériel x86. Les binaires C sont spécifiques à l' architecture et au système d'exploitation.
la source
Exactement. Vous devez recompiler votre programme C sur chaque plate-forme. Les compilateurs C génèrent du code machine qui n'est portable que dans une mesure très limitée, entre des machines de même architecture processeur / mémoire et OS. C'est pourquoi vous voyez différentes distributions binaires d'applications multiplateformes (par exemple les navigateurs), telles que "Linux 64 bits Intel" ou "Mac OS X 32 bits PowerPC" (OK, la dernière n'est qu'une illustration, je sais qu'Apple a changé à Intel il y a quelques années :-).
la source
La plupart de la question a été répondue, mais j'aimerais ajouter que la durabilité est une autre chose que vous devrez peut-être prendre en compte.
Par exemple, JAVA peut être écrit une seule fois et exécuté sur n'importe quelle plate-forme sur laquelle la machine virtuelle (aujourd'hui, elle s'appelle «Runtime Environment»). Mais un autre avantage est que vous pouvez exécuter du code Java 1.1 à partir de 1995 sur votre machine 2011. Ce qui n'est pas possible si votre code a été compilé sur i386 et que vous essayez de l'exécuter sur votre architecture AMD64.
Vous bénéficiez également des améliorations de la machine virtuelle elle-même.
Ensuite, je dirais qu'en général, en passant du moins portable aux langages les plus portables que vous auriez: Assembleur, langage compilé de bas niveau comme C, puis C ++, puis les langages interprétés ou ceux qui s'exécutent dans une machine virtuelle.
Je ne suis pas vraiment un défenseur de Java, du moins pas pour le langage ni pour la communauté par exemple, mais c'est la voie à suivre si vous recherchez la portabilité et la moindre perte de performances par rapport à C.
la source
Bonnes réponses sur l'écriture une fois compilée n'importe où.
Les gens aiment penser le C comme un langage portable en raison de sa popularité et de la forte probabilité qu'un compilateur C soit disponible pour les futures plateformes cibles. Un autre facteur est la bibliothèque standard qui aide aux tâches de programmation courantes d'une manière indépendante de la plate-forme.
Je dirais donc que la portabilité d'une langue est déterminée par:
En réalité, presque toutes les applications C complexes nécessiteront un certain travail pour passer à une nouvelle plate-forme en raison des dépendances du matériel ou du système d'exploitation. Ce processus est appelé portage.
la source
La "portabilité" a plusieurs significations. En ce qui concerne C, cela signifie ce qui suit:
Des compilateurs ont été mis en œuvre pour C pour une grande variété de plates-formes matérielles et de systèmes d'exploitation, ce qui était une grosse affaire au début des années 70;
Il existe une norme universellement acceptée pour le langage lui-même, par opposition à chaque implémentation du compilateur reconnaissant une variante légèrement différente du langage (encore une fois, un Big Deal lorsque C a été conçu pour la première fois, car il y avait plusieurs variantes de langages comme Pascal et BASIC qui n'étaient pas universellement reconnus);
En raison de cette norme, le code conforme produira le même comportement lorsqu'il est compilé sur différentes plates-formes.
Le code source est portable, mais un nouveau binaire doit être généré pour chaque cible.
Notez, cependant, que la source C est rarement portable "trivialement"; la plupart des applications vous obligent à aller au-delà de ce qui est défini par la norme de langage, en utilisant des extensions qui sont uniques à une plate-forme particulière, donc dans la pratique, le code source n'est pas 100% portable.
Notez, cependant, que C laisse beaucoup de place à l'implémentation. Les tailles exactes des différents types de données, le comportement en cas de débordement, etc., dépendent de l'implémentation; la norme fournit les exigences minimales auxquelles une implémentation doit être conforme, mais l'implémentation est libre d'aller au-delà de ces limites.
la source
Quelle que soit ISA, C n'est pas spécifique à ISA. Je suppose que vous ne faites pas référence à l'emplacement désormais obsolète pour les cartes d'extension PC.
Il existe des compilateurs C conformes aux normes pour de très nombreuses plates-formes, et tant que vous utilisez des fonctionnalités de langage entièrement définies par les normes dans votre code source, vous devriez pouvoir le compiler sur n'importe quel compilateur C pour n'importe quelle plate-forme.
Cependant, un problème est que la norme C laisse beaucoup de comportement des fonctionnalités soit définies par l'implémentation soit comme un comportement non défini. Ceci est fait pour rendre le langage C plus généralement utile pour la programmation de bas niveau, en évitant les cas où certains comportements définis avec précision ne correspondent pas à ce que le matériel prend en charge sur certaines plates-formes. Cependant, cela rend un peu plus difficile l'écriture de programmes portables.
De plus, contrairement à certains langages, C n'est pas fourni avec une énorme bibliothèque du type fourni par Java ou C #. Vous pouvez obtenir des bibliothèques très portables pour faire à peu près n'importe quoi, mais vous devez faire un travail pour les construire et les faire fonctionner ensemble.
C a bien sûr une bibliothèque standard, mais sa portée est relativement limitée par rapport à Java, C #, Python, etc.
la source