У Python є компілятор! Ви просто не помічаєте цього, оскільки він працює автоматично. Однак ви можете сказати, що це там: подивіться .pyc
(або .pyo
якщо у вас оптимізатор увімкнено) файлів, що генеруються для модулів, які ви import
.
Крім того, він не компілюється в код рідної машини. Натомість він компілює в байт-код, який використовується віртуальною машиною. Віртуальна машина - сама по собі складена програма. Це дуже схоже на те, як працює Java; насправді настільки схожий, що існує варіант Python ( Jython ), який замість цього компілює байт-код Java Virtual Machine! Є також IronPython , який компілює CLR Microsoft (використовується .NET). (Звичайний компілятор байтового коду Python іноді називається CPython, щоб відключити його від цих альтернатив.)
C ++ потребує викриття процесу компіляції, оскільки сама мова є неповною; він не визначає все, що повинен знати лінкер, щоб створити вашу програму, а також не може вказати варіанти компіляції на портативному рівні (деякі компілятори дозволяють вам використовувати #pragma
, але це не стандартно). Тож вам доведеться виконати решту роботи з makefiles та, можливо, авто пекла (autoconf / automake / libtool). Це насправді лише перехід від того, як це робив C. І C зробив це так, оскільки зробив компілятор простим, що є однією з головних причин, якими він користується такою популярністю (хтось міг викрутити простий компілятор C у 80-х).
Деякі речі, які можуть впливати на роботу компілятора чи лінкера, але не вказані в синтаксисі C або C ++:
- вирішення залежності
- зовнішні вимоги до бібліотеки (включаючи порядок залежності)
- рівень оптимізатора
- налаштування попередження
- версія специфікації мови
- відображення лінкерів (який розділ знаходиться в кінцевій програмі)
- цільова архітектура
Деякі з них можна виявити, але їх неможливо вказати; наприклад, я можу виявити, для чого використовується C ++ __cplusplus
, але я не можу вказати, що C ++ 98 є тим, що використовується для мого коду в самому коді; Я повинен передати його як прапор компілятору в Makefile або зробити налаштування в діалоговому вікні.
Хоча ви можете подумати, що в компіляторі існує система "вирішення залежності", яка автоматично генерує записи залежностей, вони записують лише те, які файли заголовків використовує даний вихідний файл. Вони не можуть вказати, які додаткові модулі вихідного коду необхідні для з'єднання у виконувану програму, оскільки в C або C ++ немає стандартного способу вказувати, що даний файл заголовка є визначенням інтерфейсу для іншого модуля вихідного коду на відміну від простої групи рядки, які потрібно показати в декількох місцях, щоб ви не повторювались. Існують традиції у конвенціях про іменування файлів, але вони не відомі і не виконуються компілятором і лінкером.
Деякі з них можна встановити за допомогою #pragma
, але це нестандартно, і я говорив про стандарт. Усі ці речі можна було б визначити за допомогою стандарту, але вони не були б зацікавлені у відсталій сумісності. Переважаюча мудрість полягає в тому, що файли та IDE не зламані, тому не виправляйте їх.
Python обробляє все це мовою. Наприклад, import
задає явну залежність модуля, має на увазі дерево залежностей, а модулі не розбиваються на заголовки та вихідні файли (тобто інтерфейс та реалізація).