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