1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB BOWDEN: Нека поговорим за компилатори. 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 Звъня, и отвън идва на изпълним файл, който 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 Например, най-вероятно не мисля, че на C като високо 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 Въпреки, че ние ще се използва звъня в демонстрация днес, 24 00:01:03,310 --> 00:01:06,360 много от идеите тук пренесе към други компилатори. 25 00:01:06,360 --> 00:01:09,160 >> Звъня, има четири основни стъпки в цялостния 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 Тя може да бъде объркващо, че един от substeps на цялостната 32 00:01:27,600 --> 00:01:30,980 Звъня компилатори се нарича компилатор, но и 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-Е флаг, вие сте го инструктира да тече 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 Тя изглежда като звъня само плюе всичко 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 Така че какви са всички тези typedefs и функция декларации 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 етап, в който звъня действително съставянето от С до 79 00:03:34,130 --> 00:03:35,370 монтаж код. 80 00:03:35,370 --> 00:03:38,280 За да звъня съставят досие за монтаж, но 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, че CPU 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 Звъня-в знаме. 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 Така че най-лесният начин да звъня, за да се свърже обект 138 00:06:11,030 --> 00:06:13,920 файлове заедно е да се обадите звъня на всички файлове, които 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 Обадете звъня на него. 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 по математика библиотека с LM. 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 Това е просто, че звъня случва да знаете какво точно файл 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 Само не забравяйте, че всички-L знамена трябва да дойдат в края 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 Когато просто звъня на някои файлове, това е това, което е 167 00:07:24,940 --> 00:07:26,350 всъщност прави. 168 00:07:26,350 --> 00:07:29,490 Моето име е Роб Боудън, и това е CS50.