[Powered by Google Translate] ROB BOWDEN: Нека поговорим за компилатори.
До този момент, вие току-що сте написали изходен код в
някои файлове, да ги изпращат чрез тази голяма черна кутия, която е
Звъня, и отвън идва на изпълним файл, който
точно това, което пише в изходния си код.
Магически, тъй като това е било, ние ще погледнем по-
погледнете какво всъщност се случва
, когато се съставят досие.
И така, какво означава това за съставяне на нещо?
>> Е, в най-общия смисъл на думата, това просто означава
трансформиране код, написан в един
програмен език на друг.
Но обикновено, когато хората казват, че съставя нещо, те
означава, че те го от по-високо ниво на програмиране
език на по-ниско ниво на език за програмиране.
Това може да изглежда като много от субективна гледна точка.
Например, най-вероятно не мисля, че на C като високо
програмен език ниво, но вие я компилирате.
Но всичко е относително.
Както ще видим, монтажа код и в крайна сметка машината
код, който ние съставят до безспорно е по-ниско ниво
от C.
Въпреки, че ние ще се използва звъня в демонстрация днес,
много от идеите тук пренесе към други компилатори.
>> Звъня, има четири основни стъпки в цялостния
компилация.
Те са един, предварителна обработка, извършена от предпроцесорни, две,
компилация, извършена от компилатора, три, монтаж
от асемблер, и четири,
свързване от свързващия редактор.
Тя може да бъде объркващо, че един от substeps на цялостната
Звъня компилатори се нарича компилатор, но и
ние ще стигнем до това.
Ще се използва прост здравей програма за свят като нашия пример
целия този клип.
Нека да разгледаме.
>> Първата стъпка е предварителна обработка.
Какво предпроцесорни направя?
В почти всяка програма на C някога сте прочели или писмено,
сте използвали реда код, които започват с хашиш.
Ще се обадя на хашиш, но може също да го наричат ​​паунда, брой
подпише, или остър.
Всяка такава линия е препроцесор директива.
Вие вероятно сте виждали # определят и # включват преди, но има
са още няколко, че предпроцесорни признава.
Нека добавим # определят здравей нашия свят например.
Сега нека да тече само предпроцесорни по това досие.
С преминаване на clage-Е флаг, вие сте го инструктира да тече
само предпроцесорни.
Нека видим какво ще стане.
Тя изглежда като звъня само плюе всичко
в командния ред.
За да се запишете на този изход нов файл, наречен
hello2.c, ние ще добавим> hello2.c нашата команда.
Сега нека да разгледаме по предварителна обработка на файла.
>> Уау, какво се е случило на кратко нашата малка програма?
Ако отидем по целия път до дъното на този файл, ще видим
някои от кода, който всъщност е написал.
Забележете, че е отишъл # определят и всички случаи на име
са заменени с точно това, което е посочено в
# определят линия.
Така че какви са всички тези typedefs и функция декларации
в началото на файла?
Забележете, че # определят не е само предпроцесорни
Директива, че сме указали.
Ние също имаме # включват stdio.h.
Така че всички на луди линии всъщност са просто stdio.h копирани
и да се постави в горната част на този файл.
Ето защо заглавните файлове са толкова полезни за функцията
декларации.
Вместо да се налага да копирате и поставите на функцията
декларации за намерение за използване на най-горната част на вашия файл,
предпроцесорни ще ги копирате и поставяте от заглавието
подаде за вас.
>> Сега, че ние сме направили предварителна обработка, ние преминаваме в
компилация.
Причина ние се наричаме тази стъпка компилация е така, защото това е
етап, в който звъня действително съставянето от С до
монтаж код.
За да звъня съставят досие за монтаж, но
продължи не повече, мине-S флаг
в командния ред.
Нека да погледнем в събирателния
файл, който е изведен.
Тя изглежда като съвсем различен език.
Събрание кода е много процесор специфичен.
В този случай, тъй като CS50 уредът работи на
виртуална x86 процесор, това е x86 събрание код.
Много малко хора пишат директно в сглобяването код тези дни,
но всяка програма на C ли сте някога напиша получава трансформира
монтаж.
Отново, ние наричаме тази стъпка съставянето на C монтаж
тъй като ние сме от по-високо ниво по-ниско ниво
език за програмиране.
>> Това, което прави монтаж-ниско ниво от C?
Е, в монтажа, ние сме много ограничени в това, което можем да направим.
Има Не, ако, докато е на, е, или вериги от всякакъв вид.
Но можете да постигнете същите неща, които тези контролни
структури предлагат с ограничените операции
монтаж дава.
Но за да видите колко ниско ниво събрание наистина е, да вървим
една стъпка напред в нашата компилация, монтаж.
Това е работа на асемблер за трансформиране на код събрание
в обект или машинен код.
Не забравяйте, че на асемблер не извежда събрание;
а по-скоро е необходимо в монтажа и изходи машинен код.
Машинен код е действителната 1 и 0, че CPU
разбере, въпреки че все още имаме една малка част от работата оставяли
, преди да можем да изпълнявате нашата програма.
Да се ​​съберат на нашите монтажни код, чрез преминаване
Звъня-в знаме.
Сега нека видим какво има в сглобен файл.
>> Е, това не ни помогне много.
Не забравяйте, че машината кода е нули и единици, които
вашия компютър може да разбере.
Това не означава, че е лесно за нас да разберем.
Така че как точно ниско ниво е монтаж?
Той е почти идентичен с обектен код.
От монтаж на обектен код е много повече от
превод от трансформация, поради което
никой не може да разгледа асемблер да
направи всяко действително Компилиране.
В действителност, това е доста лесно ръчно да превежда от
монтаж на машинен код.
Търси в събирателния за основната функция, че първа линия
се случва да отговарят на шестнадесетични 0x55.
В двоичен, че е 1010101.
Вторият ред се случва да съответства шестнадесетичен 0x895.
И следващото, 0x56.
Като се има предвид сравнително проста таблица, можете да преведете
монтаж в кода, че машините могат да го разбере.
>> Така че има един останал стъпка в
компилация, която се свързва.
Свързването съчетава куп обектни файлове в един голям файл
че всъщност можете да изпълните.
Свързването е самата система зависи.
Така че най-лесният начин да звъня, за да се свърже обект
файлове заедно е да се обадите звъня на всички файлове, които
искате да се свържете заедно.
Ако зададете О файлове, то тогава няма да трябва да се подложи на повторна преработка,
съставяне и монтаж на изходен код.
Да хвърлят по математика функция в нашия файл, така че ние имаме
нещо, което да се свърже.
Сега нека да го компилирате до обектен код и
Обадете звъня на него.
Опа.
Тъй като сме включили функцията по математика, ние трябва да се обвърже
по математика библиотека с LM.
>> Ако искахме да се свържат заедно куп О файлове, които
пише на нашия собствен, щяхме само да уточним всички тях
командния ред.
Ограничението е, че само един от тези файлове трябва да
зададете основната функция, или пък
резултат изпълним няма да знаете откъде да започнете
управлението на вашия код.
Каква е разликата между задаване на файл, за да се свържете
с л и просто да посочите файла директно?
Нищо.
Това е просто, че звъня случва да знаете какво точно файл
нещо подобно-LM се случва, да се позове.
Ако знаехте, че файл себе си, можете да го зададете
изрично.
Само не забравяйте, че всички-L знамена трябва да дойдат в края
на търсенето на клиентите.
>> И това е всичко там е до него.
Когато просто звъня на някои файлове, това е това, което е
всъщност прави.
Моето име е Роб Боудън, и това е CS50.