Що таке компілятор, лінкер, навантажувач?


Відповіді:


186
=====> 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.

Складання:

У блоці є шість кроків:

1) Лексичний аналізатор:

Він поєднує символи у вихідному файлі та утворює "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>
            -----
            -----

Управління стрибає прямо.

Тоді останньою фазою є зв'язування (що створює виконуваний файл або бібліотеку). Коли виконується виконуваний файл, потрібні йому бібліотеки завантажуються.


6
Я не впевнений, чому когось ще не вказали, але линкер і навантажувач не знаходяться в одному кроці. Посилання - це частина компіляції, а завантаження - частина (до) запуску програми.
SimpleGuy

Де знаходиться 7) Асемблер та найважливіший 8) Лінкер та 9) Навантажувач, про який запитали?

131
  • Компілятор читає, аналізує та переводить код у файл об'єкта або у список повідомлень про помилки.
  • Лінкер поєднує один або декілька об’єктних файлів і можливий код бібліотеки або в якийсь виконуваний файл, в бібліотеці або в списку повідомлень про помилки.
  • Завантажувач зчитує виконуваний код у пам'яті, робить деякий переклад адреси і намагається запустити програму, в результаті чого запущена програма або повідомлення про помилку (або обидва).

Представлення 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]

2
це пояснення прямо вперед. Вам слід розглянути можливість викладання викладача. Спасибі
0.ш

Дякуємо, що не уникаєте відповідати про посилання та навантажувач!

29

Сподіваюся, це допоможе вам трохи більше.

Спочатку перейдіть до цієї схеми:

                         (img source->internet)

джерело-> Інтернет

Ви робите фрагмент коду і зберігаєте файл (вихідний код), а потім

Попередня обробка : - Як випливає з назви, це не є складовою. Вони доручають компілятору виконати необхідну попередню обробку до фактичної компіляції. Ви можете викликати цю фазу заміни тексту або інтерпретувати спеціальні директиви препроцесора, позначені #.

Компіляція : - Компіляція - це процес, коли програма, написана однією мовою, перекладається на іншу цільову мову. Якщо є деякі помилки, компілятор виявить їх і повідомить про це.

Зберіть : - Код зібрання перетворюється на машинний код. Ви можете зателефонувати асемблеру спеціального типу.

Посилання : - Якщо для цього фрагмента коду потрібен інший вихідний файл, який потрібно зв'язати, лінкер пов'язує їх, щоб зробити його виконуваним файлом.

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

Навантажувач : - Він завантажує виконуваний код у пам'ять; програма та стек даних створюються, реєстр стає ініціалізованим.

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


15

Компілятор: Це програма, яка переводить мовну програму високого рівня в машинну мову. Компілятор розумніший, ніж асемблер. Він перевіряє всі види обмежень, діапазонів, помилок і т. Д. Але його час роботи програми більше і займає більшу частину пам'яті. Він має повільну швидкість. Тому що компілятор проходить всю програму, а потім переводить всю програму в машинні коди. Якщо компілятор працює на комп’ютері і виробляє машинні коди для одного комп’ютера, він відомий як самокомпілятор або резидентний компілятор. З іншого боку, якщо компілятор працює на комп'ютері і виробляє машинні коди для іншого комп'ютера, він відомий як крос-компілятор.

Linker: На мовах високого рівня зберігаються деякі вбудовані файли заголовків або бібліотеки. Ці бібліотеки заздалегідь визначені, і вони містять основні функції, необхідні для виконання програми. Ці функції пов'язані з бібліотеками програмою під назвою Linker. Якщо лінкер не знаходить бібліотеку функції, він повідомляє компілятору, а потім компілятор генерує помилку. Компілятор автоматично викликає лінкер як останній крок при складанні програми. Не вбудований у бібліотеки, він також пов'язує визначені користувачем функції з визначеними користувачем бібліотеками. Зазвичай більш тривала програма поділяється на менші підпрограми, що називаються модулями. І ці модулі повинні бути об'єднані для виконання програми. Процес поєднання модулів здійснює лінкер.

