1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB Боуден: Давайте поговоримо про компіляторах. 2 00:00:09,100 --> 00:00:11,490 До цього моменту, ви тільки що ввели ваш вихідний код в 3 00:00:11,490 --> 00:00:14,260 деякі файли, послав їх через цей великий чорний ящик, який є 4 00:00:14,260 --> 00:00:16,890 Clang, і з приходить на ваш виконуваний файл, що робить 5 00:00:16,890 --> 00:00:19,430 саме те, що ви написали у вашому вихідному коді. 6 00:00:19,430 --> 00:00:22,170 Як магічний, як і було, ми збираємося, щоб ближче 7 00:00:22,170 --> 00:00:23,590 подивимося, що відбувається насправді 8 00:00:23,590 --> 00:00:25,220 Коли ми компіляції файлу. 9 00:00:25,220 --> 00:00:28,580 Так що ж це значить для компіляції щось? 10 00:00:28,580 --> 00:00:31,150 >> Ну, в самому загальному сенсі, це просто означає, 11 00:00:31,150 --> 00:00:32,580 перетворенню коду, написаного в одному 12 00:00:32,580 --> 00:00:34,680 мови програмування на іншу. 13 00:00:34,680 --> 00:00:37,550 Але зазвичай, коли люди кажуть, що вони компілювати небудь, вони 14 00:00:37,550 --> 00:00:39,660 значить, вони беруть його від більш високого рівня програмування 15 00:00:39,660 --> 00:00:42,460 мови на більш низьку мову програмування високого рівня. 16 00:00:42,460 --> 00:00:44,960 Це може здатися дуже суб'єктивним умовах. 17 00:00:44,960 --> 00:00:48,090 Наприклад, ви, ймовірно, не думають про С, як висока 18 00:00:48,090 --> 00:00:51,440 рівні мови програмування, але Ви його компіляції. 19 00:00:51,440 --> 00:00:52,730 Але це все відносно. 20 00:00:52,730 --> 00:00:55,790 Як ми побачимо, код збірки і в кінцевому підсумку машина 21 00:00:55,790 --> 00:00:59,270 коду, який ми збираємо до, безсумнівно, більш низького рівня 22 00:00:59,270 --> 00:01:00,700 ніж C. 23 00:01:00,700 --> 00:01:03,310 Хоча ми будемо використовувати Clang в сьогоднішній демонстрації, 24 00:01:03,310 --> 00:01:06,360 Багато ідей тут переносяться на інші компілятори. 25 00:01:06,360 --> 00:01:09,160 >> Для Clang, існують чотири основних етапи в загальному 26 00:01:09,160 --> 00:01:10,200 компіляцію. 27 00:01:10,200 --> 00:01:15,430 Це один, попередня обробка зробити препроцесором, два, 28 00:01:15,430 --> 00:01:19,530 компіляція робиться компілятором, три, монтаж 29 00:01:19,530 --> 00:01:22,010 зроблено асемблері, і чотири, 30 00:01:22,010 --> 00:01:24,640 зв'язуючий зроблено компонувальника. 31 00:01:24,640 --> 00:01:27,600 Це може ввести в оману, що одним з Подшаг загального 32 00:01:27,600 --> 00:01:30,980 Clang компілятори називають компілятором, але 33 00:01:30,980 --> 00:01:32,530 Ми повернемося до цього. 34 00:01:32,530 --> 00:01:35,050 Ми будемо використовувати просту програму привіт світ, як наш приклад 35 00:01:35,050 --> 00:01:36,270 протягом усього цього відео. 36 00:01:36,270 --> 00:01:38,380 Давайте подивимося. 37 00:01:38,380 --> 00:01:40,330 >> На першому етапі попередньої обробки. 38 00:01:40,330 --> 00:01:42,520 Що препроцесор робити? 39 00:01:42,520 --> 00:01:45,560 В значній мірі кожна програма C ви коли-небудь читали або письмовій формі, 40 00:01:45,560 --> 00:01:48,310 Ви використовували рядків коду, які починаються з хеш. 41 00:01:48,310 --> 00:01:51,730 Я буду називати його хеш, але ви також можете називати це фунтах, кількість 42 00:01:51,730 --> 00:01:53,280 підписатися, або гострим. 43 00:01:53,280 --> 00:01:56,840 Будь-яка така рядок є директивою препроцесора. 44 00:01:56,840 --> 00:02:00,650 Ви, напевно, бачили # # визначати і включати раніше, але 45 00:02:00,650 --> 00:02:03,690 дещо більше, що препроцесор визнає. 46 00:02:03,690 --> 00:02:07,340 Давайте додамо # визначити нашому прикладу привіт всьому світі. 47 00:02:07,340 --> 00:02:11,690 Тепер давайте запустимо просто препроцесор на цей файл. 48 00:02:11,690 --> 00:02:16,150 По мимо clage прапора-E, ви доручивши йому працювати 49 00:02:16,150 --> 00:02:17,880 просто препроцесор. 50 00:02:17,880 --> 00:02:19,130 Давайте подивимося, що відбувається. 51 00:02:22,250 --> 00:02:24,020 Схоже, Clang просто випльовує все 52 00:02:24,020 --> 00:02:25,200 в командному рядку. 53 00:02:25,200 --> 00:02:27,800 Для того, щоб зберегти все це висновок в новий файл з ім'ям 54 00:02:27,800 --> 00:02:33,850 hello2.c, ми будемо додавати> hello2.c на нашу команду. 55 00:02:33,850 --> 00:02:37,800 Тепер давайте поглянемо на нашу попередньо обробленого файлу. 56 00:02:37,800 --> 00:02:40,810 >> Гей, що сталося з нашою коротенькій програми? 57 00:02:40,810 --> 00:02:43,890 Якщо пройти весь шлях до дна цей файл, ми побачимо, 58 00:02:43,890 --> 00:02:46,070 частина коду, що ми насправді написав. 59 00:02:46,070 --> 00:02:49,800 Зверніть увагу, що # визначити пішов, і всі екземпляри ім'я 60 00:02:49,800 --> 00:02:51,950 були замінені саме те, що ми вказали в 61 00:02:51,950 --> 00:02:53,590 # Визначити лінію. 62 00:02:53,590 --> 00:02:56,530 Так що всі ці визначення типів і опису функцій 63 00:02:56,530 --> 00:02:58,140 у верхній частині файлу? 64 00:02:58,140 --> 00:03:00,820 Зверніть увагу, що # визначити не тільки препроцесор 65 00:03:00,820 --> 00:03:02,390 директиви, які ми вказали. 66 00:03:02,390 --> 00:03:05,280 Ми також включає stdio.h #. 67 00:03:05,280 --> 00:03:09,560 Так що всі божевільні лінії насправді просто скопіював stdio.h 68 00:03:09,560 --> 00:03:11,810 і вставлені у верхній частині цього файлу. 69 00:03:11,810 --> 00:03:14,110 Саме тому файли заголовків так корисні для функції 70 00:03:14,110 --> 00:03:15,160 деклараціями. 71 00:03:15,160 --> 00:03:17,740 Замість того, щоб копіювати і вставляти всі функції 72 00:03:17,740 --> 00:03:21,050 деклараціях ви плануєте використовувати у верхній частині вашого файлу, 73 00:03:21,050 --> 00:03:22,990 препроцесор скопіюйте і вставте їх із заголовка 74 00:03:22,990 --> 00:03:24,140 файл для вас. 75 00:03:24,140 --> 00:03:26,480 >> Тепер, коли ми закінчили первинну обробку, ми перейдемо до 76 00:03:26,480 --> 00:03:27,680 компіляцію. 77 00:03:27,680 --> 00:03:30,725 Тому ми називаємо цей крок компіляції, тому що це 78 00:03:30,725 --> 00:03:34,130 етап, на якому Clang насправді його складання від З до 79 00:03:34,130 --> 00:03:35,370 асемблері. 80 00:03:35,370 --> 00:03:38,280 Для того щоб мати Clang компіляції файлу до збірки, але 81 00:03:38,280 --> 00:03:42,030 продовжувати далі, передайте його-S прапор 82 00:03:42,030 --> 00:03:43,560 в командному рядку. 83 00:03:43,560 --> 00:03:44,790 Давайте поглянемо на збірку 84 00:03:44,790 --> 00:03:47,390 файл, який був сигнал. 85 00:03:47,390 --> 00:03:49,740 Схоже, зовсім інша мова. 86 00:03:49,740 --> 00:03:52,660 Асамблея код дуже конкретного процесора. 87 00:03:52,660 --> 00:03:55,440 У цьому випадку, оскільки CS50 прилад працює на 88 00:03:55,440 --> 00:04:00,470 віртуальним x86-процесор, це x86-код збірки. 89 00:04:00,470 --> 00:04:03,450 Дуже небагато людей пишуть прямо на асемблері в ці дні, 90 00:04:03,450 --> 00:04:06,490 але кожна програма C Ви коли-небудь написати перетвориться вниз 91 00:04:06,490 --> 00:04:07,940 в збірці. 92 00:04:07,940 --> 00:04:11,440 Знову ж таки, ми називаємо цей крок компіляції C в збірці 93 00:04:11,440 --> 00:04:14,170 оскільки ми збираємося з більш високого рівня на більш низький рівень 94 00:04:14,170 --> 00:04:15,480 мова програмування. 95 00:04:15,480 --> 00:04:17,880 >> Те, що робить збірку більш низькому рівні, ніж C? 96 00:04:17,880 --> 00:04:21,660 Ну, в зборі, ми дуже обмежені в тому, що ми можемо зробити. 97 00:04:21,660 --> 00:04:25,120 Є немає, якщо, в той час, бо, або петлі будь-якого роду. 98 00:04:25,120 --> 00:04:27,560 Але ви можете зробити те ж саме, що ці контролем 99 00:04:27,560 --> 00:04:30,270 структури пропонують використання обмежених операцій, 100 00:04:30,270 --> 00:04:32,350 збірка не передбачає. 101 00:04:32,350 --> 00:04:35,960 Але щоб зрозуміти, як низько рівні зборки насправді, давайте 102 00:04:35,960 --> 00:04:39,320 ще один крок вперед в нашій компіляції, збирання. 103 00:04:39,320 --> 00:04:41,890 Це робота складальником, щоб перетворити код збірки 104 00:04:41,890 --> 00:04:44,740 в об'єкт або машинний код. 105 00:04:44,740 --> 00:04:47,610 Пам'ятайте, що асемблер не виводить зборів; 106 00:04:47,610 --> 00:04:51,080 скоріше, він приймає в збірці і виходи машинний код. 107 00:04:51,080 --> 00:04:54,040 Машинний код є фактичним 1 і 0, що процесор може 108 00:04:54,040 --> 00:04:57,290 розумію, хоча в нас ще є трохи залишив роботу 109 00:04:57,290 --> 00:04:59,380 перш ніж ми зможемо виконати нашу програму. 110 00:04:59,380 --> 00:05:01,400 Давайте збирати наші збірки коду, передавши 111 00:05:01,400 --> 00:05:04,080 Прапор Clang-C. 112 00:05:04,080 --> 00:05:06,410 Тепер давайте подивимося, що знаходиться в зібраному файл. 113 00:05:06,410 --> 00:05:09,220 >> Добре, що не допомагає нам дуже багато. 114 00:05:09,220 --> 00:05:11,340 Пам'ятайте, що машина коду нулів і одиниць, що 115 00:05:11,340 --> 00:05:13,240 Ваш комп'ютер може зрозуміти. 116 00:05:13,240 --> 00:05:16,080 Це не означає, що це легко для нас, щоб зрозуміти. 117 00:05:16,080 --> 00:05:19,160 Так як саме низький рівень складання? 118 00:05:19,160 --> 00:05:21,480 Це майже ідентично об'єктний код. 119 00:05:21,480 --> 00:05:24,300 Перехід від збірки в об'єктний код набагато більше 120 00:05:24,300 --> 00:05:27,540 Переклад, ніж перетворення, тому 121 00:05:27,540 --> 00:05:29,310 ніхто не може розглянути асемблеру 122 00:05:29,310 --> 00:05:31,400 робити будь-які фактичні компіляції. 123 00:05:31,400 --> 00:05:34,110 Насправді, це досить легко вручну переводити з 124 00:05:34,110 --> 00:05:36,050 збірки у машинний код. 125 00:05:36,050 --> 00:05:39,040 Дивлячись на збірку для основної функції, що перша лінія 126 00:05:39,040 --> 00:05:42,100 буває, щоб відповідати шістнадцяткове 0x55. 127 00:05:42,100 --> 00:05:45,470 У двійковій, це 1010101. 128 00:05:45,470 --> 00:05:49,300 У другому рядку відбувається відповідають шістнадцятковій 0x895. 129 00:05:49,300 --> 00:05:51,290 А на наступний, 0x56. 130 00:05:51,290 --> 00:05:53,730 Враховуючи порівняно просту таблицю, ви можете переводити 131 00:05:53,730 --> 00:05:57,130 збірку в коді, що машини можуть зрозуміти теж. 132 00:05:57,130 --> 00:05:58,810 >> Так що один залишився крок в 133 00:05:58,810 --> 00:06:01,150 компіляцію, яка пов'язує. 134 00:06:01,150 --> 00:06:04,530 Зразки поєднує в собі купу об'єктних файлів в один великий файл 135 00:06:04,530 --> 00:06:06,380 що ви реально можете виконати. 136 00:06:06,380 --> 00:06:08,570 Зразки дуже залежить від системи. 137 00:06:08,570 --> 00:06:11,030 Таким чином, найпростіший спосіб отримати Clang просто зв'язати об'єкт 138 00:06:11,030 --> 00:06:13,920 Файли Разом є дзвонити Clang на всіх файлів, які 139 00:06:13,920 --> 00:06:15,190 Ви хочете, щоб зв'язати разом. 140 00:06:15,190 --> 00:06:18,740 Якщо ви вкажете. Про файлах, то не потрібно буде переробляти, 141 00:06:18,740 --> 00:06:21,680 компілювати і збирати всі ваші вихідним кодом. 142 00:06:21,680 --> 00:06:23,960 Давайте кидати математичні функції в нашому файлі, так що у нас є 143 00:06:23,960 --> 00:06:25,210 щось, щоб зв'язати дюйма 144 00:06:34,220 --> 00:06:37,010 Тепер давайте збирати його назад в об'єктний код і 145 00:06:37,010 --> 00:06:38,260 дзвоніть Clang на ньому. 146 00:06:40,560 --> 00:06:41,420 Ой. 147 00:06:41,420 --> 00:06:43,790 Так як ми включали математичні функції, нам треба зв'язати в 148 00:06:43,790 --> 00:06:46,610 математичну бібліотеку з-лм. 149 00:06:46,610 --> 00:06:48,990 >> Якщо ми хочемо зв'язати воєдино купу. Висновку файлів, які ми 150 00:06:48,990 --> 00:06:51,420 написав на наші власні, ми б просто вказати їх усі в 151 00:06:51,420 --> 00:06:52,460 командного рядка. 152 00:06:52,460 --> 00:06:55,320 Обмеженням є те, що тільки один з цих файлів повинні 153 00:06:55,320 --> 00:06:57,790 насправді визначити основні функції, або 154 00:06:57,790 --> 00:06:59,930 отриманий виконуваний файл не знаєте з чого почати 155 00:06:59,930 --> 00:07:00,910 працює ваш код. 156 00:07:00,910 --> 00:07:03,360 У чому різниця між зазначенням файл по посиланню в 157 00:07:03,360 --> 00:07:06,600 з-л, а просто вказавши файл безпосередньо? 158 00:07:06,600 --> 00:07:07,440 Нічого. 159 00:07:07,440 --> 00:07:09,850 Це просто, що Clang відбувається точно знати, який файл 160 00:07:09,850 --> 00:07:12,560 щось на зразок-LM відбувається ставляться. 161 00:07:12,560 --> 00:07:14,700 Якби ви знали, що файл самостійно, ви можете вказати його 162 00:07:14,700 --> 00:07:15,930 в явному вигляді. 163 00:07:15,930 --> 00:07:18,990 Просто пам'ятайте, що всі л прапори повинні прийти в кінці 164 00:07:18,990 --> 00:07:20,770 Вашого клієнта попит. 165 00:07:20,770 --> 00:07:22,300 >> І це все, що потрібно зробити. 166 00:07:22,300 --> 00:07:24,940 Якщо ви просто запустіть Clang на деякі файли, це те, що це 167 00:07:24,940 --> 00:07:26,350 насправді робить. 168 00:07:26,350 --> 00:07:29,490 Мене звуть Боб Боуден, і це CS50.