Компилятор VS интерпретатор: ключевые отличия
Интерпретаторы и компиляторы отвечают за преобразование языка программирования или сценариев (язык высокого уровня) в машинный код. Но если обе программы делают одно и то же, чем они различаются? Давайте разберемся.
Компилятор
Что такое компилятор?
Компилятор — это компьютерная программа, которая переводит компьютерный код с одного языка программирования на другой. Компилятор берет программу целиком и преобразует ее в исполняемый компьютерный код. Для этого требуется целая программа, так как компьютер понимает только то, что написано двоичным кодом. Задача компилятора — преобразовать исполняемую программу в машинный код, который и распознается компьютером. Примерами скомпилированных языков программирования являются C и C++.
Компилятор в основном используется для программ, которые переводят исходный код с языка программирования высокого уровня на язык программирования более низкого уровня.
Компилятор способен выполнять многие или даже все операции: предварительную обработку данных, парсинг, семантический анализ, преобразование входных программ в промежуточное представление, оптимизацию и генерацию кода.
Интерпретатор
Что такое интерпретатор?
Интерпретатор — это компьютерная программа, которая преобразует каждый программный оператор высокого уровня в машинный код. Сюда входят исходный код, предварительно скомпилированный код и сценарии.
Интерпретатор представляет собой машинную программу, которая непосредственно выполняет набор инструкций без их компиляции. Примерами интерпретируемых языков являются Perl, Python и Matlab.
- И компилятор, и интерпретатор выполняют одну и ту же работу — преобразовывают язык программирования высокого уровня в машинный код. Однако компилятор преобразовывает исходный материал в машинный код перед запуском программы. Интерпретатор выполняет эту функцию при ее запуске.
Как это работает?
Сначала компилятор создает программу. Он анализирует все операторы языка, чтобы проверить, правильны они или нет. Если компилятор найдет какую-нибудь ошибку, он выдаст соответствующее сообщение. Если же он не обнаружит никаких ошибок, то преобразует исходный код в машинный. Компилятор связывает различные кодовые файлы в программы, которые можно запустить (например, формата .exe). После этого запускается программа.
Интерпретатор создает программу. Он не связывает файлы и не генерирует машинный код. Происходит построчное выполнение исходных операторов во время исполнения программы.
Преимущества и недостатки
Преимущества компилятора
- Программный код уже переведен в машинный, и, следовательно, требуется меньше времени на его исполнение.
- Файлы .exe выполняются быстрее, чем исходный код. Объектные программы сохраняются и могут быть запущены в любое время.
- Объектные программы пользователю сложнее изменить, чем исходный код.
- Компилятор проверяет исходный код на наличие синтаксических ошибок во время компиляции.
Недостатки компилятора
- Поскольку переводится вся программа, она использует гораздо больше памяти компьютера.
- При работе с компилятором невозможно изменить программу, не вернувшись к исходному коду.
- Необходимо создавать объектную программу перед окончательным исполняемым файлом. Это может занять много времени.
- Исходный код должен быть на 100% верным для создания исполняемого файла.
Преимущества интерпретатора
- Интерпретатор значительно облегчает работу с исходным кодом.
- Он переводит по одной инструкции за раз, поэтому использует минимальный объем памяти.
- Интерпретатор может связать сообщения об ошибках с выполняемой инструкцией, что может оказаться полезным в процессе отладки.
Недостатки интерпретатора
- Каждый раз, когда программа выполняется, тратится время на интерпретацию, из-за чего затягивается время исполнения.
- Интерпретируемые программы могут выполняться только на компьютерах, на которых имеются соответствующие интерпретаторы.
Различия
Рассмотрим основные различия между компилятором и интерпретатором
- Сложные ИИ-модели созданы с помощью некачественных данных
- ЕС ужесточает регулирование в сфере использования искусственного интеллекта
- Парадокс надежности ИИ
Компилятор
Компилятор — это программа, которая переводит текст, написанный на языке программирования, в машинные коды. С помощью компиляторов компьютеры могут понимать разные языки программирования, в том числе высокоуровневые, то есть близкие к человеку и далекие от «железа».

