Як працює компілятор? [зачинено]


17

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

Я був на тоннах веб-сайтів, я читав тонни статей, і чув багато пояснень. Більшість з них були хорошими, але всі вони були або широкими, або занадто складними, або просто простими. Отже, моє запитання полягає в тому, як працює компілятор?

Якщо це складне, широке запитання, будь ласка, скажіть мені. Але якщо ні, будь ласка, дайте відповідь на запитання.


4
Занадто широка, принаймні частина "Як це працює". На цю тему написано цілі книги.
Одід

1
en.wikipedia.org/wiki/Compiler буде тривіальним посиланням на Вікіпедію, що конкретно вам цікаво? Питання є досить широким, що я мав би спокусу дати розумний відповідь Alec "Компілятори перекладають код з однієї мови на іншу", оскільки це загальна ідея, яка має багато нюансів у тому, як тільки хтось почне розглядати що це насправді пов'язано.
Король JB

1
Так, і я думаю, що на це відповіли досить добре.
Джеремі

1
Будь-яке пояснення того, як працює компілятор, буде або занадто широким, або занадто складним. Це складний предмет, і класи компіляторів були найважчими курсами, пов'язаними з комп'ютером, які я коли-небудь брав.
Девід Торнлі

1
@David Звичайно, компілятори складні, і ви не можете пояснити всі подробиці того, як вони працюють тут. Однак я впевнений, що до того, як ви пройшли курс компілятора, ви мали основне розуміння того, що таке компілятор або як він працює.
Діма

Відповіді:


24

Компілятор - це програма, яка переводить вихідний код для іншої програми з мови програмування у виконуваний код.

Як правило, вихідний код є мовою програмування високого рівня (наприклад, Pascal, C, C ++, Java, Perl, C # тощо). Виконавчий код може представляти собою послідовність машинних інструкцій, які можуть виконуватись центральним процесором безпосередньо, або це може бути проміжне представлення, яке інтерпретується віртуальною машиною (наприклад, байт-код Java).

Коротше кажучи, компілятор перетворює програму з читаного людиною формату в машиночитаний формат.

Щодо того, як працює компілятор, це справді складно. На цю тему є книги та університетські курси. Я спробую коротко окреслити основні етапи процесу, але це буде дуже короткий огляд.

  1. Лексінг - розбийте текст програми на "лексеми". Лексеми - це "слова" мови програмування, такі як ідентифікатори (ключові слова, назви змінних, назви функцій тощо) або оператори (=, *, & тощо).
  2. Парсинг - перетворіть послідовність лексем у дерево розбору, що представляє собою структуру даних, що представляє різні мовні конструкції: декларації типу, оголошення змінних, визначення функцій, петлі, умовні умови, вирази тощо.
  3. Оптимізація - оцінюйте постійні вирази, оптимізуйте невикористані змінні чи недоступний код, по можливості розкручуйте петлі тощо.
  4. Переведіть дерево розбору в інструкції з машини (або байт-код JVM).

Ще раз наголошую, що це дуже короткий опис. Сучасні компілятори дуже розумні, а, отже, дуже складні.


2
Власне, це перетворює мову в іншу. Ранній компілятор C ++ зробив компіляцію до C. Те саме стосується компілятора Vala. Компілятор Java компілюється в байт-код, який не виконується без компілятора JIT JIT.
deadalnix

1
@deadalnix IMHO, справа в тому, що ви переходите від невиконаного коду до виконуваного коду. Я б стверджував, що C-front не був компілятором, а передовим компілятором C. Або етап у процесі компіляції, якщо ви хочете. Віртуальні машини, звичайно, розмивають межу між "виконуваним" та "невиконаним". Тут я б просто вважав виконуваним кодом те, що йде у віртуальну машину, як-от байт-код, і абстрагувати все, що відбувається всередині VM, як JIT.
Діма

1
@Dima, це не повинно бути від невиконаного коду до виконуваного коду. Наприклад, ви не можете виконати байт-код JVM безпосередньо на машинах Windows.

1
@ Thorbjørn Ravn Andersen: але байтовий код виконується JVM. Чи не вся суть "віртуальної машини" виглядати програмісту як справжня машина?
Діма

2
Я б заперечував, що традиційно компілятор перетворював програму з читаного для людини формату в машиночитаний формат, як сказав Діма. Такі варіанти, як перетворення Cfront C ++ на C або javac, перетворення Java в байт-код, є більш вдосконаленими темами, які, ймовірно, повинні залишатися до тих пір, поки не пояснять основну, традиційну концепцію, хто не знає її.
Carson63000

5

Компілятор - це комп'ютерна програма (або набір інструкцій), яка перетворює вихідний код, написаний мовою програмування (мовою джерела), в іншу комп'ютерну мову (цільова мова, часто має двійкову форму, відому як об'єктний код). Найпоширенішою причиною бажання трансформувати вихідний код є створення виконуваної програми.

Компілятори з'єднують програми вихідних програм мовами високого рівня з базовим обладнанням. Для компілятора потрібно:

  1. Визначення правильності синтаксису програм
  2. Створення правильного та ефективного коду об'єкта
  3. Організація виконання
  4. Форматування виводу відповідно до конвенцій асемблера та / або лінкера.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.