Что такое компилятор, компоновщик, загрузчик? - PullRequest
101 голосов
/ 22 октября 2010

Я хотел бы подробно узнать значение и работу компилятора, компоновщика и загрузчика.Применительно к любому языку желательно c ++.

Ответы [ 13 ]

171 голосов
/ 20 февраля 2014
=====> COMPILATION PROCESS <======

                     |
                     |---->  Input is Source file(.c)
                     |
                     V
            +=================+
            |                 |
            | C Preprocessor  |
            |                 |
            +=================+
                     |
                     | ---> Pure C file ( comd:cc -E <file.name> )
                     |
                     V
            +=================+
            |                 |
            | Lexical Analyzer|
            |                 |
            +-----------------+
            |                 |
            | Syntax Analyzer |
            |                 |
            +-----------------+
            |                 |
            | Semantic Analyze|
            |                 |
            +-----------------+
            |                 |
            | Pre Optimization|
            |                 |
            +-----------------+
            |                 |
            | Code generation |
            |                 |
            +-----------------+
            |                 |
            | Post Optimize   |
            |                 |
            +=================+
                     |
                     |--->  Assembly code (comd: cc -S <file.name> )
                     |
                     V
            +=================+
            |                 |
            |   Assembler     |
            |                 |
            +=================+
                     |
                     |--->  Object file (.obj) (comd: cc -c <file.name>)
                     |
                     V
            +=================+
            |     Linker      |
            |      and        |
            |     loader      |
            +=================+
                     |
                     |--->  Executable (.Exe/a.out) (com:cc <file.name> ) 
                     |
                     V
            Executable file(a.out)

Препроцессор C: -

Предварительная обработка C является первым этапом компиляции.Он обрабатывает:

  1. #define операторов.
  2. #include операторов.
  3. Условные операторы.
  4. Макросы

Цель устройства - преобразовать исходный файл C в файл кода Pure C.

Компиляция C:

В модуле шесть шагов:

1) Lexical Analyzer:

Он объединяет символы в исходном файле, чтобы сформировать «TOKEN».Токен - это набор символов, который не имеет пробела, табуляции и новой строки.Поэтому эта единица компиляции также называется "TOKENIZER".Он также удаляет комментарии, генерирует записи таблицы символов и таблицы перемещения.

2) Синтаксический анализатор:

Этот блок проверяет синтаксис в коде.Например:

{
    int a;
    int b;
    int c;
    int d;

    d = a + b - c *   ;
}

Приведенный выше код сгенерирует ошибку разбора, поскольку уравнение не сбалансировано.Этот модуль проверяет это внутренне, генерируя дерево синтаксического анализатора следующим образом:

                            =
                          /   \
                        d       -
                              /     \
                            +           *
                          /   \       /   \
                        a       b   c       ?

Поэтому этот модуль также называется PARSER.

3) Семантический анализатор:

Этот модуль проверяетсмысл в высказываниях.Например:

{
    int i;
    int *p;

    p = i;
    -----
    -----
    -----
}

Приведенный выше код генерирует ошибку «Назначение несовместимого типа».

4) Предварительная оптимизация:

Этот блок не зависит от ЦПесть два типа оптимизации

  1. Предоптимизация (не зависит от процессора)
  2. Постоптимизация (зависит от процессора)

Этот блок оптимизирует код следующим образомформы:

  • I) Устранение мертвого кода
  • II) Устранение субкода
  • III) Оптимизация цикла

I) Мертвый кодисключение:

Например:

{
    int a = 10;
    if ( a > 5 ) {
        /*
        ...
        */
    } else {
       /*
       ...
       */
    }
}

Здесь компилятор знает значение 'a' во время компиляции, поэтому он также знает, что условие if всегда истинно.Следовательно, он исключает остальную часть в коде.

II) Исключение подкода:

Например:

{
    int a, b, c;
    int x, y;

    /*
    ...
    */

    x = a + b;
    y = a + b + c;

    /*
    ...
    */
}

можно оптимизировать следующим образом:

{
    int a, b, c;
    int x, y;

    /*
     ...
    */

    x = a + b;
    y = x + c;      // a + b is replaced by x

    /*
     ...
    */
}