«IT-специалист с нуля» наш лучший курс для старта в IT
Процесс работы компилятора с кодом называется компиляцией, или сборкой. По сути, компилятор — комплексный «переводчик», который собирает, или компилирует, программу в исполняемый файл. Исполняемый файл — это набор инструкций для компьютера, который тот понимает и может выполнить.
Языки программирования, для перевода которых используются компиляторы, называются компилируемыми.
Для чего нужен компилятор
Изначально компьютер не понимает смысл написанного на любом языке программирования. Язык компьютера — машинные коды, нули и единицы, в которых зашифрована информация и команды. Писать на машинных кодах программы практически невозможно: даже простейшее действие будет отнимать много часов работы программиста. Поэтому появились языки программирования, более понятные для людей, и специальные программы, которые переводят эти языки в машинные коды. Эти программы и есть компиляторы.
Без компилятора любой код на компилируемом языке программирования будет для компьютера просто текстом — он не распознает команды и не сможет их выполнить. Поэтому компилятор нужен, чтобы программы могли выполняться. Без него ничего не будет работать.
Еще одна задача компилятора — собрать все модули, например подключенные библиотеки, в единый файл. Нужно, чтобы исполняемый файл содержал в себе все необходимое для нормальной работы программы и полного выполнения инструкций.
Профессия / 8 месяцев
IT-специалист с нуля
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

Компилятор и интерпретатор: в чем разница
Компиляция — не единственный подход к «переводу» человекопонятного языка программирования на машинный. Еще есть интерпретаторы и байт-код, но там технологии совсем другие.
Интерпретатор — это тоже программа, которая «переводит» текст на высокоуровневом языке программирования, но делает это иначе. Она не собирает весь код в один исполняемый файл для последующего запуска, а исполняет код сразу, построчно. Это чуть медленнее, но иногда удобнее. Языки, использующие интерпретаторы, называются интерпретируемыми.
Байт-код — «промежуточное звено» между подходами компиляции и интерпретации. Программа преобразуется в особый код, который запускается под специальной виртуальной машиной. Языков, которые работают так, относительно немного, самый известный и яркий пример — Java.
В каких языках используются компиляторы
Среди популярных сегодня языков компилируемыми являются Swift и Go, а также C / C++ и Objective-C. Другие примеры — Visual Basic, Haskell, Pascal / Delphi, Rust, а также Lisp, Prolog и прочие менее известные языки. Разумеется, компилируемым является и язык ассемблера — очень низкоуровневый и написанный напрямую на машинных кодах.
Отдельно можно выделить языки, которые трансформируются в байт-код — это тоже своего рода компиляция. К ним относятся Java, Scala и Kotlin, а также C# и языки платформы .NET.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
На каких языках пишут компиляторы
Другие языки. Писать компилятор на машинном коде тяжело и долго, порой практически невозможно. Поэтому их пишут на уже существующих языках: получается, что большинство языков написано на других.
Например, один из компиляторов языка Go частично написан на C++, самый первый компилятор C++ — на ассемблере, а уже ассемблер — на машинных кодах.
Тот же язык. Написать компилятор для языка программирования можно на других версиях того же языка — такой подход разрешен и активно используется в разработке. Это нужно, чтобы компиляторы были более гибкими и «умными» и могли поддерживать больше возможностей, — ассемблер довольно примитивен и не решает всех задач.
Выглядит это так:

