Трансляторы кода

Чтобы было проще понять эту тему, мы упростим понятие о работе компьютера.
Так вот, все компьютеры работают только на ноликах и единичках или же на ’ток есть’
и ’тока нет’. Все языки и способы управления железом — это надстройки над нулями и единицами.

Чтобы процессор видел код на пайтоне в привычных ’0101’, существуют трансляторы языков программирования.
Трансляторы — программы-переводчики из одного ЯП в машинный или в любой другой код. Их разделяют на два вида: интерпретатор и компилятор. На вход оба получают код и данные, но в работе они отличаются.

Компилятор

Транслирует исходный код в машинный и отдаёт программу для запуска. Сборка проходит в четыре этапа:

  1. Синтаксический анализ. Он пробегается по коду и проверяет правильность написания команд, потом создаёт таблицу для ссылок на функции и переменные, чтобы не было ошибок имён и вызовов.
  2. Семантический анализ. Раскладывает код на составляющие и находит начальную точку.
  3. Распределение памяти. Компилятор выделяет память под переменные, функции и другие данные программы.
  4. Компиляция. Переводит исходный код в машинный и отдаёт EXE-файл для винды и APP-файл для мака.

Синтаксический анализ

Компилятор анализирует синтаксис и делит код на маленькие части или токены. С ошибками в написании команд программа не запустится.

При синтаксическом анализе может возникнуть проблема, когда две переменные в разных местах имеют одно и тоже название и тип.
Если они существуют в своих областях видимости, то всё нормально — в памяти они не пересекаются и не мешают друг другу. Но если в одной области видимости сделать две одинаковых переменных, компилятор будет ругаться и не запустит программу.
Например

------
def print_emoji():
    emoji = '¯\\_(ツ)_/¯'
    print(emoji)
------
emoji = 't(-_-)t'
print(print_emoji(), emoji)

Семантический анализ

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

Вычисления начинаются на этапе компиляции, тут просто подготовка

Распределение памяти

На этом этапе переменные забирают свои кусочки памяти, выделяется место под стек и кучу. Если программа будет занимать больше оперативной памяти, чем есть на компьютере — он зависнет и его нужно будет перезапускать вручную.

Интерпретатор

Выполняет программу построчно и работает так же, но добавляется ещё один этап — интерпретация. Она эмулирует в себе виртуальную машину с машинным кодом, на котором написана программа. Это значит, что если на винде и маке запустить один и тот же код на пайтоне, он будет работать так же. С компилятором такое не получится, потому что они отдают машинный код под конкретную архитектуру процессора.
Интерпретаторы работают медленнее компиляторов, потому что они тратят время на виртуальную машину и перегонку кода от неё до настоящего процессора.



В следующей статье расскажем как процессор понимает, что мы от него хотим.

Поделиться
Отправить
Запинить
Популярное