[Powered by Google Translate] РОБ Бовден: Хајде да причамо о компајлерима.
До овог тренутка, управо сте уписали свој изворни код у
неки фајлови, да их шаље кроз ове велике црне кутије која је
Цланг, а од долази своју извршну датотеку која чини
тачно оно што сте написали у свом изворном коду.
Као магични као да је прошло, идемо да се ближе
погледајте шта се заправо дешава
када смо саставити фајл.
Дакле, шта то значи да се састави нешто?
>> Па, у најопштијем смислу, то само значи
трансформише код написан на једном
програмирање језика на други.
Али обично када људи кажу да састави несто, они
значи они то узимање из вишег нивоа програмирања
језика на нижем нивоу језику програмирања.
Ово може изгледати као врло субјективним условима.
На пример, вероватно не мисле о Ц, као високи
Ниво програмски језик, али ти га компајлирате.
Али то је све релативно.
Као што ћемо видети, скупштина код и евентуално машина
код који смо саставити до недвосмислено нижи ниво
него Ц.
Иако ћемо користити кланг у демонстрацијама данашњем
Много идеја овде пренети другим компајлерима.
>> За цланг, постоје четири главна корака у укупној
компилација.
То су један, предобрада урадио Претпроцесор, два,
компилација врши компајлера, три, монтажа
врши монтера и четири,
повезивање врши Линкер.
То може бити збуњујуће да је један од субстепс целокупне
Цланг компајлери се зове компајлер, али
ћемо доћи до тога.
Ми ћемо користити једноставне Хелло Ворлд програм као пример
у овом видеу.
Хајде да погледамо.
>> Први корак је предобрада.
Шта Претпроцесор уради?
У скоро сваки Ц програм који сте икада прочитали или писмено,
Пробао си линије кода које почињу са хашиш.
Позваћу га хасх, али такође може назвати фунти, број
потпише, или оштра.
Свака таква линија је Претпроцесор директива.
Вероватно сте видели # дефине и # укључују раније, али постоји
су још неколико да Претпроцесор препознаје.
Хајде да додамо # дефине нашем примеру хелло свету.
Сада хајде да само Препроцессор на овом фајлу.
Доношењем цлаге-е заставу, ти си налаже да се покрене
Управо Претпроцесор.
Хајде да видимо шта се дешава.
Изгледа кланг само избацује све
у командној линији.
Да би сачували све ове излаза на нови фајл под називом
хелло2.ц ћемо додати> хелло2.ц нашој команди.
Сада ћемо да погледамо нашу обрађеном датотеке.
>> Вау, шта се десило са нашим кратким мало програма?
Ако идемо скроз на дно ове датотеке, видећемо
неке од кода који заправо написао.
Приметимо да је # дефине је отишао и све инстанце имена
замењене су тачно оно што је наведено у
# дефине линију.
Дакле, шта су сви ови типедефс и функција декларације
на врху фајла?
Приметимо да је # дефине није био једини Претпроцесор
директива које смо навели.
Такође смо # инцлуде стдио.х.
Дакле, сви луде линија су заправо само копирају стдио.х
и налепљен на врху ове датотеке.
Зато хеадер фајлови су толико корисна за функцију
декларације.
Уместо потребе да копирате и налепите све функције
декларације планирате да користите на врху датотеке,
Претпроцесор ће копирајте и налепите их из заглавља
поднети за вас.
>> Сада када смо завршили копање, ми прелазимо на
компилација.
Разлог што ми зовемо овај корак компилацију зато је ово
корак где кланг заправо његова састављања од Ц до
асемблерског кода.
Да би кланг састави датотеку ниже на окупљање, али
настави даље, да прође-С застава
у командној линији.
Хајде да погледамо на скупштини
датотека која је излазног.
Изгледа сасвим другом језику.
Скупштина код је врло специфичан процесор.
У овом случају, пошто је ЦС50 апарат ради на
виртуелна к86 процесор, ово је к86 асемблерског кода.
Веома мали број људи пишу директно у скупштини код ових дана,
али сваки Ц програм који је икада написати бива трансформисана доле
у скупштини.
Опет, ми зовемо овај корак Компајлирање Ц у скупштини
јер ћемо са вишег нивоа на нижи ниво
програмском језику.
>> Шта чини скупштина нижи ниво од Ц?
Па, у скупштини, веома смо ограничени у ономе што можемо да урадимо.
Нема ако, док је, за то, или петље било које врсте.
Али можете постићи исте ствари које они контрола
структуре нуде користећи ограничене операције које
Скупштина не дају.
Али да видимо колико ниско ниво скупштина заиста јесте, идемо
један корак даље у нашем компилацију, монтажа.
То је асемблер посао да трансформише код скупштине
у објекат или машински код.
Запамтите да асемблер не излазни склоп;
уместо тога, она узима у скупштини и излаза машине кода.
Машина код је стварни 1 и 0 је да процесор може
Разумем, иако и даље имамо мали мало рада остало
пре него што може да се покрене наш програм.
Хајде да окупи нашу скупштину код доношењем
Цланг ц застава.
Хајде сада да видимо шта је у састављеног фајлу.
>> Па, то нам не помаже много.
Запамтите да машина код оне и нуле да
Ваш рачунар може да разуме.
То не значи да је лако за нас да разумемо.
Па тачно колико ниско ниво је скупштина?
То је скоро идентичан објектним кодом.
Идући од окупљања објектном коду је много више
Превод од трансформације, због чега је
не могу да се сматрају асемблер
урадите било стварну састављања.
У ствари, то је прилично лако ручно превођење из
Скупштина на машински код.
Гледајући скупштини за главну функцију, да прва линија
се дешава да одговарају хексадецималних 0к55.
У бинарном, то је 1010101.
Друга линија се дешава да одговарају хексадецимални 0к895.
И следећи, 0к56.
С обзиром релативно једноставна табела, можете да преведете
Скупштина у коду који може да разуме машине превише.
>> Дакле, постоји један преостали корак у
компилације, која се повезује.
Повезивање комбинује гомилу објеката фајлова у један велики фајл
да ли заиста може да се изврши.
Повезивање је веома зависи од система.
Дакле, најлакши начин да се јека само да повеже објекат
фајлове заједно да позовете кланг на све фајлове које
желите да заједно повезати.
Ако наведете чега: фајлове., Онда неће морати да репроцесс,
саставити, и монтирамо све ваше изворног кода.
Хајде да баци неку функцију из математике у нашој датотеци, тако да имамо
нешто да повеже унутра
Сада хајде да састави назад на објектном коду и
позовите цланг на њега.
Упс.
Пошто смо укључени из математике функцију, потребно је да повежете на
математика библиотека са-лм.
>> Ако бисмо хтели да повежу гомилу. О фајлови који смо
написао сами, ми смо само бих навести их све у
командна линија.
Ограничење је да само један од тих фајлова мора
заправо одредите главну функцију, или друго
резултира извршна не би знао одакле да почнем
ради свој код.
Која је разлика између наводећи датотеку за повезивање у
са-ја и само наводећи директно слику?
Ништа.
То је само да кланг дешава да тачно знате шта датотеку
Нешто слично се дешава да лм односе.
Ако сте знали тај фајл себе, можете да га наведете
експлицитно.
Само запамтите да све заставе л морају да долазе на крају
вашег клијента тражње.
>> И то је све што је потребно.
Када покренете само на неким фајловима кланг, то је оно што је
заправо ради.
Моје име је Роб Бовден, а ово је ЦС50.