[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.