[Powered by Google Translate] ROB BOWDEN: Parlons de compilateurs.
Jusqu'à ce point, vous venez de saisir votre code source en
certains fichiers, les envoyer à travers cette grosse boîte noire qui est
Clang, et sort de votre fichier exécutable qui ne
exactement ce que vous avez écrit dans votre code source.
Aussi magique que cela a été, nous allons un peu plus près
Regardez ce qui se passe réellement
quand on compile un fichier.
Alors qu'est-ce que cela signifie pour compiler quelque chose?
>> Eh bien, dans le sens le plus général, cela signifie juste
transformation de code écrit dans une
le langage de programmation à l'autre.
Mais généralement, quand les gens disent qu'ils compiler quelque chose, ils
dire qu'ils le prendre à partir d'une programmation de niveau supérieur
langue pour un langage de programmation de niveau inférieur.
Ils semblent être des termes très subjectifs.
Par exemple, vous ne pensez probablement pas de C en haut
langage de programmation évolué, mais vous ne le compiler.
Mais tout est relatif.
Comme nous le verrons, le code assembleur et, finalement, la machine
code qui nous compilons jusqu'à constitue indéniablement un niveau inférieur
que C.
Bien que nous allons utiliser Clang dans la manifestation d'aujourd'hui, un
beaucoup des idées ici reporter sur d'autres compilateurs.
>> Pour Clang, il ya quatre étapes majeures dans l'ensemble
compilation.
Ce sont l'un, le prétraitement effectué par le préprocesseur, deux,
compilation effectuée par le compilateur; trois, l'assemblage
effectué par l'assembleur, et quatre,
reliant réalisé par l'éditeur de liens.
Il peut être déroutant que l'un des sous-étapes de l'ensemble
Compilateurs Clang est appelé le compilateur, mais
nous y reviendrons.
Nous allons utiliser un programme mondial bonjour simple comme notre exemple
tout au long de cette vidéo.
Jetons un coup d'oeil.
>> La première étape est de pré-traitement.
Qu'est-ce que le préprocesseur faire?
Dans presque tous les programme C vous avez déjà lu ou écrit,
vous avez utilisé des lignes de code qui commencent par un dièse.
Je vais l'appeler hachage, mais vous pouvez aussi l'appeler livres, le nombre
signer ou pointu.
Toute ligne telle est une directive de préprocesseur.
Vous avez probablement vu # define et # include avant, mais il
existe plusieurs autres que le préprocesseur reconnaît.
Ajoutons un # define pour notre exemple Bonjour tout le monde.
Maintenant, nous allons courir tout le préprocesseur dans ce dossier.
En passant CLAGE le drapeau de l'E-, vous lui ordonnant d'exécuter
tout le préprocesseur.
Voyons voir ce qui se passe.
Il ressemble à Clang crache juste hors tout
à la ligne de commande.
Afin de sauver l'ensemble de cette sortie vers un nouveau fichier appelé
hello2.c, nous allons ajouter> hello2.c à notre commande.
Maintenant, nous allons jeter un oeil à notre fichier prétraité.
>> Waouh, qu'est-ce qui est arrivé à notre petit programme court?
Si nous aller tout le chemin vers le bas de ce fichier, nous allons voir
une partie du code que nous avons effectivement écrit.
Notez que le # define a disparu et toutes les instances de nom
ont été remplacés par exactement ce que nous avons spécifié dans
la ligne # define.
Alors, quels sont tous ces redéfinitions et des déclarations de fonctions
au début du fichier?
Notez que le # define n'était pas seulement le préprocesseur
directive que nous avons spécifié.
Nous avons également # include stdio.h.
Donc, toutes les lignes folles sont en fait juste copié stdio.h
et collé dans le haut de ce fichier.
C'est pourquoi les fichiers d'en-tête sont si utiles pour la fonction
déclarations.
Au lieu d'avoir à copier et coller l'ensemble de la fonction
déclarations que vous prévoyez d'utiliser en haut de votre fichier, les
préprocesseur copiez et collez-les à partir de l'en-tête
déposer pour vous.
>> Maintenant que nous avons terminé le prétraitement, nous passons
compilation.
La raison pour laquelle nous appelons cette compilation étape est parce que c'est
l'étape où Clang ne fait sa compilation de C à
code assembleur.
Afin d'avoir Clang compiler un fichier vers le bas pour l'assemblage, mais
continuera pas plus loin, passer le drapeau S-
à la ligne de commande.
Jetons un coup d'oeil à l'assemblée
fichier qui a été émis.
Il ressemble à un tout autre langage.
Code assembleur est très spécifique au processeur.
Dans ce cas, puisque l'appareil CS50 est exécuté sur un
virtuelle des processeurs x86, il s'agit du code assembleur x86.
Très peu de gens écrire directement dans le code assembleur de nos jours,
mais chaque programme C vous écrit se transforme vers le bas
dans l'assemblage.
Encore une fois, nous appelons cette étape compiler du C dans l'assemblage
puisque nous allons partir d'un niveau supérieur à un niveau inférieur
le langage de programmation.
>> Ce qui rend niveau de l'assemblage inférieure à C?
Eh bien, dans l'assemblage, nous sommes très limités dans ce que nous pouvons faire.
Il n'ya pas de cas, tandis que, pour les boucles, ou de toute sorte.
Mais vous pouvez accomplir les mêmes choses que celles-ci contrôle
structures offrent l'aide des opérations limitées
assemblage fournit.
Mais de voir à quel assemblage de niveau bas est vraiment, allons-y
un pas de plus dans notre compilation, l'assemblage.
C'est le travail de l'assembleur pour transformer le code assembleur
en objet ou code machine.
Rappelez-vous que l'assembleur ne assembly de sortie;
au contraire, elle prend dans l'assemblage et le code machine sorties.
Code machine est la réelle 1 et de 0 qu'une CPU peut
comprendre, même si nous avons encore un petit peu de travail à gauche
avant que nous puissions lancer notre programme.
Nous allons monter notre code assembleur en passant
Clang c-drapeau.
Maintenant, nous allons voir ce qu'il ya dans le dossier constitué.
>> Eh bien, cela ne nous aide pas beaucoup.
Rappelez-vous que le code machine sont les uns et de zéros que
votre ordinateur peut comprendre.
Cela ne signifie pas que c'est facile pour nous de comprendre.
Donc exactement comment le faible niveau est l'Assemblée?
Il est presque identique au code objet.
Aller de l'assemblage à code objet est beaucoup plus d'un
Traduction qu'une transformation, ce qui explique pourquoi
on peut pas considérer l'assembleur
faire une réelle compilation.
En fait, il est assez facile de traduire manuellement à partir
assembly en code machine.
En regardant l'assemblée pour une fonction principale, cette première ligne
arrive à correspondre à 0x55 en hexadécimal.
En binaire, c'est 1010101.
La deuxième ligne qui arrive à correspondre 0x895 hexadécimal.
Et l'autre, 0x56.
Étant donné un tableau relativement simple, vous pourriez traduire
ensemble dans le code que les machines peuvent comprendre aussi.
>> Donc, il ya une étape restante de
compilation, qui relie.
Lier combine un ensemble de fichiers objets dans un grand dossier
que vous pouvez réellement exécuter.
Cette liaison est très dépendant du système.
Donc, la meilleure façon d'obtenir Clang juste un lien à l'objet
fichiers ensemble est d'appeler Clang sur tous les fichiers que
vous voulez relier.
Si vous spécifiez. Fichiers o, alors il ne sera pas nécessaire de retraiter,
compiler et assembler l'ensemble de votre code source.
Jetons une fonction mathématique dans notre fichier, nous avons donc
quelque chose à relier po
Maintenant, nous allons compiler retour en code objet et
Clang appeler sur elle.
Oops.
Depuis, nous avons inclus une fonction mathématique, nous devons lier dans
la bibliothèque mathématique avec-lm.
>> Si nous voulions relier tas de fichiers. O que nous
écrit par nous-mêmes, nous venions de les préciser tout à l'
ligne de commande.
La restriction est que seul de ces fichiers doit
fait de spécifier une fonction principale, sinon la
exécutable qui en résulte ne saurais pas par où commencer
l'exécution de votre code.
Quelle est la différence entre la spécification d'un fichier à lier dans
avec-l et juste spécifier un fichier directement?
Rien.
C'est juste que Clang arrive à savoir exactement ce fichier
quelque chose comme-lm arrive à se référer.
Si vous saviez ce fichier vous-même, vous pouvez le spécifier
explicitement.
N'oubliez pas que tout l drapeaux doivent venir à la fin
de votre demande de ses clients.
>> Et c'est tout ce qu'il ya à faire.
Lorsque vous lancez simplement Clang sur certains fichiers, c'est ce que c'est
en train de faire.
Mon nom est Rob Bowden, et c'est CS50.