Portabilité du langage C

10

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)?

KawaiKx
la source

Réponses:

27

est-ce que seul le code source écrit en C est portable et non les exécutables?

Correct. Certains l'appellent écrire une fois, compiler partout.

http://en.wikipedia.org/wiki/Write_once,_compile_anywhere .

L'autre alternative est d'écrire une fois, d'exécuter partout. Java en est un bon exemple.

http://en.wikipedia.org/wiki/Write_once,_run_anywhere

Et même si vous pouvez obtenir une portabilité multiplateforme partielle, vous ne devriez jamais vous attendre à ce que votre code s'exécute partout sans modifications.

adolfojp
la source
Le code source C n'est pas portable pour différents compilateurs ou ISA ou OS sans pas mal de shennanigans extra-linguistiques. Des choses simples comme la taille et l'alignement des types standard ne sont pas standard en C, donc le portage d'un logiciel qui échangera des données avec d'autres instances de lui-même peut être assez difficile. Reportez-vous à GNU Autoconf / Automake pour un exemple (peut-être obscurci) des cerceaux que les programmeurs C vont parcourir pour obtenir la portabilité.
Tim Williscroft
3
@TimWilliscroft: Les problèmes de portabilité sont généralement causés par des bibliothèques non standard et de mauvaises pratiques de programmation; et ne sont pas causés par C ou ses bibliothèques standard. Un exemple simple serait d'utiliser une extension GCC non standard ou de ne pas sérialiser / désérialiser correctement les données pour IO.
Brendan
6

Ce n'est pas seulement spécifique à l'ISA. Par exemple, vous demandez:

les applications pour x86 sont distinctes des applications pour apple?

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.

vartec
la source
1
@ Steven314: Votre commentaire est une tangente. Cela n'a rien à voir avec le fait que le matériel soit standard ou non, et tout à voir avec le fait que OS X a un format binaire (Mach-O) différent de celui de, disons, Linux (généralement ELF).
mipadi
@Steve: EFI vs BIOS ne concerne que le démarrage et les systèmes d'exploitation internes; l'architecture matérielle, qui est l'ensemble d'instructions du processeur, est la même, car il s'agit du même processeur.
vartec
Commentaires supprimés, principalement parce que je n'aurais jamais dû inclure le truc mac en premier lieu. Ma mention d'ABI (Application Binary Interface) et des conventions d'appel peut toujours être pertinente (un troisième élément à ajouter à "architecture et système d'exploitation"). Ils ne sont pas pertinents pour le matériel, sauf que les ABI ont tendance à être conçus pour des architectures particulières (par exemple les registres disponibles), mais ils sont pertinents pour la portabilité binaire. Ce n'est pas un problème de format de fichier - ELF est utilisé sur Windows et Linux (par gcc), mais vous ne pouvez probablement pas prendre un fichier objet de l'un à l'autre.
Steve314
@vartec vous avez dit que les binaires C sont également spécifiques au système d'exploitation, est-ce parce que O / S lui-même est spécifique à ISA, donc les binaires C deviennent indirectement spécifiques à O / S?
KawaiKx
@Saurabh - tous les exécutables natifs sont spécifiques au système d'exploitation, car le système d'exploitation spécifie le format de fichier. De plus, une bibliothèque standard C doit implémenter de nombreuses fonctions en appelant le système d'exploitation, donc même si le format de fichier était standardisé, le code lui-même ne pourrait pas s'exécuter sur un autre système d'exploitation. Ceci est standard pour les langages qui se compilent en code natif, contrairement à certains codes de machine virtuelle tels que la JVM (Java Virtual Machine). Il est possible de compiler C pour une machine virtuelle, mais jamais fait à ma connaissance. LLVM se rapproche le plus, mais est conçu comme un back-end de compilateur - pas un environnement de compilation une fois exécuté n'importe où.
Steve314
5

est-ce que seul le code source écrit en C est portable et non les exécutables?

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 :-).

Péter Török
la source
3

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.

TIC Tac
la source
3

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:

  1. Niveau de standardisation.
  2. Disponibilité de compilateurs pour différentes plates-formes / architectures.
  3. Profondeur et étendue des bibliothèques portables.

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.

Guy Sirton
la source
3

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.

John Bode
la source
0

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.

Steve314
la source
4
ISA = instruction set architecture aka hardware architecture
vartec