III) Оптимизация цикла:

Например:

{
    int a;
    for (i = 0; i < 1000; i++ ) {

    /*
     ...
    */

    a = 10;

    /*
     ...
    */
    }
}

В приведенном выше коде, если 'a' является локальным и не используется в цикле, тогда это может бытьоптимизируется следующим образом:

{
    int a;
    a = 10;
    for (i = 0; i < 1000; i++ ) {
        /*
        ...
        */
    }
}

5) Генерация кода:

Здесь компилятор генерирует код сборки, чтобы наиболее часто используемые переменные сохранялись в регистрах.

6) Постоптимизация:

Здесь оптимизация зависит от процессора.Предположим, что если в коде более одного перехода, то они преобразуются в один из следующих элементов:

            -----
        jmp:<addr1>
<addr1> jmp:<addr2>
            -----
            -----

Элемент управления переходит к непосредственному.

Тогда последняя фаза - Linking (котораяисполняемый файл или библиотека).Когда исполняемый файл запущен, необходимые ему библиотеки загружаются.

118 голосов
/ 22 октября 2010
  • Компилятор считывает, анализирует и переводит код в объектный файл или список сообщений об ошибках.
  • Компоновщик объединяет один или несколько объектных файлов и, возможно, некоторый код библиотеки в какой-либо исполняемый файл, некоторую библиотеку или список сообщений об ошибках.
  • Загрузчик считывает исполняемый код в память, выполняет некоторую трансляцию адресов и пытается запустить программу, что приводит к запуску программы или сообщению об ошибке (или обоим).

ASCII представление:

[Source Code] ---> Compiler ---> [Object code] --*
                                                 |
[Source Code] ---> Compiler ---> [Object code] --*--> Linker --> [Executable] ---> Loader 
                                                 |                                    |
[Source Code] ---> Compiler ---> [Object code] --*                                    |
                                                 |                                    |
                                 [Library file]--*                                    V
                                                                       [Running Executable in Memory]
29 голосов
/ 03 апреля 2015

Надеюсь, это поможет вам немного больше.

Сначала, пройдите по этой схеме:

                         (img source->internet)

imageinternet">

Вы делаете кусок кода и сохраняетефайл (Исходный код), затем

Предварительная обработка : - Как следует из названия, он не является частью компиляции.Они инструктируют компилятор выполнить необходимую предварительную обработку перед фактической компиляцией.Вы можете вызвать эту фазу подстановки текста или интерпретировать специальные директивы препроцессора, обозначенные #.

Компиляция : - Компиляция - это процесс, при котором программа, написанная на одном языке, переводится на другой целевой язык.Если есть какие-либо ошибки, компилятор обнаружит их и сообщит о них.

Assemble : - Код сборки преобразуется в машинный код.Вы можете называть ассемблер специальным типом компилятора.

Связывание : - Если для этого фрагмента кода требуется связать какой-либо другой исходный файл, компоновщик связывает их, чтобы сделать его исполняемым файлом.

После этого происходит много процессов.Да, как вы уже догадались, роль загрузчика здесь идет:

Загрузчик : - загружает исполняемый код в память;Программа и стек данных созданы, регистр инициализирован.

Немного Дополнительная информация: - http://www.geeksforgeeks.org/memory-layout-of-c-program/, вы можете увидеть макет памяти там.

15 голосов
/ 05 октября 2014

Компилятор: это программа, которая переводит языковую программу высокого уровня в программу на машинном языке.Компилятор умнее ассемблера.Он проверяет все виды ограничений, диапазонов, ошибок и т. Д. Но время его выполнения программы больше и занимает большую часть памяти.У него медленная скорость.Потому что компилятор проходит всю программу, а затем переводит всю программу в машинные коды.Если компилятор работает на компьютере и создает машинные коды для того же компьютера, он называется самокомпилятором или резидентным компилятором.С другой стороны, если компилятор работает на компьютере и создает машинные коды для другого компьютера, он называется кросс-компилятором.