- первый, более простой компилятор пишется на ассемблере;
- второй пишется уже на нужном языке и компилируется первым компилятором;
- переведенный в машинные коды второй компилятор компилирует свои же исходники — получается более новая и мощная версия его же.
Например, большинство современных компиляторов для C / C++ написано на C / C++. Такие компиляторы называют самокомпилируемыми.
Почему у одного языка может быть несколько компиляторов
У большинства языков программирования несколько компиляторов. Их еще называют реализациями. Изначальную реализацию пишет создатель языка, потом со временем появляются альтернативные. Зачем это делается? Цели могут быть разными:
- написать более современный и функциональный компилятор, обновить язык;
- оптимизировать язык и сделать его эффективнее;
- создать свободную реализацию, которую сможет дополнять сообщество;
- исправить ошибки, которые есть в существующих реализациях;
- перенести язык на другую платформу, и так далее.
Подходы к оптимизации, портированию и выполнению других целей у всех групп разработчиков свои. Поэтому разные компиляторы одного и того же языка могут различаться скоростью, особенностями архитектуры, назначением и другими параметрами. Синтаксис языка при этом остается таким же, но есть особые ситуации, когда одна и та же строчка может выполняться по-разному в зависимости от компилятора.
Какими бывают компиляторы
Компиляторы очень многообразны. Есть такие, которые имеют узкую специализацию, например запускаются только под процессоры определенного семейства и оптимизированы под них. Есть и более широкие — так называемые кросс-компиляторы, которые могут поддерживать несколько операционных систем.
Один компилятор может «знать» несколько языков программирования. Яркий пример такого решения — GCC, или GNU Compiler Collection, кросс-компилятор для нескольких операционных систем и языков, полностью бесплатный и свободный. На нем написано программное обеспечение GNU.
Существуют и так называемые компиляторы компиляторов. Они генерируют компиляторы для языка на основе его формального описания.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Как устроены и работают компиляторы
Простыми словами, они «читают» пришедшую к ним на вход программу и переводят ее команды в соответствующие им наборы машинных кодов. Детали уже сложнее и различаются в зависимости от реализации. Например, есть модульные гибкие компиляторы, написанные на высокоуровневых языках, есть отладочные компиляторы, способные устранять часть синтаксических ошибок, и так далее.
Сама компиляция может быть:
- построчной — в машинный код по очереди переводится каждая строка, что похоже на интерпретацию, но отличается технически;
- пакетной — код разбивается на блоки, или пакеты, и компилируется поблочно;
- условной — особенности компиляции зависят от условий, которые прописаны в исходном коде компилируемой программы.
Сначала компилятор разбирает, что написано, потом анализирует команды, а потом генерирует машинные коды. Он не запускает программу, запуск — это отдельное действие.

Преимущества компилируемых языков
- Компилируемые языки обычно быстрее, чем интерпретируемые, и их легче оптимизировать.
- Итоговый размер кода у компилируемых языков, как правило, меньше, чем у интерпретируемых.
- В компилируемых языках намного шире возможность контролировать аппаратные ресурсы. Это не значит, что они все низкоуровневые, но обратное — верно: практически все низкоуровневые языки — компилируемые.
- Когда процессоры становятся мощнее, именно компилируемые языки могут в должной мере задействовать их преимущества.
- Код после компилятора лучше оптимизируется под конкретные устройства, архитектуру «железа», эффективно задействует память и не тратит лишних ресурсов.
- Компилируемые языки обычно мощные и высокопроизводительные, поэтому на них пишут игры и другие серьезно нагруженные приложения.
Недостатки компилируемых языков
- В отличие от интерпретируемых языков, компилируемые не выполняют код сразу — его сначала нужно собрать, а это лишний шаг и лишнее время.
- Код сложнее в отладке: приходится заново компилировать его при каждом, даже небольшом изменении. Сам процесс поиска и устранения ошибок бывает довольно неочевидным.
- Машинный код жестко связан с архитектурой платформы и различается в зависимости от системы. Поэтому компилируемые языки — по умолчанию не кроссплатформенные. Для переноса языка на другую операционную систему понадобится писать новый компилятор. Правда, есть исключения в виде универсальных кросс-компиляторов, работающих под разными платформами, но они подходят не для всего.
- Для новичков проблема еще и в том, что компилируемые языки часто сложнее, чем интерпретируемые. Изучать их с нуля может быть тяжело, хотя и тут есть исключения.
Как пользоваться компилятором
Начинающий разработчик редко взаимодействует с компилятором напрямую. Он скачивает язык программирования, в том числе его компилятор, а потом работает в редакторе кода или IDE. Среда разработки сама запускает компилятор каждый раз, когда пользователь кликает на кнопку сборки или выполнения программы. Для этого его не нужно вызывать вручную. Иногда среда может сама включать в себя несколько компиляторов и выбирать подходящий в каждом случае.
Поэтому трогать компилятор на ранних этапах не имеет смысла — просто стоит помнить, что он есть, чтобы лучше разбираться в происходящем. Но он может пригодиться, если вы захотите скомпилировать что-то без среды разработки, например прямо в командной строке. Тогда его придется вызвать с помощью специальной команды — она своя для каждого решения.
У любого ПО есть документация, так что, если вы хотите узнать больше о компиляторе, которым пользуетесь, можете прочитать ее.
Узнайте больше об устройстве и работе языков программирования на курсах — получите новую профессию и станьте востребованным IT-специалистом.
IT-специалист с нуля
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.

Статьи по теме:
- Функциональные языки программирования
- Objective-C
- Синтаксис
Топ-15 компиляторов Python — онлайн и офлайн

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

