[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.