[Powered by Google Translate] ROB Боуден: Давайце пагаворым аб кампілятарах. Да гэтага моманту, вы толькі што ўвялі ваш зыходны код у некаторыя файлы, паслаў іх праз гэты вялікі чорны скрыню, які з'яўляецца Clang, і з прыходзіць на ваш выкананы файл, што робіць менавіта тое, што вы напісалі ў вашым зыходным кодзе. Як магічны, як і было, мы збіраемся, каб бліжэй паглядзім, што адбываецца на самай справе Калі мы кампіляцыі файла. Дык што ж гэта значыць для кампіляцыі нешта? Ну, у самым агульным сэнсе, гэта проста азначае, пераўтварэнню кода, напісанага ў адным мовы праграмавання на іншы. Але звычайна, калі людзі кажуць, што яны кампіляваць што-небудзь, яны значыць, яны бяруць яго ад больш высокага ўзроўню праграмавання мовы на больш нізкую мова праграмавання высокага ўзроўню. Гэта можа здацца вельмі суб'ектыўным умовах. Напрыклад, вы, верагодна, не думаюць пра С, як высокая ўзроўні мовы праграмавання, але Вы яго кампіляцыі. Але гэта ўсё адносна. Як мы ўбачым, код зборкі і ў канчатковым выніку машына кода, які мы збіраем да, несумненна, больш нізкага ўзроўню чым C. Хоць мы будзем выкарыстоўваць Clang ў сённяшняй дэманстрацыі, Шмат ідэй тут пераносяцца на іншыя кампілятары. Для Clang, існуюць чатыры асноўных этапу ў агульным кампіляцыю. Гэта адзін, папярэдняя апрацоўка зрабіць препроцессором, два, кампіляцыя робіцца кампілятарам, тры, мантаж зроблена асэмблеры, і чатыры, злучае зроблена кампаноўніка. Гэта можа ўвесці ў зман, што адным з подшагов агульнага Clang кампілятары называюць кампілятарам, але Мы вернемся да гэтага. Мы будзем выкарыстоўваць простую праграму прывітанне свет, як наш прыклад на працягу ўсяго гэтага відэа. Давайце паглядзім. На першым этапе папярэдняй апрацоўкі. Што препроцессор рабіць? У значнай ступені кожная праграма C вы калі-небудзь чыталі ці пісьмовай форме, Вы выкарыстоўвалі радкоў кода, якія пачынаюцца з хэш. Я буду называць яго хэш, але вы таксама можаце называць гэта фунтах, колькасць падпісацца, або вострым. Любая такая радок з'яўляецца дырэктывай препроцессора. Вы, напэўна, бачылі # # вызначаць і ўключаць раней, але некалькі больш, што препроцессор прызнае. Давайце дадамо # вызначыць нашаму прыкладу прывітанне ўсім свеце. Зараз давайце запусцім проста препроцессор на гэты файл. Па міма clage сцяга-E, вы даручыўшы яму працаваць проста препроцессор. Давайце паглядзім, што адбываецца. Падобна на тое, Clang проста выплёўвае ўсё у камандным радку. Для таго, каб захаваць усё гэта выснова ў новы файл з імем hello2.c, мы будзем дадаваць> hello2.c на нашу каманду. Зараз давайце зірнем на нашу папярэдне апрацаванага файла. Гэй, што адбылося з нашай кароценькай праграмы? Калі прайсці ўвесь шлях да дна гэты файл, мы ўбачым, частка кода, што мы на самай справе напісаў. Звярніце ўвагу, што # вызначыць сышоў, і ўсе асобнікі імя былі заменены менавіта тое, што мы паказалі ў # Вызначыць лінію. Так што ўсе гэтыя вызначэння тыпаў і апісання функцый у верхняй частцы файла? Звярніце ўвагу, што # вызначыць не толькі препроцессор дырэктывы, якія мы паказалі. Мы таксама ўключае stdio.h #. Так што ўсе вар'яты лініі на самай справе проста скапіяваў stdio.h і ўстаўлены ў верхняй часткі гэтага файла. Менавіта таму файлы загалоўкаў так карысныя для функцыі дэкларацыямі. Замест таго, каб капіяваць і ўстаўляць усе функцыі дэкларацыях вы плануеце выкарыстаць у верхняй частцы вашага файла, препроцессор скапіруйце і ўстаўце іх з загалоўка файл для вас. Цяпер, калі мы скончылі першасную апрацоўку, мы пяройдзем да кампіляцыю. Таму мы называем гэты крок кампіляцыі, таму што гэта этап, на якім Clang на самай справе яго складання ад З да асэмблеры. Для таго каб мець Clang кампіляцыі файла да зборкі, але працягваць далей, перадайце яго-S сцяг у камандным радку. Давайце зірнем на зборку файл, які быў сігнал. Падобна на тое, зусім іншую мову. Асамблея код вельмі канкрэтнага працэсара. У гэтым выпадку, паколькі CS50 прыбор працуе на віртуальным x86-працэсар, гэта x86-код зборкі. Вельмі нешматлікія людзі пішуць прама на асэмблеры ў гэтыя дні, але кожная праграма C Вы калі-небудзь напісаць пераўтворыцца ўніз у зборцы. Зноў жа, мы называем гэты крок кампіляцыі C у зборцы паколькі мы збіраемся з больш высокага ўзроўню на больш нізкі ўзровень мова праграмавання. Тое, што робіць зборку больш нізкім узроўні, чым C? Ну, у зборы, мы вельмі абмежаваныя ў тым, што мы можам зрабіць. Ёсць няма, калі, у той час, бо, або завесы любога роду. Але вы можаце зрабіць тое ж самае, што гэтыя кантролем структуры прапануюць выкарыстанне абмежаваных аперацый, зборка не прадугледжвае. Але каб зразумець, як нізка узроўні зборкі на самай справе, давайце яшчэ адзін крок наперад у нашай кампіляцыі, зборкі. Гэта праца зборшчыкам, каб пераўтварыць код зборкі ў аб'ект або машынны код. Памятаеце, што асэмблер не выводзіць сходаў; хутчэй, ён прымае ў зборцы і выхады машынны код. Машынны код з'яўляецца фактычным 1 і 0, што працэсар можа разумею, хоць у нас яшчэ ёсць ледзь-ледзь пакінуў працу перш чым мы зможам выканаць нашу праграму. Давайце збіраць нашы зборкі кода, перадаўшы Сцяг Clang-C. Зараз давайце паглядзім, што знаходзіцца ў сабраным файл. Добра, што не дапамагае нам вельмі многае. Памятаеце, што машына кода нулёў і адзінак, што Ваш кампутар можа зразумець. Гэта не значыць, што гэта лёгка для нас, каб зразумець. Так як менавіта нізкі ўзровень зборкі? Гэта амаль ідэнтычна аб'ектны код. Пераход ад зборкі ў аб'ектны код нашмат больш Пераклад, чым пераўтварэнне, таму ніхто не можа разгледзець асэмблера рабіць любыя фактычныя кампіляцыі. На самай справе, гэта даволі лёгка ўручную перакладаць з зборкі ў машынны код. Гледзячы на ​​зборку для асноўнай функцыі, што першая лінія бывае, каб адпавядаць шаснаццатковае 0x55. У двайковай, гэта 1010101. У другой радку адбываецца адпавядаюць шаснаццатковай 0x895. А на наступны, 0x56. Улічваючы параўнальна простую табліцу, вы можаце перакладаць зборку ў кодзе, што машыны могуць зразумець таксама. Так што адзін застаўся крок у кампіляцыю, якая звязвае. Узоры спалучае ў сабе кучу аб'ектных файлаў у адзін вялікі файл што вы рэальна можаце выканаць. Узоры вельмі залежыць ад сістэмы. Такім чынам, самы просты спосаб атрымаць Clang проста звязаць аб'ект Файлы Разам з'яўляецца тэлефанаваць Clang на ўсіх файлаў, якія Вы хочаце, каб звязаць разам. Калі вы пакажаце. Аб файлах, то не трэба будзе перапрацоўваць, кампіляваць і збіраць усе вашыя зыходным кодам. Давайце кідаць матэматычныя функцыі ў нашым файле, так што ў нас ёсць нешта, каб звязаць цалі Зараз давайце збіраць яго назад у аб'ектны код і тэлефануйце Clang на ім. Ой. Так як мы ўключалі матэматычныя функцыі, нам трэба звязаць у матэматычную бібліятэку з-лм. Калі мы хочам звязаць разам кучу. Выводзяцца файлаў, якія мы напісаў на нашы ўласныя, мы б проста паказаць іх усё ў каманднага радка. Абмежаваннем з'яўляецца тое, што толькі адзін з гэтых файлаў павінны на самай справе вызначыць асноўныя функцыі, альбо атрыманы выкананы файл не ведаеце з чаго пачаць працуе ваш код. У чым розніца паміж указаннем файл па спасылцы ў з-л, а проста паказаўшы файл напрамую? Нічога. Гэта проста, што Clang адбываецца дакладна ведаць, які файл нешта накшталт-LM адбываецца ставяцца. Калі б вы ведалі, што файл самастойна, вы можаце паказаць яго у відавочным выглядзе. Проста памятаеце, што ўсе л сцягі павінны прыйсці ў канцы Вашага кліента попыт. І гэта ўсё, што трэба зрабіць. Калі вы проста запусціце Clang на некаторыя файлы, гэта тое, што гэта на самай справе робіць. Мяне клічуць Боб Боуден, і гэта CS50.