Освойте профессию «Data Scientist» на курсе с МГУ
Data Scientist с нуля до PRO
Освойте профессию Data Scientist с нуля до уровня PRO на углубленном курсе совместно с академиком РАН из МГУ. Изучите продвинутую математику с азов, получите реальный опыт на практических проектах и начните работать удаленно из любой точки мира.

25 месяцев
Data Scientist с нуля до PRO
Создавайте ML-модели и работайте с нейронными сетями
6 224 ₽/мес 11 317 ₽/мес

Чтобы писать и запускать код на Python с рабочего компьютера или в дороге на планшете, существуют разные онлайн- и офлайн-компиляторы для Python. Мы собрали полный список актуальных сервисов.
Лучшие компиляторы Python онлайн
Сохранять версии кода на GitHub и дорабатывать проект вместе с коллегами в режиме реального времени помогут онлайн-компиляторы. Доступ к ним будет у вас везде, где есть интернет.
Replit
Replit для Python — это онлайн-среда разработки, которая дает доступ к интерактивному редактору кода. Писать здесь проекты можно также на Java, Ruby, JavaScript. В редакторе можно открыть доступ к проекту всей команде, оставлять комментарии и работать над кодом вместе. Платформа интегрирована с GitHub, поэтому сохранять версии проекта можно быстро и просто. Также Replit дает возможность пользователям здесь же запустить и протестировать свои приложения, в том числе нейросети.
Anywhere Python
Онлайн-компилятор языка Python, который дает пользователю все функции полноценного редактора в браузере. Простые приложения, для которых не нужно много места и функционала, можно писать в этом редакторе бесплатно, самый дорогой тариф –– 10 долларов, дает по 2 ГБ памяти, возможность зарегистрировать собственный домен. В компиляторе предустановлено много библиотек для Python, есть интеграция с Git и другими открытыми репозиториями.
Trinket
Еще один онлайн-компилятор кода Python — Trinket. Его преимущество в том, что он позволяет открыть несколько вкладок и писать проекты параллельно. Платформу используют для обучения детей программированию на Python, у нее довольно простой интерфейс, установлены базовые библиотеки. Есть возможность запускать код и делиться им с командой.
IDEone
Онлайн-среда для Python, которая подойдет для быстрого тестирования простой программы. Он может переводить в машинный код более 60 языков программирования, но не богат разнообразием функционала. Например, в нем нельзя создавать новые файлы по ходу работы, а на максимальное время компиляции поставлены ограничения от 5 до 10 секунд.
Google Colab
Компилятор Python от Google. Дает возможность писать код программы онлайн, пользоваться библиотекой TensorFlow, тренировать нейросети и модели для аналитики данных. Код сохраняется в течение 12 часов, потом стирается, поэтому если компилятор нужен вам постоянно — нужно оформить подписку за 10 долларов.
Python Fiddle
Облачный компилятор кода Python, который не только позволяет использовать язык программирования онлайн, но и содержит большую базу знаний с примерами кода. Онлайн-среда разработки Fiddle поддерживает внешние библиотеки Python и дает возможность импортировать нужные данные из внешних источников по URL.
Читайте также Как написать Telegram-бот для распознавания изображений на Python?
Офлайн-интерпретаторы и компиляторы для Python
Интерпретаторы работают так же, как компиляторы, только переводят код не целым блоком, а по одной строке. Ниже приводим список популярных реализаций Python, которые работают одновременно как компиляторы и интерпретаторы.
CPython
Компилятор и интерпретатор Python, написанный на языке C сообществом разработчиков языка. Это наиболее распространенная, классическая реализация Python. Эта платформа компилирует код Python в байт-код, а затем выполняет его. Подробнее о компиляторах, интерпретаторах и байт-кодах читайте в словарной статье.
Jython
Компилятор и интерпретатор Python, которые переводят готовый код на язык Java. Сервис позволяет запустить приложение на компьютерах, которые используют вычислительную машину Java. Это помогает повысить производительность кода и скорость разработки.

