Qu'est-ce exactement qu'une cible de compilation?

17

J'entends toujours le terme et toutes les recherches Google me conduisent à des articles sur les compilateurs. Je veux juste comprendre ce que le terme cible de compilation signifie: |

MISE À JOUR: Pour donner un peu de contexte: j'ai entendu dire que l'assembly Web est une cible de compilation pour d'autres langages tels que C, C ++, Rust, etc.

ScionOfBytes
la source
Je vous conseille de lire les articles sur les compilateurs.
4
Les articles sur les compilateurs supposent que vous le savez déjà. C'est une question raisonnable.
Karl Bielefeldt
Je pensais davantage aux articles de style wikipedia. Et je suis d'accord que la question est raisonnable. C'était juste une suggestion, pas une critique.
4
La question est raisonnable, mais mal écrite. Le terme "cible" peut avoir différentes significations, donc je recommanderais de donner une référence ou plus de contexte où vous l'avez entendu ou lu à ce sujet.
Doc Brown
@DocBrown Je l'ai entendu dans de nombreux contextes, mais plus récemment dans le contexte de l'assemblage Web comme cible de compilation pour d'autres langues.
ScionOfBytes

Réponses:

17

Les compilateurs sont, par essence, des traducteurs qui prennent des entrées dans une langue et produisent des sorties dans une autre. Par exemple, le compilateur Eiffel Software prend l'entrée en langage Eiffel et produit C. GCC pour Intel lit l'entrée en langage C et produit l'assemblage x86. L'assembleur GAS pour Intel prend l'assembly x86 et produit le code objet x86. Ces trois choses sont techniquement des compilateurs.

Quel que soit le format, l'entrée lue par un compilateur est appelée la source et la sortie est appelée la cible . Ce dernier terme est tiré de l'une de ses définitions, «résultat escompté».

La majorité des compilateurs sont conçus pour produire un code assembleur ou objet pour un processeur ou une architecture particulière. Pour cette raison, la cible est souvent utilisée pour faire référence à l'architecture elle-même plutôt qu'au format de sortie.

La cible d'un compilateur n'a pas besoin d'être la même que l'architecture où il s'exécute, et dans les cas où cela se produit, le programme est appelé un compilateur croisé . (Par exemple, GCC peut être construit pour fonctionner sur des systèmes x86 afin de compiler C en assembleur ARM.)

De plus, il existe des compilateurs uniques capables de produire une sortie pour différentes cibles en fonction de l'entrée, comme des commutateurs sur la ligne de commande. Ils sont appelés compilateurs multi-cibles .

Blrfl
la source
2
En remarque, il convient de mentionner que ce terme est également utilisé sous une forme plus généralisée dans le contexte des systèmes de génération - une cible est une sortie de n'importe quelle étape de génération, qui ne doit pas nécessairement être une action de compilation (par exemple, création d'un installateur).
BartoszKP
2
les compilateurs sont des traducteurs, pas des filtres.
1
@Birfl. évidemment. "tr" signifie traduire, pas filtrer. les filtres ne sont pas des traducteurs, c'est évident.
2
@Birfl: je ne vais pas par wikipedia. juste produire un flux à partir d'un autre ssys rien. la distinction entre filtres et traducteurs est très bien connue. un filtre inclut / exclut, basé sur un prédicat. il ne se transforme pas. filtrer une liste d'entiers par paires? et vous obtenez même des entiers non transformés. traduisez la même liste en utilisant inc et vous obtenez une version transformée de la liste d'origine.
1
votre compte de compilation est bien sauf pour le terme "filtre".
4

En traduction, que la langue soit une langue naturelle comme l'anglais ou une langue artificielle comme le C, nous utilisons la source et la cible terminologiques pour parler de l' entrée et de la sortie d'un système de traduction. En traduction en langage naturel, le système est le cerveau humain compétent capable de traduire entre deux langues. Dans les langages de programmation, c'est un compilateur.

Ainsi, la source d'un compilateur est le langage de programmation (C), tandis que la cible est le bytecode (instructions au niveau de la machine). Nous utilisons souvent target dans la compilation car différents systèmes (architectures CPU) ont des jeux d'instructions différents, par exemple ARM, MIPS, etc. Le compilateur doit savoir quel jeu d'instructions est la cible, afin de pouvoir créer la sortie correcte (bytecode).

Chris Cirefice
la source
0

WebAssemby est quelque chose de plus récent et de plus grand, qui convertit le code c / c ++ au format binaire.

  • WebAssembly vise à s'exécuter à la vitesse native en tirant parti du matériel commun. Il a été conçu pour s'intégrer à la plate-forme Web.

Voici le lien où l'une des applications que vous pouvez voir, à quelle vitesse il convertit le programme factoriel simple en code machine.

Vérifiez cette bête, https://godbolt.org/

Vous pouvez utiliser cet exemple de programme pour exécuter dans ce site pour voir l'assembly.

# include<stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • Définissez un format binaire portable, efficace en termes de taille et de temps de chargement pour servir de cible de compilation qui peut être compilé pour s'exécuter à la vitesse native en tirant parti des capacités matérielles communes disponibles sur une large gamme de plates-formes, notamment mobile et IoT.

Quelques informations de base sur l'hôte et la cible, comment le langage de programmation est traduit en 10101010.

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. GCC convertit le code C / C ++ en code assembleur. Un outil appelé "assembleur" convertit le code assembleur en code machine et un outil appelé "éditeur de liens" connecte plusieurs fichiers de code machine en un seul fichier exécutable (.EXE sous Windows). La plupart de ces compilateurs vous permettent d'écrire le code assembleur résultant dans un fichier afin que vous puissiez consulter le code assembleur ou le modifier.

  2. L'assembleur et l'éditeur de liens font partie de la chaîne d'outils, ce qui signifie qu'ils sont généralement fournis avec le compilateur.

  3. Certains compilateurs (comme Microsoft) convertissent cependant directement le code C / C ++ en langage machine, donc aucun assembleur n'est plus nécessaire. Beaucoup de ces compilateurs ne sont pas en mesure de créer du code assembleur, vous ne pouvez donc pas écrire le code assembleur dans un fichier.

Soit dit en passant: il existe même des compilateurs (pas pour C / C ++, mais pour d'autres langages de programmation) qui créent directement un fichier .EXE, donc aucun éditeur de liens n'est requis.

WebAssembly: https://github.com/WebAssembly/design

danglingpointer
la source