Линкер: в языках высокого уровня некоторые встроенные файлы заголовков или библиотекисохраняются.Эти библиотеки предопределены и содержат базовые функции, которые необходимы для выполнения программы.Эти функции связаны с библиотеками с помощью программы под названием Linker.Если компоновщик не находит библиотеку функции, он сообщает об этом компилятору, а затем компилятор выдает ошибку.Компилятор автоматически вызывает компоновщик как последний шаг в компиляции программы.Не встроенный в библиотеки, он также связывает пользовательские функции с пользовательскими библиотеками.Обычно более длинные программы делятся на более мелкие подпрограммы, называемые модулями.И эти модули должны быть объединены для выполнения программы.Процесс объединения модулей выполняется компоновщиком.

Загрузчик: Загрузчик - это программа, которая загружает машинные коды программы в системную память.В Computing загрузчик - это часть операционной системы, которая отвечает за загрузку программ.Это один из важных этапов в процессе запуска программы.Потому что он помещает программы в память и подготавливает их к выполнению.Загрузка программы включает в себя чтение содержимого исполняемого файла в память.После завершения загрузки операционная система запускает программу, передавая управление загруженному программному коду.Все операционные системы, поддерживающие загрузку программ, имеют загрузчики.Во многих операционных системах загрузчик постоянно находится в памяти.

11 голосов
/ 22 октября 2010

Википедия должна иметь хороший ответ, вот мои мысли:

  • Компилятор: читает что-то источник .c, пишет что-то объект .o.
  • Компоновщик: объединяет несколько *.o файлы в исполняемую программу.
  • Loader: код, который загружает исполняемый файл в память и запускает его.
4 голосов
/ 17 декабря 2013

Компилятор:

Он считывает исходный файл, который может иметь тип .c или .cpp и т. Д., И преобразует его в файл .o, называемый объектным файлом.

Линкер:

Объединяет несколько файлов .o, которые могут быть сгенерированы для нескольких исходных файлов, в исполняемый файл (формат ELF в GCC).Существует два типа ссылок:

  • статические ссылки
  • динамические ссылки

Загрузчик:

Программа, которая загружает исполняемый файлк основной памяти машины.


Для более подробного изучения этих трех этапов выполнения программы в Linux, пожалуйста, прочитайте это .

3 голосов
/ 29 апреля 2013

*

объяснено в отношении систем на основе Linux / Unix, хотя это базовая концепция для всех других вычислительных систем.

*

Линкеры иЗагрузчики из LinuxJournal объясняют эту концепцию с ясностью.Это также объясняет, как появилось классическое имя a.out.(вывод на ассемблере)

Краткое резюме,

c program --> [compiler] --> objectFile --> [linker] --> executable file (say, a.out)

мы получили исполняемый файл, теперь передайте этот файл своему другу или клиенту, который нуждается вэто программное обеспечение:)

когда они запускают это программное обеспечение, скажем, набрав его в командной строке ./a.out

execute in command line ./a.out --> [Loader] --> [execve] --> program is loaded in memory

Как только программа загружена впамять, управление передается в эту программу, заставляя ПК (счетчик программ) указывать на первую команду a.out

1 голос
/ 28 сентября 2018
  • Компилятор: языковой переводчик, который преобразует всю программу в машинный язык для создания программы, которую компьютер может обрабатывать целиком.
  • Linker: служебная программа, которая принимает один или несколько скомпилированных объектных файлови объединяет их в исполняемый файл или другой объектный файл.
  • Загрузчик: загружает исполняемый код в память, создает программу и стек данных, инициализирует регистры и запускает выполняемый код.
1 голос
/ 18 октября 2013
  • Компилятор : которые преобразуют понятный человеку формат в машинно-понятный формат
  • компоновщик : которые преобразуют машинно-понятный формат в понятный операционный формат
  • Загрузчик : объект, который фактически загружает и запускает программу в ОЗУ

Линкер и Интерпретатор являются взаимоисключающими Интерпретатором, получающим код построчно и выполняющим построчнолиния.

1 голос
/ 08 декабря 2012

изменения компилятора проверяют ваш исходный код на наличие ошибок и превращают его в объектный код. Это код, который запускает операционная система.

Вы часто не пишете целую программу в одном файле, поэтому компоновщик связывает все ваши файлы объектного кода.

Ваша программа не будет выполнена, если она не находится в основной памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...