Станьте дата-сайентистом на курсе с МГУ и решайте амбициозные задачи с помощью нейросетей
PyJS
Фреймворк, который переводит код с Python на JavaScript. Это позволяет разрабатывать на Python фронтенд браузерных и десктопных приложений. К фреймворку прилагается большое количество виджетов, которые помогают ускорить разработку.
PyPy
Интерпретатор Python, который позволяет преодолеть ограничения скорости оригинальной версии языка. PyPy совместим с библиотеками NumPy, Selenium, Flack, Django и другими. По отзывам пользователей, пока интерпретатор может читать не весь синтаксис Python, но большую его часть, и ускоряет приложения в разы.
IronPython
Это реализация Python, которая связана с фреймворком .NET и дает веб-разработчикам возможность использовать одновременно библиотеки Python и .NET. IronPython — это динамический язык, который будет полезен, если вам нужно быстро разработать веб-приложение.
ActivePython
Десктопная среда разработки для Python от разработчика Active State подойдет для коммерческой разработки, где необходима высокая степень безопасности кода. Скачать ActivePython можно бесплатно, но пользоваться им с сохранением кода можно ограниченное количество времени. Этот интерпретатор Python поддерживает большое количество библиотек для Data Science и машинного обучения (NumPy, SciPy, Matplotlib, TensorFlow, Theano, Keras).
Nuitka
Офлайн-компилятор Python, который переводит код на язык уровня C, а затем в исполняемый файл. Онлайн-среда работает со всеми версиями Python, а последняя версия увеличила производительность программирования на 335%. У компилятора есть бесплатная версия, которую можно использовать для личных проектов, и коммерческая — для компаний.
Stackless Python
Это интерпретатор Python, который позволяет повысить производительность разработки при помощи многопоточного программирования. Многие интерпретаторы не поддерживают эту функцию, но Stackless дает возможность быстро написать программу с читаемым кодом, не усложняя ее структуру.
Советы для изучения Python
- Начните с синтаксиса — это базовые правила, по которым пишутся команды на Python. Ваш главный источник — это официальная документация, затем можно обратиться к самоучителям для новичков, например, «Программируем на Python», или выбрать себе материалы из нашей большой подборки.
- Выберите удобную IDE (среду разработки). Это программа, которая объединяет все необходимое для написания кода: редактор кода, инструменты для сборки, выполнения и отладки, систему контроля версий. Чтобы выбрать подходящую IDE, воспользуйтесь нашим гайдом.
- Практикуйтесь. Пишите собственные простые программы, например, Telegram-боты, участвуйте в конкурсах, хакатонах и квестах для новичков, используйте интерактивные тренажеры.
Изучить Python, как и любой язык программирования, можно самостоятельно. Это потребует от вас усидчивости, постоянства и умения организовать собственные процессы обучения. Непросто, зато бесплатно. Облегчить и ускорить свой путь можно на платных курсах, например, «Fullstack-разработчик на Python» от Skillfactory, где вы будете получать актуальные знания от экспертов из индустрии и практиковаться на реальных задачах под руководством наставников.
Что такое компилятор
Если вы программист, то наверняка слышали слово “компилятор”. Но знаете ли вы, что это такое на самом деле? Вы когда-нибудь задумывались, что происходит под капотом, когда вы запускаете команду javac (если у вас код на Java)? Вы когда-нибудь хотели создать свой собственный язык программирования? — и просто заводили бесполезный репозиторий GitHub, где все равно есть только один readme.md, потому что вы даже не знаете, с чего начать. Я думаю, что начинать стоит с этого: узнать больше о компиляторе.
Итак, в этой статье мы разберёмся, что представляет собой компилятор. Если вы опытный программист, который знает про компилятор каждую мелочь, то извините, эта статья не для вас. Но если вы — тот самый парень из абзаца выше, то вперёд за мной, в кроличью нору. На протяжении статьи я буду обсуждать следующие подтемы:
- введение в компилятор;
- типы компиляторов;
- архитектура компилятора.
Мне хочется, чтобы к концу статьи вы могли понимать, что происходит под капотом, когда вы запускаете команду javac , а также получили некоторое представление о том, как написать свой собственный язык программирования.
Вступление
Компилятор — это не что иное, как переводчик исходного кода.
Задача компилятора — перевести исходный код с одного языка на другой. Это означает, что если вы скормите компилятору исходный код Java, то сможете получить исходный код Python (не самый лучший пример, просто для понимания сути. На самом деле вы получите байт-код Java, который можно запустить на JVM). Для выполнения этого процесса у компилятора есть несколько взаимосвязанных компонентов.
Типы компиляторов
Мы можем классифицировать компиляторы по-разному. В этой статье я расскажу о двух способах классификации компиляторов, однако особенно углубляться в это не буду.
Классификация компиляторов в соответствии с этапами компиляции
Здесь мы рассмотрим количество этапов, которые проходит компилятор. Некоторые компиляторы непосредственно преобразуют высокоуровневый исходный код в машинный код, а некоторые — сначала преобразуют высокоуровневый исходный код в промежуточное представление перед преобразованием в машинный код.
Таким образом, в соответствии с этой классификацией можно выделить три типа компиляторов:
- Однопроходной компилятор.
- Двухпроходной компилятор.
- Многопроходной компилятор.
Если вы хотите узнать больше об этой классификации компиляторов, посмотрите сюда.
Классификация компиляторов в соответствии с исходным кодом и целевым кодом
Для преобразования исходного кода в целевой применяются разные подходы. Некоторые компиляторы преобразуют код на высокоуровневом языке в машинный. Некоторые компиляторы преобразуют с одного языка высокого уровня на другой язык высокого уровня. Таким образом, здесь выделяются следующие типы:
- Кросс-компиляторы — такие компиляторы работают на одной платформе и производят код для запуска на другой платформе. Например, компилятор работает на платформе X и создает код для запуска на платформе Y. Такими компиляторами пользуются разработчики встроенных систем.
- Традиционные компиляторы — нам лучше всего знаком именно этот тип компиляторов. Такие компиляторы преобразуют исходный код языка высокого уровня в исходный код машинного языка. Набор компиляторов GCC преобразует эти языки в низкоуровневые, которые выполняются на этих платформах.
- Транспилеры — они преобразуют исходный код языка высокого уровня в исходный код другого языка высокого уровня. Например, Babel transpiler преобразует ECMAScript 2015+ в JavaScript.
- Декомпиляторы — они принимают низкоуровневый исходный код в качестве входных данных и пытаются создать высокоуровневый исходный код, который может быть успешно перекомпилирован.
Архитектура компилятора
Когда компилятор компилирует (переводит) исходный код, он проходит несколько этапов:
- Исходный код.
- Лексический анализ.
- Синтаксический анализ.
- Семантический анализ.
- Промежуточная генерация кода.
- Оптимизация кода.
- Генерация кода.
- Целевой код.
Мы можем разделить все эти этапы на две фазы, примерно как фронтенд и бэкенд. Эти фазы включают в себя следующие этапы:
Фронтенд
- Лексический анализ.
- Синтаксический анализ.
- Семантический анализ.
- Генерация промежуточного кода.
Бэкенд
- Оптимизация кода.
- Генерация кода.
В следующем разделе я кратко опишу, что происходит на каждой фазе. Если вы не программируете компиляторы, то нормально иметь о них лишь поверхностное представление, но если вы хотите разработать компилятор сами, то вам стоит подробно изучить их работу.
Лексический анализ
Теперь вы знаете, что компилятор — это программа, которая преобразует исходный код в другой исходный код. Компилятор получает исходный код в виде файла. Этот файл содержит код в текстовом формате, но компилятор не может работать с этим текстом. Необходимо преобразовать этот текст в некоторый другой формат, понятный компилятору. Для этого компилятор разбивает текст по маркерам. Помните, что эти маркеры заранее определены в грамматике языка. Маркеры пригодятся на следующих этапах процесса компиляции:
KEYWORD, BRACKET, IDENTIFIER, OPERATOR, NUMBER на приведенной выше диаграмме — это и есть маркеры. Компилятор использует лексический анализ для идентификации маркеров, и если он получает маркер, который не определен заранее в грамматике языка, то это будет считаться ошибкой.
Синтаксический анализ (парсинг)
На этом этапе компилятор проверяет, расположены ли идентифицированные ранее маркеры в правильном порядке. Для этого в каждом языке есть набор правил, называемый грамматикой. Во-первых, компилятор пытается построить структуру данных — дерево синтаксического анализа. Если компилятор смог успешно построить дерево синтаксического анализа в соответствии с заранее определенными правилами грамматики, то в исходном коде нет синтаксических ошибок. В противном случае возникают ошибки и компилятор их покажет.
Здесь мы сначала определили грамматику. Затем компилятор пытается построить дерево синтаксического анализа для исходного кода 2 + 3 * 3. В этом случае компилятору удается построить дерево синтаксического анализа (с правой стороны) в соответствии с грамматикой, следовательно в этой программе нет синтаксических ошибок.
Семантический анализ
Просто потому, что программа не содержит синтаксических ошибок, код еще не может считаться правильным. Рассмотрим предложение ниже.
Теперь предположим, что все слова в этом предложении — правильные лексемы, идентифицированные на этапе лексического анализа. Как люди, мы знаем, что в предложении на английском языке есть порядок подлежащее -> сказуемое -> дополнение.
Компилятор при анализе синтаксиса может решить, что в этом предложении нет синтаксических ошибок, потому что маркеры (слова) расположены в правильном порядке.
Теперь рассмотрим предложение ниже.
Предположим, что eat — правильный маркер в соответствии с грамматикой. Таким образом, предложение признается правильным на этапе лексического и синтаксического анализа, поскольку слова расположены в правильном порядке. Но в этом предложении нет никакого смысла — никто не может есть компиляторы.
Итак, согласно этапу семантического анализа, эта программа содержит ошибку. Мы называем эту разновидность ошибок семантическими ошибками. Взгляните на этот простой Java-код:
class SemanticAnalysis public static void main(String[] args) int a = 5;
int b = 10;
int total = c + d;
>
>
Здесь нет синтаксических ошибок. Все маркеры упорядочены правильно. Но на пятой строке int total = c + d — не имеет никакого значения, так как идентификаторы c и d не определены. Это и есть семантическая ошибка.
Генерация промежуточного кода
Любой компилятор может непосредственно генерировать машинный код из исходного. Так зачем же тогда нужна фаза генерации промежуточного кода?
Существуют различные типы машин. Таким образом, машинный код зависит от системы, а высокоуровневый исходный код — нет. Если компилятор непосредственно генерирует машинный код из исходного кода, то каждая машина нуждается в полной компиляции от фронта к бэку. Но когда компилятор генерирует промежуточный код (промежуточное представление), он уже может генерировать машинный код для каждой машины с его помощью, без повторения лексического анализа и парсинга для каждой машины.
Существует два основных типа промежуточных представлений:
- Высокоуровневый — более близкий к высокоуровневому языку.
- Низкоуровневый — более близкий к машинному коду.
Существует также несколько способов представления промежуточного представления.
- AST — абстрактное синтаксическое дерево (графическое).
- Постфиксная нотация.
- Трехадресный код.
- Двухадресный код.
Оптимизация кода
Этап оптимизации кода выполняет две основные задачи: минимизация времени или минимизация ресурсов. Что все это значит? Когда пользователь пишет код, нет ничего, кроме инструкций. Когда процессор выполняет эти инструкции, требуют время и ресурсы памяти. Таким образом, целью этапа оптимизации кода становится сокращение времени выполнения и ресурсов, потребляемых программой. Оптимизатор кода всегда следует трем правилам:
- Выходной код никоим образом не должен изменять значение исходного кода.
- Минимизируйте либо время, либо ресурсы, либо и то и другое вместе.
- Фаза оптимизации кода сама по себе не должна занимать много времени и замедлять весь процесс компиляции.
Существует два способа оптимизации кода:
- Машинно-независимая оптимизация.
- Машинно-зависимая оптимизация.
Машинно-независимая оптимизация принимает промежуточное представление относительно входных данных и не заботится ни о каких регистрах процессора и ячейках памяти. Она происходит после генерации промежуточного кода.
При машинно-зависимой оптимизации кода компилятор заботится о регистрах процессора, расположениях памяти и архитектуре машины. Она происходит после генерации машинного кода.
Генерация кода
Генерация кода — это последний этап процесса компиляции. Да, после может следовать машинно-зависимая оптимизация кода. Но мы можем рассматривать и то, и другое вместе как генерацию кода. На этом этапе компилятор генерирует машинно-зависимый код. Генератор кода должен иметь представление о среде выполнения целевой машины и ее наборе команд.
На этом этапе компилятор выполняет несколько основных задач:
- Выбор инструкций — какую инструкцию использовать.
- Создание расписания инструкций — в каком порядке должны быть упорядочены инструкции.
- Распределение регистров — выделение переменных в регистры процессора.
- Отладка данных — отладка кода с помощью отладочных данных.
Итоговый машинный код, сгенерированный генератором кода, может быть выполнен на целевой машине. Именно так высокоуровневый исходный код, который мы пишем в нашем любимом редакторе кода, преобразуется в формат, который можно запустить на любой целевой машине.
В этой статье я предоставляю только краткое описание. Если вам хочется углубиться в эти концепции, к вашим услугам миллионы ресурсов в интернете.
- Пять отличных Python-библиотек для data science
- Значение Data Science в современном мире
- Шесть рекомендаций для начинающих специалистов по Data Science