Что такое компилятор? Как работает: виды и примеры
![Что такое компилятор?](https://s.digitalocean.ru/upload/1715612471_oskaryildizcOkpTiJMGzAunsplash.jpg)
Компьютер и его составляющие не способны понять и выполнить команды на придуманных человеком языках программирования. Если команды и другие элементы программного кода, написанные программистом, напрямую будут считаны вычислительной машиной, они предстанут для них бессмысленным набором символов. Для организации своей работы все компьютеры используют длинные комбинации нулей и единиц, регулирующие включение и отключение переключателей.
Что такое компилятор?
Компилятор — это вид специального ПО, которое трансформирует программный код (программный текст) языка программирования в двоичный код, легко выполняемый компьютером. От пользователя компилятор получает исходник, а получившуюся комбинацию нулей и единиц передает компьютеру. Для преобразования программа использует методы анализа и синтаксиса.
Первые компиляторы
Впервые программа, преобразующая команды человека в двоичную форму, была создана в 1951 году американским программистом Грейс Хоппер. Эта программа за миллисекунды трансформировала программный текст высокого уровня, организовывала подпрограммы и распределяла память ЭВМ. Новую программу Хоппер назвала компоновщиком (англ. compiler). Такое название она объяснила тем, что программа подбирает нужную подпрограмму из библиотеки компьютера. Первый компилятор получил название A-0.
Впоследствии языки программирования стали снабжаться специализированными компиляторами. В 1957 было создано средство для языка FORTRAN, а в 1960-х — ПО от создателей COBOL.
Сегодня разработано множество компилирующих программ для разных языков программирования и для выполнения различных задач. Если вы не знаете, какой выбрать для изучения, прочитайте нашу статью.
Какие задачи выполняет компилятор
Кроме изложения программного кода в понятной для компьютера форме, компилятор выполняет следующие задачи:
1. Оптимизация программного текста, в рамках которой уменьшается объем используемой памяти, увеличивается скорость выполнения.
2. Анализ синтаксиса, лексики, семантики, который позволяет избежать ошибки в проектировании исходного текста.
3. Статический анализ кода для определения потенциальных уязвимостей программы.
4. Создание готовых к запуску исполняемых файлов на основе программного текста.
Как работает компилятор
Преобразование программного кода в машинный проходит в несколько этапов.
Лексический анализ
Программа идентифицирует лексические единицы исходника и группирует их по классам, таких как идентификаторы, константы, ключевые слова и т. д. Лексический анализ выполняется для прочтения компилирующим ПО исходного кода.
Синтаксический анализ (парсинг)
Определение правил написания исходника, построение синтаксического дерева. Если дерево получилось построить, значит, ошибок в исходнике нет. Проблемы в построении дерева свидетельствуют об ошибках, о которых компилятор сообщит пользователю.
Семантический анализ
Проверка согласованности элементов исходника, их смысла и значения.
Генерация промежуточного кода
Создание версии кода, занимающего среднее положение между языком программирования и машинным кодом. Эта версия генерируется так, чтобы ее можно было легко преобразовать в двоичную систему. Также на базе промежуточного кода легче сделать несколько машинных кодов для разных платформ.
Оптимизация
Из промежуточного варианта убираются ненужные части, увеличивающие объем и время чтения.
Генерация машинного кода
Элементы промежуточного кода преобразуются в чисто машинную форму, легко выполняемую компьютером. Программа на этом этапе определяет инструкции и их расписание, отлаживает данные и распределяет переменные по регистрам процессора.
Итог компиляции — исполняемый файл, как правило, с расширением .exe. Для начала его работы оператору достаточно его запустить.
Виды компиляторов
Конкретная компиляция работает лишь на определенном типе устройств, платформе или архитектуре. Поэтому программисты создали несколько типов компилирующих программ для их использования в конкретной ситуации.
Традиционный
Программа, трансформирующая исходник на языке программирования высокого уровня в двоичный код или инструкцию на языке низкого уровня.
Транспилер
Средство, переводящее код с одного языка высокого уровня на другой язык такого же уровня, с сохранением уровня абстракции. Примеры транспилеров - Babel, трансформирующий ECMAScript 2015+ в Javascript; Haxe, переводящий программные тексты на одноименном языке, JSweet, переводящий Java в Typescript.
JavaScript применяют не только в интерактивных веб-страницах, но и в мобильных играх. Прочитайте об этом языке программирования в нашей статье.
Кросс-компиляторы
Инструменты, функционирующие на одной платформе и создающие программный текст для другой. Они полезны, когда устройств с целевой платформой нет у программиста в наличии. Пример кросс-компилятора — GCC.
Декомпиляторы
Программа, производящая обратную компиляцию — перевод двоичного кода на язык программирования высокого уровня. Получившийся документ можно будет перевести в машинную форму для другой платформы или архитектуры, а также проверить на наличие ошибок. Примеры — IDR, FemFlower, .NETReflector.
Языки программирования компилятора
Для составления компилятора используются языки программирования. Как правило, это язык уровнем ниже, чем тот, с каким работает программа. К примеру, компилирующая программа для Javascript составлена на языке C++, средство, трансформирующая C++ - на С, а для перевода C используется средство на ассемблере.
Для увеличения производительности используется следующая система компилирующих программ, дающая самокомпилируемый компилятор. Первый написан на ассемблере и компилирует результат второго, который написан на сложном языке. Второй компилятор переводится в машинную форму и трансформирует собственные исходники. Итог схемы — более производительная версия второго компилятора.
Чаще всего компилирующее ПО пишут на языках C и C++ (поскольку они близки к аппаратному уровню), Python (из-за удобства и хорошей абстракции). Java используют для виртуальных машин и разработки приложений на этом языке.
Чем отличается компилятор от интерпретатора, транслятора, других программ
Для работы с программным текстом и его чтения программисты используют различные инструменты и не ограничиваются компилятором. Работа интерпретатора и транслятора, казалось бы, похожа на работу компилятора. Но действительно ли они занимаются одним и тем же?
Интерпретатор также читает программный текст. Но она не проводит анализ документа и перевод в двоичную форму, а сразу выполняет его. Чтобы интерпретатор прочитал файл, он должен быть выполнен на интерпретируемом языке программирования.
Транслятор — общее название для всех программных средств, преобразующих программные тексты в другие языки программирования. Компилятор — одна из разновидностей транслятора.
JIT-компилятор объединяет функции компилятора и интерпретатора. Он читает и выполняет программный текст, но если какие-то его части встречаются несколько раз, он их переводит в машинную форму. Так JIT-компилятор избегает ненужной работы и достигает ускорения работы.
Байт-код занимает промежуточное положение между программным и машинным. Его запускают в виртуальной машине, например, Java.
Достоинства компиляторов и компилированного кода
1. Выполнение компилированного кода проходит быстрее за счет его адаптации и ненадобности преобразования в машинную форму.
2. Исходный код программы, прошедшей компиляцию, труднее распознать. Это снижает вероятность взлома и несанкционированного использования.
3. Компиляция оптимизирует код, убирая лишнее и тем самым повышая эффективность его работы.
4. Объем программного текста после компиляции меньше, чем кода, не прошедшего этот процесс.
5. Компилируемые языки позволяют лучше контролировать распределение аппаратных ресурсов. Этот пункт вытекает из предыдущего.
6. Компилированный код лучше адаптируется под конкретную архитектуру, тип устройства.
7. Языки программирования с поддержкой компиляции отличаются хорошей производительностью и подходят для создания тяжелых приложений.
Недостатки компиляторов и компилированного кода
1. Компиляция выполняется лишь под определенную платформу. К примеру, компиляцию для Android не получится запустить на Windows. Поэтому если нужно расширить поддержку продукта, придется сделать новую компиляцию. Универсальная компиляция, конечно, существует, но круг применения у нее узкий.
2. Процесс компиляции займет определенное время, что может отложить запуск продукта.
3. При внесении изменений в исходник нужно будет компилировать его заново.
Заключение
Компилятор — это вид ПО, переводящий текст программы на языке программирования высокого уровня в двоичную форму, которую компьютеру легко исполнить. Другие задачи, выполняемые компилирующим ПО — создание исполняемых файлов, оптимизация и проверка программного текста на возможные и существующие ошибки. Первое компилирующее ПО было создано в 1951 году.
Перевод программного кода в машинный начинается с лексического анализа исходника, затем проверяется синтаксис (правила написания и их соблюдение) и семантика (согласованность и смысл элементов). После анализа текста создается и оптимизируется промежуточный код. Финальный этап компиляции — преобразование промежуточного кода в чисто машинный.
Компилирующие программы делятся на традиционные, а также транспилеры, кросс-компиляторы и декомпиляторы. Языком для составления компилирующего ПО обычно служит язык более низкоуровневый, чем трансформируемый программный текст.
Достоинства компиляции — быстрота работы программы, маскировка исходника, лучшая оптимизация и меньший объем программного кода. Компилированные программы рациональнее расходуют ресурсы компьютера при лучшей производительности, лучше адаптируются к разным архитектурам.
К недостаткам компиляции относятся длительность процесса, отсутствие кроссплатформенности. Также при внесении изменений в исходник компиляцию придется делать заново.
Компьютерная игра — это не только средство досуга, но и полноценное произведение искусства. Если вы хотите создать свою игру, прочитайте нашу статью.
Использованные источники: Unsplash, Florian Olivo, Oskar Yildiz, Kevin Ku, Kevin Canlas, Lavk Perchik
![ПРОФЕССИОНАЛЬНЫЙ СОЗДАТЕЛЬ УШЕЛ ИЗ ЖИЗНИ ВИТАЛИЙ ЕЗОПОВ](https://s.digitalocean.ru/627/upload/1723119493_VIT_9227.jpg.webp)