Навантажувач: Навантажувач - це програма, яка завантажує машинні коди програми в системну пам'ять. У галузі обчислювальної техніки навантажувач - це частина операційної системи, яка відповідає за завантаження програм. Це один із важливих етапів у процесі запуску програми. Тому що це вміщує програми в пам'ять і готує їх до виконання. Завантаження програми передбачає зчитування вмісту виконуваного файлу в пам'яті. Після завершення завантаження операційна система запускає програму, передаючи керування завантаженому програмному коду. Усі операційні системи, що підтримують завантаження програми, мають навантажувачі. У багатьох операційних системах завантажувач постійно зберігається в пам'яті.


14

У Вікіпедії повинні бути хороші відповіді, ось мої думки:

  • Компілятор: читає джерело something.c, пише щось.o об'єкт.
  • Linker: приєднується декілька файлів * .o до виконуваної програми.
  • Навантажувач: код, який завантажує виконуваний файл у пам'ять і запускає його.

4

*

пояснено стосовно систем на базі linux / unix, хоча це основна концепція для всіх інших обчислювальних систем.

*

Зв'язувачі та навантажувачі 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


4

Компілятор:

Він буде читати вихідний файл, який може мати тип .c або .cpp тощо, і переводить його в .o файл, який називається об'єктним файлом.

Linker:

Він поєднує кілька .o файлів, які можуть бути створені для декількох вихідних файлів, у виконуваний файл (формат ELF у GCC). Існує два типи зв'язку:

  • статичне пов'язування
  • динамічні зв'язки

Навантажувач:

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


Для детального вивчення цих трьох етапів виконання програми в Linux, будь ласка, прочитайте це .


1

зміни компілятора перевіряють ваш вихідний код на наявність помилок і змінюють його в об'єктний код.це код, який працює операційна система.

Ви часто не пишете всю програму в одному файлі, тому лінкер посилається на всі файли об'єктного коду.

ваша програма не буде виконана, якщо вона не знаходиться в основній пам'яті


1
  • Компілятор : який перетворює зрозумілий для людини формат у машинно зрозумілий формат
  • Linker : який перетворює зрозумілий для машини формат в зрозумілий для операційної системи формат
  • Навантажувач : це об'єкт, який фактично завантажує та запускає програму в оперативну пам'ять

Linker & Interpreter - це взаємовиключні перекладачі, які отримують код за рядком та виконують рядок за рядком.


1
  • Компілятор: Мовний перекладач, який перетворює повну програму в машинну мову, щоб створити програму, яку комп'ютер може обробити в повному обсязі.
  • Linker: Утилітна програма, яка приймає один або більше складених об’єктних файлів і об'єднує їх у виконуваний файл або інший об’єктний файл.
  • Навантажувач: завантажує виконуваний код у пам'ять, створює програму та стек даних, ініціалізує регістри та запускає запущений код.

1

Компілятор Він перетворює вихідний код в об'єктний код.

Linker Він об'єднує декілька об'єктних файлів в один виконуваний програмний файл.

Навантажувач Він завантажує виконуваний файл у основну пам'ять.


1
Я думаю, що ваша відповідь значною мірою була висвітлена в існуючих вже 14 високоякісних відповідях за останні 10 років
Ніколя Жерве

0

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


0

Компілятор перекладає рядки коду з мови програмування на машинну мову.

Linker створює зв'язок між двома програмами.

Завантажувач завантажує програму в пам'ять в основній базі даних, програмі тощо.


-1

Компілятор: це системне програмне забезпечення, яке виправляє помилки програм, об’єктного файлу, повідомлень тощо

Linker: це системне програмне забезпечення, яке поєднує одне або декілька об'єктних файлів і можливий код бібліотеки або в якусь виправдану якусь бібліотеку, або в список помилок

Навантажувач: програма, яка завантажує виконуваний файл в основну пам'ять машини

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.