[Powered by Google Translate] ROB Бауден: Ајде да зборуваме за компајлери.
До овој момент, сте само внеле вашиот изворен код во
во некои датотеки, ги испрати преку оваа голема црна кутија која е
Ѕвекот, и надвор доаѓа на вашиот извршна датотека која не
токму она што го напиша во вашиот изворен код.
Како магичен како што е создадено, ние ќе да се донесе поблиски
погледнеме во она што е навистина се случува
кога ќе состави датотека.
Па што значи тоа да ги собере нешто?
>> Па, во најопшта смисла, тоа само значи
трансформирање на код напишан во една
програмски јазик на друг.
Но обично кога луѓето велат дека ги собере нешто, тие
значи дека тие се земајќи го од повисоко ниво програмирање
јазик на пониско ниво програмскиот јазик.
Овие може да изгледа како многу субјективни услови.
На пример, што веројатно не мисли на C како високо
ниво програмски јазик, но вие не го компајлирате.
Но, сето тоа е релативна.
Како што ќе видиме, асемблерски код и на крајот машина
код кој ние ги собере до сомнение претставува пониско ниво
од В
Иако ние ќе биде со користење ѕвекот во демонстрациите денес,
многу од идеите тука носат во текот на други компајлери.
>> За ѕвекот, постојат четири главни чекори во целокупниот
компилација.
Овие се едни, препроцесирачка направено од страна на препроцесори, две,
компилација направено од страна на компајлерот, три, монтажа
направено од страна на асемблер, и четири,
поврзување направено од страна на linker.
Тоа може да биде збунувачки дека еден од substeps на целокупната
Ѕвекот компајлери се нарекува компајлер, но
ние ќе дојдеме до тоа.
Ние ќе биде со користење на едноставни Здраво светот програма како нашиот пример
во текот на оваа видео.
Ајде да ги разгледаме.
>> Првиот чекор е препроцесирачка.
Што значи препроцесори направи?
Во речиси секоја програма C некогаш сте прочитана или напишана,
сте користеле линии на код кој започнува со хаш.
Јас ќе го наречеме хаш, но вие исто така може да го наречеме фунти, број
потпише, или остри.
Секоја таква линија е препроцесори директивата.
Веројатно сте виделе # define и # include пред, но има
уште неколку дека препроцесори препознава.
Да додадете # define на нашите Здраво Светот пример.
Сега ајде да се кандидира само препроцесори на оваа датотека.
Со полагање clage на-Е знаме, ти си наложи да работи
само препроцесори.
Ајде да видиме што се случува.
Тоа изгледа како ѕвекот само плука се
на командната линија.
Со цел да се спаси сето ова излез на нов фајл наречен
hello2.c, ние ќе додадете> hello2.c на нашата команда.
Сега ајде да ги разгледаме во нашата preprocessed датотека.
>> Леле, што се случи со нашите кратки малку програма?
Ако одиме по целиот пат до дното на оваа датотека, ќе видиме
некои од код кој ние всушност го напишал.
Забележете дека # define е нема и сите инстанци на името
се заменува со точно она што е наведено во
на # define линија.
Значи она што се сите овие typedefs и функција декларации
на врвот на датотеката?
Забележете дека # define не беше само препроцесори
директивата дека одреден.
Ние, исто така, # include stdio.h.
Значи сите луди линии се всушност само stdio.h копирани
и атипичен во врвот на оваа датотека.
Тоа е зошто насловот датотеки се толку корисни за функција
декларации.
Наместо да има потреба да копирате и залепите сите на функцијата
декларации планирате за користење на врвот на вашата датотека,
препроцесори ќе копирајте го и ставете ги во насловот
датотека за вас.
>> Сега дека ние сме направиле препроцесирачка, се движиме кон
компилација.
Причината што ние го нарекуваме овој чекор компилација е затоа што ова е
чекор каде ѕвекот, всушност, не својата составувањето од C до
асемблерски код.
Со цел да се имаат ѕвекот состави датотека до собранието, но
продолжи нема понатаму, тоа го положат-S знаме
на командната линија.
Ајде да ги разгледаме во собранието
датотека која беше outputted.
Тоа изгледа како сосема различен јазик.
Асемблерски код е многу процесорот специфични.
Во овој случај, бидејќи CS50 апаратот работи на
виртуелен x86 процесор, ова е x86 асемблерски код.
Многу малку луѓе пишуваат директно во асемблерски код, овие денови,
но секоја програма Ц Дали некогаш сте се напише добива трансформираат надолу
во собранието.
Повторно, ние го нарекуваме овој чекор составувањето на C во собранието
бидејќи ние се случува од повисоко ниво на пониско ниво
програмскиот јазик.
>> Она што ја прави собранието пониско ниво од Ц?
Па, во собранието, ние сме многу ограничени во она што можеме да направиме.
Нема ако, додека е, за, или јамки на било кој вид.
Но може да се постигне истите работи што овие контролни
структури нудат користење на ограничени операции кои
собранието не се обезбеди.
Но, да се види само колку ниско ниво собранието навистина е, ајде да одиме
еден чекор понатаму во нашата компилација, монтажа.
Тоа е работа на асемблер да се трансформира асемблерски код
во објектот или машински код.
Запомнете дека асемблер не излез собранието;
а, тоа трае во собранието и излези машина код.
Машина кодот е вистинската 1 и 0 е дека процесорот може да
разбере, иако ние се уште имаат мал малку на работа остави
пред да може да работи нашата програма.
Да се ​​соберат нашите асемблерски код со полагање
Ѕвекот на-в знаме.
Сега да видиме со што е во собраа датотека.
>> Па, тоа не ни помогне многу.
Запомни што машина кодот е оние кои и нули дека
вашиот компјутер може да се разбере.
Тоа не значи дека тоа е лесно за нас да се разбере.
Значи точно колку ниско ниво собранието?
Тоа е речиси идентична со објектниот код.
Одејќи од собранието на објектниот код е многу повеќе од
превод од трансформација, која е причината зошто
никој не може да сметаат на асемблер да
направи било вистински составувањето.
Всушност, тоа е прилично лесен за рачно превод од
собранието на машински код.
Гледајќи собранието за главната функција, дека првата линија
се случува да одговараат на хексадецимално 0x55.
Во бинарна, тоа е 1.010.101.
Втората линија се случува да одговараат хексадецимален 0x895.
И следниот, 0x56.
Со оглед на релативно едноставна табела, можете да се преведе
собранието во кодот кој машини може да се разбере премногу.
>> Значи има една преостанатите чекор во
компилација, која се поврзува.
Поврзување комбинира еден куп на објектот датотеки во една голема датотека
што всушност може да се изврши.
Поврзување е самиот систем зависни.
Па најлесен начин да се добие ѕвекот само да водат објект
додадени фајлови заедно е да се јавите ѕвекот на сите датотеки кои
сакате да ги поврзе заедно.
Ако одредите. O датотеки, тогаш не ќе треба повторно да се процесуира,
собере, и се соберат сите на вашиот изворен код.
Ајде да фрли математика функција во нашата датотека, па имаме
нешто да се поврзе внатре
Сега ајде да го компајлирате назад до објектниот код и
јавете ѕвекот на неа.
Упс.
Бидејќи ние вклучени математика функција, ние треба да се поврзат во
математика библиотека со-филмот.
>> Ако сакавме да се поврзат заедно куп. O датотеки кои ние
напиша на нашите сопствени, ние само ќе си определи ги сите во
командната линија.
Ограничување е дека само еден од овие датотеки мора
всушност се определи основна функција, или на друго место на
резултира извршна не би знаеле каде да почнам
водење на вашиот код.
Која е разликата помеѓу утврдувањето датотека да се поврзат во
со-l и само да одредува датотека директно?
Ништо.
Тоа е само дека ѕвекот случува да знаат точно што датотека
нешто како-филмот се случува да се однесуваат.
Ако знаеше дека датотеката сами, можете да го одредите
експлицитно.
Само сети се дека сите л знамиња треба да дојде на крајот
на вашиот клиент побарувачка.
>> И тоа е сè што постои на неа.
Кога ли само ја стартувате ѕвекот на некои фајлови, тоа е она што е
всушност прави.
Моето име е Роб Бауден, и ова е CS50.