Что такое компилятор, компоновщик, загрузчик?

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

Ответ 1

=====> 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) Лексический анализатор:

Он объединяет символы в исходном файле, чтобы сформировать "жетон". Токен - это набор символов, который не имеет пробела, табуляции и новой строки. Поэтому эта единица компиляции также называется "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;

    /*
     ...
    */
    }
}

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

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

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

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

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

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

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

Управление переходит на прямое.

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

Ответ 2

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

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]

Ответ 3

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

Сначала пройдите эту диаграмму:

                         (img source->internet)

source->internet

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

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

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

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Компилятор:

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

Linker:

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

  • статическая привязка
  • динамическое связывание

Погрузчик:

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


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

Ответ 7

*

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

*

Linkers and Loaders из 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

Ответ 8

Операционная система: операционная система (ОС) - это системное программное обеспечение, которое управляет компьютерными аппаратными и программными ресурсами и предоставляет общие службы для компьютерных программ. Операционная система является компонентом системного программного обеспечения в компьютерной системе. Обычно приложениям требуется операционная система.

Компилятор: компилятор - это компьютерная программа (или набор программ), которая преобразует исходный код, написанный на языке программирования (исходный язык) на другой язык компьютера (целевой язык), причем последний часто имеет двоичную форму известный как объектный код.

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

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

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

Linker: linker - это программа, которая объединяет объектные модули для создания исполняемой программы.

Preproccesor: Preproccesor - инструмент для подстановки текста, и он инструктирует компилятор выполнить необходимую предварительную обработку перед фактической компиляцией.

Ответ 9

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

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

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

Ответ 10

  • Компилятор: конвертирует понятный для человека формат в понятный для машины формат
  • Linker. Какой конвертируемый машинный формат в понятный формат операционной системы.
  • Loader: это объект, который фактически загружает и запускает программу в оперативную память.

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

Ответ 11

Компилятор - это программа, которая компилирует файлы исходного кода программы в исполняемую программу. Он входит в состав интегрированной среды разработки IDE с большинством программных пакетов программного обеспечения. Компилятор принимает файлы исходного кода, написанные на языке высокого уровня, такие как C, BASIC или Java, и компилирует код на язык низкого уровня, такой как машинный код или код сборки. Этот код создается для определенного типа процессора, такого как Intel Pentium или PowerPC. Затем программа может быть распознана процессором и запускаться из операционной системы.

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

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

Ответ 12

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

Ответ 13

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

Ответ 14

Компилятор переводит строки кода с языка программирования на машинный язык.

Линкер создает связь между двумя программами.

Loader загружает программу в память в основной базе данных, программе и т.д.

Ответ 15

Компилятор: это системное программное обеспечение, которое исправляет ошибку программ, объектного файла, сообщений и т.д.

Linker: это системное программное обеспечение, которое объединяет один или несколько объектных файлов и возможно некоторый код библиотеки либо в какой-либо exicutable некоторой библиотеке, либо в виде списка ошибок

Loader: программа, загружающая исполняемый файл в первичную память устройства

Ответ 16

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