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.