Программа для перевода инструкций языка программирования в машинный код

#статьи


  • 0

Что такое компилятор и как он работает

Знакомимся с программой, которая умеет создавать другие программы для того, чтобы создавать ещё больше программ.

Иллюстрация: Оля Ежак для Skillbox Media

Дмитрий Зверев

Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.

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

В этой статье разберёмся:

  • для чего нужны компиляторы;
  • как они работают;
  • на каких языках их пишут;
  • почему у одного языка может быть несколько компиляторов;
  • какие они бывают;
  • в чём их отличие от интерпретаторов и трансляторов;
  • какие плюсы и минусы есть у компилируемых языков;
  • где узнать про компиляторы подробнее.

Выдвинем дерзкое утверждение: компьютеры очень глупы, они не понимают человеческого языка — и, в частности, языков программирования. Всё, что они умеют, — это принимать электрические сигналы и как-то на них реагировать.

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

Когда мы пишем код, то используем понятные для людей слова, такие как print, string, import, Процедура и Исключение. Нам их значение кажется очевидным: здесь вывели результат на печать, а там объявили строковую переменную. Но для компьютера эти слова ничего не значат.

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

Компилятор понимает, что значит слово print — и даже умеет сказать компьютеру, как его правильно обработать. Таким образом, он решает три задачи:

  • разбирает синтаксис написанного;
  • анализирует его;
  • генерирует машинный код.

На вход компилятор принимает исходный код, а отдаёт исполняемый файл — программу, которая готова к работе.

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

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

?‍♂️ Коротко

Компилятор получает на вход файл с кодом на каком-то языке программирования. Он преобразовывает конструкции языка в формат, понятный компьютеру, и возвращает файл, который тот сможет выполнить.

Чтобы преобразовать исходный код, компилятор использует собственный словарь с определениями — например, оператор if меняет на 11010011100110, а сложение — на 101011. Он делает это, пока не закончатся все строки в файле. Получается исполнительный файл, который выглядит так:

001011011010010101110101010101010100001100001110111100110100001010001001110…

В таком формате компьютеру уже удобно читать инструкции и выполнять их. А значит, компилятор сделал свою работу хорошо.

? Подробнее. Компилирование состоит из пяти этапов: синтаксического анализа, парсинга, семантического анализа, оптимизации и генерации кода. Давайте разберём каждую стадию.

1️⃣ Синтаксический анализ. Это что-то вроде разбора грамматики языка. Когда мы пишем код, то следуем определённым правилам — синтаксису. Например, в Java между командами ставим точку с запятой. Если этого не сделать, то получим ошибку.

На этапе синтаксического анализа компилятор проверяет, соответствует ли код правилам конкретного языка программирования. И пока он не думает о том, что именно написано, — проверка идёт только по формальным признакам.

2️⃣ Парсинг. На этом этапе компилятор разбивает код на маленькие кусочки — токены. Каждый токен — это какое-то слово или символ, например if, while, int или (.

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

Давайте посмотрим, как выглядит такое дерево.

Допустим, у нас есть простой код со сложением двух чисел:

x = 5 + 3

Здесь пять токенов: x, =, 5, + и 3. Пробелы считать не будем. Из этих токенов строится такое дерево:

Обычно синтаксические деревья намного сложнее — очень намного.
Изображение: Skillbox Media

Мы видим, что на вершине находится главная операция — присваивание переменной x результата сложения двух чисел. От неё отходит две ветви — сама переменная x и символ сложения, который ветвится на слагаемые числа.

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

3️⃣ Семантический анализ. Компилятор начинает вдумываться в то, что написано в коде, анализируя составленное синтаксическое дерево. Например, если мы объявили переменную, он понимает, что это значит и какие операции можно с ней выполнить.

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

4️⃣ Оптимизация. Когда синтаксис разобран и стало понятно, что делает программа, время ускорить работу кода. Компилятор ищет способы повысить скорость его выполнения или уменьшить количество занимаемой им памяти.

Самый простой пример оптимизации — умножение на ноль. Например, у нас есть фрагмент кода:

int x = sin(126) * cos(54) + tan(78);
int y = x * 0;

Чтобы определить значение переменной y, потребуется сначала вычислить сложную формулу для переменной x. Но мы, люди, сразу видим, что при умножении на ноль, результат будет нулём, а значит, смысла считать переменную x нет. Компилятор тоже видит такие вещи — и не будет вычислять то, что вычислять бесполезно. Он просто заменит эти две строки кода на одну:

int y = 0;

Удобно, правда? Но это сработает только в том случае, если переменная x не пригодится нам в программе дальше.

Это возможно из-за особенностей работы компилятора — он не выполняет код, а сначала читает его и ищет способы оптимизации программы.

5️⃣ Генерация кода. Синтаксис разобран, анализ проведён, код оптимизирован — пора перевести его на язык компьютера. На этом этапе все команды, что мы писали на языке программирования, переводятся в машинные инструкции.

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

? Подождите, раз компилятор переводит исходный код в машинный, а сам он является программой, то на каком языке тогда он написан? Какой-то замкнутый круг получается.

На самом деле всё не так сложно. Компиляторы можно писать на любом языке — хоть на Python, хоть на языке ассемблера. Но есть нюанс.

Самый первый компилятор написан на языке ассемблера, потому что программистам нужно было как-то упростить себе работу с машинным кодом. Работают они так:

  • разработчик пишет код на ассемблере;
  • компилятор переводит его в машинные инструкции;
  • компьютер запускает эти инструкции.

Получается, что компилятор на ассемблере — это другая программа на нём же, которая умеет переводить код. Например, она подставляет вместо команды jmp строку 001110111, которая запускает нужные шестерёнки внутри процессора.

После уже появились языки более высокого уровня — например, C. Компилятор для C написан на том же ассемблере. Работает он похожим образом:

  • разработчик пишет программу на C;
  • компилятор переводит команды на языке программирования с C в машинные инструкции;
  • компьютер запускает эти инструкции.

Дальше — вверх по высокоуровневости языков программирования. Компилятор на С++ написан на C, а для JavaScript — на C++. Но если спускаться по цепочке, то мы рано или поздно придём к ассемблеру.

? Стойте, а зачем тогда языкам программирования несколько компиляторов? Почему бы всем не использовать только один?

Для каждого языка программирования первый компилятор обычно пишут его разработчики. Например, возьмём язык C.

Его компилятор написан на ассемблере, а сделал это Деннис Ритчи. Он исходил из принципов, что одни команды языка должны конвертироваться в одни инструкции для ассемблера, а другие — в другие. Но, возможно, это была не лучшая реализация: в каких-то местах компилятор мог работать медленно, а в каких-то и вовсе не справлялся. Поэтому сторонние разработчики решили написать свои версии «переводчика» кода на C.

Например, кто-то мог взглянуть на код компилятора C и подумать: «Да тут же нет сборщика мусора, это что такое-то?!» — и пойти написать свою версию, которая будет залатывать все утечки памяти и чистить неиспользуемые переменные.

Другой разработчик может взглянуть и подумать: да тут же нет нормальной оптимизации под мои задачи из машинного обучения. А затем пойти и написать компилятор, который будет конвертировать код на C в TensorFlow-структуры.

Каждая реализация компилятора нужна для своих целей: кому-то важно собирать мусор, а кому-то иметь супербыстрый код, который обгонит любой другой. Это значит, что они будут различаться архитектурой, используемым языком программирования, скоростью работы и назначением. Но глобально — будут делать одну и ту же вещь: компилировать.

К сожалению, ещё нет универсального компилятора, который бы переводил код любого языка программирования в машинный код для всех устройств. У нас есть разные операционные системы, их версии, разная архитектура процессоров и так далее.

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

Умеют переводить код на языке программирования в машинный. Именно о них мы преимущественно и говорили в этой статье. Пример — компилятор g++ для языка C++.

Эти компиляторы работают на одной платформе и создают код для другой. Их часто используют разработчики для встроенных систем, мощности которых недостаточно для самостоятельного компилирования. Например, в микроконтроллерах.

К кросс-компиляторам относят GCC (GNU Compiler Collection). Он поддерживает C++, Objective-C, Java, Fortran и Go и разную архитектуру процессоров.

Кадр: сериал «Кремниевая долина» / HBO

Преобразуют исходный код языка высокого уровня в исходный код другого языка высокого уровня. Например, транспайлер Babel преобразует ECMAScript 2015+ в JavaScript.

Эти компиляторы делают обратное действие — анализируют уже скомпилированный код и пытаются превратить его в исходный код на высокоуровневом языке. Это может быть полезно для анализа или отладки.

Компиляторы — это не единственный способ перевести исходный код в машинный. Ещё есть интерпретаторы и JIT-компиляторы. Давайте коротко расскажем, в чём различия между ними.

Интерпретатор. Это как синхронный переводчик. Он читает исходный код и сразу же выполняет его построчно. Интерпретатор не создаёт дополнительных файлов и не строит синтаксические деревья, а выполняет инструкции на лету, переводя их в байт-код. Например, так работает CPython для языка Python.

JIT-компилятор. Это гибрид компилятора и интерпретатора. Он начинает работать как интерпретатор и выполняет команды по ходу чтения кода. Но часть команд переводит в машинный код, чтобы использовать их в тех случаях, если они будут повторяться в будущем. Это ускоряет работу программы, так как позволяет не выполнять одно и то же действие повторно.

Отдельно стоит упомянуть байт-код. Это специальный код, который запускается на виртуальной машине. Можно сказать, что он занимает промежуточное положение между кодом, написанным на языке программирования, и машинным кодом. Его реализацию можно найти в Java или Python.

Давайте посмотрим на список аргументов за и против для компилируемых языков — то есть тех, которые используют компиляторы. Примеры таких языков: C++, Haskell, Fortran, Rust, Swift и Go.

Быстрота выполнения. Компилятор переводит исходный код в машинный всего один раз. А дальше — всё уже оптимизировано и готово к запуску. Поэтому такие программы работают быстрее, так как компьютеру не приходится тратить время на их повторный перевод.

Эффективное использование ресурсов. Один из этапов компилирования — это оптимизация кода. А так как компиляторы пишут либо создатели языка, либо опытные разработчики, то производительность таких программ будет высокой.

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

⛔️ Долгая компиляция. Процесс компиляции может занимать очень много времени. Для небольших проектов это не так страшно, но когда количество строк кода у проекта переваливает за миллион, то лишний раз запускать компиляцию не хочется.

⛔️ Сложность исправления ошибок. Обычно ошибки при компилировании выглядят устрашающе из-за запутанного описания проблемы. Просто попробуйте не поставить точку с запятой в файле с C++ и убедитесь, что ничего хуже вы не видели.

⛔️ Зависимость от платформы. Если скомпилировать программу для Windows, то её никак нельзя будет запустить на macOS. Поэтому придётся дополнительно брать другой компилятор и начинать процесс заново — или использовать кросс-компиляторы.

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

  • Компиляторы: принципы, технологии и инструментарий Альфреда Ахо и Моники Лам.
  • «Конструирование компиляторов», Сергея Свердлова.
  • Бесплатный курс «Языки программирования и компиляторы» от Computer Science Center.

Бесплатный курс по Python ➞

Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе.

Смотреть программу

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

Процесс работы компилятора с кодом называется компиляцией, или сборкой. По сути, компилятор — комплексный «переводчик», который собирает, или компилирует, программу в исполняемый файл. Исполняемый файл — это набор инструкций для компьютера, который тот понимает и может выполнить.

Языки программирования, для перевода которых используются компиляторы, называются компилируемыми.

Для чего нужен компилятор

Изначально компьютер не понимает смысл написанного на любом языке программирования. Язык компьютера — машинные коды, нули и единицы, в которых зашифрована информация и команды. Писать на машинных кодах программы практически невозможно: даже простейшее действие будет отнимать много часов работы программиста. Поэтому появились языки программирования, более понятные для людей, и специальные программы, которые переводят эти языки в машинные коды. Эти программы и есть компиляторы.

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

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

Компилятор и интерпретатор: в чем разница

Компиляция — не единственный подход к «переводу» человекопонятного языка программирования на машинный. Еще есть интерпретаторы и байт-код, но там технологии совсем другие.

Интерпретатор — это тоже программа, которая «переводит» текст на высокоуровневом языке программирования, но делает это иначе. Она не собирает весь код в один исполняемый файл для последующего запуска, а исполняет код сразу, построчно. Это чуть медленнее, но иногда удобнее. Языки, использующие интерпретаторы, называются интерпретируемыми.

Байт-код — «промежуточное звено» между подходами компиляции и интерпретации. Программа преобразуется в особый код, который запускается под специальной виртуальной машиной. Языков, которые работают так, относительно немного, самый известный и яркий пример — Java.

В каких языках используются компиляторы

Среди популярных сегодня языков компилируемыми являются Swift и Go, а также C / C++ и Objective-C. Другие примеры — Visual Basic, Haskell, Pascal / Delphi, Rust, а также Lisp, Prolog и прочие менее известные языки. Разумеется, компилируемым является и язык ассемблера — очень низкоуровневый и написанный напрямую на машинных кодах.

Отдельно можно выделить языки, которые трансформируются в байт-код — это тоже своего рода компиляция. К ним относятся Java, Scala и Kotlin, а также C# и языки платформы .NET.

На каких языках пишут компиляторы

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

Например, один из компиляторов языка Go частично написан на C++, самый первый компилятор C++ — на ассемблере, а уже ассемблер — на машинных кодах.

Тот же язык. Написать компилятор для языка программирования можно на других версиях того же языка — такой подход разрешен и активно используется в разработке. Это нужно, чтобы компиляторы были более гибкими и «умными» и могли поддерживать больше возможностей, — ассемблер довольно примитивен и не решает всех задач.

Выглядит это так:

  • первый, более простой компилятор пишется на ассемблере;
  • второй пишется уже на нужном языке и компилируется первым компилятором;
  • переведенный в машинные коды второй компилятор компилирует свои же исходники — получается более новая и мощная версия его же.
Как пишут компиляторы

Например, большинство современных компиляторов для C / C++ написано на C / C++. Такие компиляторы называют самокомпилируемыми.

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

У большинства языков программирования несколько компиляторов. Их еще называют реализациями. Изначальную реализацию пишет создатель языка, потом со временем появляются альтернативные. Зачем это делается? Цели могут быть разными:

  • написать более современный и функциональный компилятор, обновить язык;
  • оптимизировать язык и сделать его эффективнее;
  • создать свободную реализацию, которую сможет дополнять сообщество;
  • исправить ошибки, которые есть в существующих реализациях;
  • перенести язык на другую платформу, и так далее.

Подходы к оптимизации, портированию и выполнению других целей у всех групп разработчиков свои. Поэтому разные компиляторы одного и того же языка могут различаться скоростью, особенностями архитектуры, назначением и другими параметрами. Синтаксис языка при этом остается таким же, но есть особые ситуации, когда одна и та же строчка может выполняться по-разному в зависимости от компилятора.

Какими бывают компиляторы

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

Один компилятор может «знать» несколько языков программирования. Яркий пример такого решения — GCC, или GNU Compiler Collection, кросс-компилятор для нескольких операционных систем и языков, полностью бесплатный и свободный. На нем написано программное обеспечение GNU.

Существуют и так называемые компиляторы компиляторов. Они генерируют компиляторы для языка на основе его формального описания.

Как устроены и работают компиляторы

Простыми словами, они «читают» пришедшую к ним на вход программу и переводят ее команды в соответствующие им наборы машинных кодов. Детали уже сложнее и различаются в зависимости от реализации. Например, есть модульные гибкие компиляторы, написанные на высокоуровневых языках, есть отладочные компиляторы, способные устранять часть синтаксических ошибок, и так далее.

Сама компиляция может быть:

  • построчной — в машинный код по очереди переводится каждая строка, что похоже на интерпретацию, но отличается технически;
  • пакетной — код разбивается на блоки, или пакеты, и компилируется поблочно;
  • условной — особенности компиляции зависят от условий, которые прописаны в исходном коде компилируемой программы.

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

схема работы компилятора

Преимущества компилируемых языков

  • Компилируемые языки обычно быстрее, чем интерпретируемые, и их легче оптимизировать.
  • Итоговый размер кода у компилируемых языков, как правило, меньше, чем у интерпретируемых.
  • В компилируемых языках намного шире возможность контролировать аппаратные ресурсы. Это не значит, что они все низкоуровневые, но обратное — верно: практически все низкоуровневые языки — компилируемые.
  • Когда процессоры становятся мощнее, именно компилируемые языки могут в должной мере задействовать их преимущества.
  • Код после компилятора лучше оптимизируется под конкретные устройства, архитектуру «железа», эффективно задействует память и не тратит лишних ресурсов.
  • Компилируемые языки обычно мощные и высокопроизводительные, поэтому на них пишут игры и другие серьезно нагруженные приложения.

Недостатки компилируемых языков

  • В отличие от интерпретируемых языков, компилируемые не выполняют код сразу — его сначала нужно собрать, а это лишний шаг и лишнее время.
  • Код сложнее в отладке: приходится заново компилировать его при каждом, даже небольшом изменении. Сам процесс поиска и устранения ошибок бывает довольно неочевидным.
  • Машинный код жестко связан с архитектурой платформы и различается в зависимости от системы. Поэтому компилируемые языки — по умолчанию не кроссплатформенные. Для переноса языка на другую операционную систему понадобится писать новый компилятор. Правда, есть исключения в виде универсальных кросс-компиляторов, работающих под разными платформами, но они подходят не для всего.
  • Для новичков проблема еще и в том, что компилируемые языки часто сложнее, чем интерпретируемые. Изучать их с нуля может быть тяжело, хотя и тут есть исключения.

Как пользоваться компилятором

Начинающий разработчик редко взаимодействует с компилятором напрямую. Он скачивает язык программирования, в том числе его компилятор, а потом работает в редакторе кода или IDE. Среда разработки сама запускает компилятор каждый раз, когда пользователь кликает на кнопку сборки или выполнения программы. Для этого его не нужно вызывать вручную. Иногда среда может сама включать в себя несколько компиляторов и выбирать подходящий в каждом случае.

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

У любого ПО есть документация, так что, если вы хотите узнать больше о компиляторе, которым пользуетесь, можете прочитать ее.

Узнайте больше об устройстве и работе языков программирования на курсах — получите новую профессию и станьте востребованным IT-специалистом.

В процессе разработки программного обеспечения приходится сталкиваться с разными этапами жизненного цикла проекта. Одним из них является компиляция. Обойтись без этой операции при проверке приложения или его отладке практически невозможно. За компиляцию кодов отвечают специальные инструменты. Они носят название компиляторов.

Сегодня предстоит познакомиться с этими инструментами для работы с кодом поближе. Также необходимо выяснить, что собой представляет компиляция. А еще – познакомиться с так называемыми интерпретаторами и выяснить, чем они отличаются от компиляторов.

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

Ключевые определения

Компилятор – это специальная программа, которая переводит текст, написанный на языке программирования, в машинные коды. С помощью данного инструмента проект, созданный так, чтобы он был понятен человеку, преобразовывается в ясный для компьютера или любого цифрового устройства.

С помощью компиляторов гаджеты получают возможность понимать языки разработки, включая высокоуровневые – приближенные к человеку и отдаленные от «железа».

Компиляция кода – это процесс работы компилятора с исходным кодом (текстом). Данная процедура также носит название сборки.

Компилятор представляет собой некого посредника между проектом и компьютером. Он является комплексным «переводчиком», который собирает (или компилирует) программу в исполняемый файл.

Исполняемый файл – это некоторый набор инструкций для устройства, который оно способно понять и выполнить.

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

Для чего необходим

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

Изначально компьютеры не понимают смысл написанного на том или ином языке программирования текста. Языком компьютера выступают машинные коды. Они представлены сочетанием нулей и единиц. Эти элементы используются для «шифрования» информации и разнообразных команд.

Писать проекты при помощи машинных кодов почти невозможно – даже элементарную операцию придется описывать очень долго (несколько часов). Это привело к появлению языков разработки, которые в большей степени понятны разработчикам. В машинные коды их потом преобразовывают специальные программы. Эти приложения и есть компиляторы.

Без рассматриваемого элемента любой код, написанный при помощи компилируемого языка, будет для компьютера просто текстом. Устройство не сможет:

  • считать команду;
  • обработать представленную информацию;
  • выполнить ту или иную операцию.

Компиляция программы нужна для того, чтобы программы могли распознаваться цифровым устройством, а также выполняться. Без данной процедуры и соответствующего инструмента программирования ничего работать не будет.

Еще одной задачей компиляторов является сбор всех модулей (в качестве примера можно взять подключенные библиотеки) в единый файл. Необходимо, чтобы исполняемый документ включал в себя все необходимое для нормального функционирования программы, а также полноценного выполнения инструкций.

Интерпретатор – отличие от компилятора

Компиляция – не единственный вариант преобразования исходных кодов проектов в машинную интерпретацию. Есть еще так называемые интерпретаторы, а также байт-код. Они используют совершенно другие технологии для работы с «человекопонятными» языками.

Чтобы понять разницу между этими инструментами, необходимо запомнить следующее:

  1. Интерпретатор – программа, «переводящая» текст на высокоуровневом языке программирования. Отличие заключается в способе реализации. Весь код здесь не собирается в один исполняемый документ для последующего запуска. Проект исполняется интерпретатором сразу, строка за строкой. Интерпретация работает медленнее компиляции, но иногда именно такой подход служит оптимальным решением в разработке. Языки, использующие соответствующую «технологию», носят название интерпретируемых.
  2. Байт-код. Служит промежуточным звеном между подходами компиляции и интерпретации. Приложение преобразуется в особый код, запускаемый специальной виртуальной машиной. Такую концепцию использует очень малое количество языков разработки. Наиболее известным примером служит Java.

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

Компилируемые языки

Изучаемый инструмент не является обязательным при разработке программного обеспечения. Он активно используется только определенными языками.

Наиболее популярными компилируемыми инструментами программирования выступают:

  • C и C++;
  • Swift;
  • Go;
  • Objective-C.

Компилируемыми выступают еще и: Pascal, Haskell, Rust, Delphi, Visual Basic, Lisp, Prolog. Это неполный список языков, работающих с компиляторами. Менее известные средства разработки тоже пользуются ими.

Ассемблер – это тоже компилируемое средство программирования. Он очень низкоуровневый и написан напрямую на машинных кодах.

Отдельно стоит выделить языки, которые преобразовываются в байт-код. Данная операция может тоже рассматриваться в качестве своеобразной компиляции. Сюда относят: Kotlin, Java, C#, Scala, а также языки .NET-платформы.

На чем пишутся

Компиляторы – это программы, которые не существуют сами по себе. Их необходимо программировать. Делается это несколькими способами:

  1. При помощи других инструментов разработки. Писать компиляторы на машинном коде – это долго и не всегда хорошо. Иногда добиться желаемого результата вовсе невозможно. Это привело к тому, что компиляторы кодов пишут на уже существующих языках. Данная ситуация приводит к тому, что большинство языков написано на других. В качестве примера можно привести один из компиляторов Go. Он частично написан на C++. А самый первый компилятор C++ – на ассемблере. Ассемблер – на машинном коде.
  2. Через тот же инструмент разработки. Написать компилятор для того или иного инструмента программирования можно на других версиях того же самого языка. Такой подход допускается на практике. Он активно используется в программировании. Это необходимо, чтобы компиляторы были более гибкими и «умными», а также поддерживали более широкие возможности.

Процедура создания кодов рассматриваемого инструмента выглядит примерно так:

  1. Первое средство компиляции пишется на ассемблере.
  2. Второе приложение для преобразования кодов пишется при помощи подходящего инструмента разработки. Он компилируется ранее сформированным проектом.
  3. Переведенное в машинные коды второе приложение преобразования кодов компилирует свои же исходники. Это приводит к появлению его более совершенной и мощной версии.

Большинство современных инструментов рассматриваемого типа для C и C++ написаны при помощи них же. Такие приложения называются самокомпилируемыми.

Разновидности

Для компиляции кодов используются приложения самых разных видов. Некоторые из них являются узкоспециализированными. Они запускаются только под процессоры конкретного семейства и оптимизированы под корректную работу с ними. А есть более широкие программы – кросс-компиляторы. Они могут поддерживать несколько различных операционных систем.

Одно приложение рассматриваемого типа может распознавать несколько средств разработки. Наиболее распространенным примером является GCC. Он представляет собой кросс-компилятор для нескольких операционных систем и языков. Данный инструмент является полностью бесплатным и свободным. На нем написаны коды программного обеспечения GNU.

А еще есть компиляторы компиляторов. Они генерируют рассматриваемый тип программ для того или иного инструмента программирования, опираясь на его формальное описание.

Принцип работы

Рассматриваемое программное обеспечение «считывает» пришедшую на вход программу и переводит ее в команды, которые соответствуют машинным кодам. Детализация данного процесса сложнее. Она зависит от реализации. В качестве примера можно привести модульные гибкие проекты компиляции. Они пишутся на высокоуровневых средствах. А есть отладочные приложения компиляции – с поддержкой возможности устранения части синтаксических ошибок и так далее.

Компиляция бывает:

  1. Построчной. В машинную интерпретацию переводится каждая строка.
  2. Пакетной. Исходный код разбирается на блоки или пакеты. Каждый потом компилируется.
  3. Условной. Особенности процесса в этом случае зависят от прописанных в исходном коде условий.

Сначала компилятор разбирает то, что написано в тексте приложения, затем – анализирует команды и генерирует машинные «тексты». Запуск скомпилированного кода им не производится. За это отвечает отдельная операция.

Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus! 

Что такое компилятор

Компилятор – это программа, предназначенная для преобразования исходного кода программы, написанного на одном языке программирования, в эквивалентный ему код на другом языке или в машинный код. Процесс, осуществляемый им, называется компиляцией.

Основная цель компилятора – перевести высокоуровневый исходный код, понятный человеку, в низкоуровневый машинный код, который может быть исполнен процессором компьютера. Компиляция позволяет программистам использовать удобные для них языки программирования, а затем выполнять программу на различных аппаратных платформах, не беспокоясь о деталях архитектуры каждого конкретного процессора.

Процесс компиляции включает в себя несколько этапов, таких как лексический анализ, синтаксический анализ, семантический анализ, генерация промежуточного кода, оптимизация и, наконец, генерация целевого кода. Компиляторы используются для большинства современных языков программирования, таких как C, C++, Java, Python и других.

Для чего нужны

Компиляторы играют ключевую роль в разработке программного обеспечения и обеспечивают эффективность выполнения программ на различных компьютерных архитектурах. Расскажем, для чего они нужны:

  • Преобразуют высокоуровневый исходный код программы, написанный на языке программирования, понятном человеку, в машинный код, который может быть понятен и исполнен процессором компьютера.
  • Позволяют программистам писать программы на высокоуровневых языках программирования без привязки к конкретной аппаратной платформе. Полученный исполняемый код может быть запущен на различных компьютерах с соответствующими архитектурами.
  • Выполняют оптимизацию кода для повышения производительности программы. Оптимизации включают в себя улучшение скорости выполнения, уменьшение объема используемой памяти и другие техники для оптимизации работы программы.
  • Проводят лексический, синтаксический и семантический анализ исходного кода, что позволяет выявлять ошибки на ранних стадиях разработки. Это содействует повышению качества программ и облегчает их отладку.
  • Применяются для множества языков программирования, от С и C++ до Java, Python и других. Это расширяет возможности разработчиков, позволяя им выбирать язык в соответствии с требованиями проекта.
  • Могут выполнять статический анализ кода для выявления потенциальных уязвимостей и обеспечения безопасности программ. Также они могут удостоверять совместимость кода с определенными стандартами и библиотеками.

Компиляторы играют важную роль в процессе разработки программного обеспечения, обеспечивая перевод исходного кода в исполняемый код, который может быть успешно выполнен на целевой платформе.

Принцип работы

Работа компиляторов представляет собой сложный процесс, разделенный на несколько этапов:

  • Лексический анализ. Исходный код разбивается на лексемы или токены (например, ключевые слова, операторы, идентификаторы). Этот этап позволяет компилятору создать структурированный поток токенов для дальнейшего анализа.
  • Синтаксический анализ. Компилятор анализирует структуру исходного кода с использованием синтаксических правил языка программирования. Результатом этого этапа является построение синтаксического дерева, представляющего иерархию структур кода.
  • Семантический анализ. Программа проверяет семантическую корректность программы, включая типы данных, правильность использования переменных и другие аспекты. Генерируются таблицы символов, содержащие информацию о переменных, функциях и других сущностях.
  • Генерация промежуточного кода. Компилятор создает промежуточный код, который является абстрактным представлением программы и не зависит от конкретной аппаратной платформы. Промежуточный код облегчает последующие этапы оптимизации и генерации кода для конечной целевой платформы.
  • Оптимизация. Процесс направлен на улучшение производительности программы, снижение использования памяти и другие оптимизации кода. Компилятор проводит различные оптимизации, такие как удаление недостижимого кода, инлайнинг функций и многие другие.
  • Генерация кода. На последнем этапе компилятор генерирует машинный код или код на другом языке программирования для целевой платформы. Он может быть сохранен в исполняемом файле, который затем может быть выполнен на соответствующем аппаратном обеспечении.
  • Линковка (не всегда). В случае, если программа состоит из нескольких файлов или библиотек, компилятор может выполнять линковку, объединяя разные части программы в один исполняемый файл.
Эти этапы обеспечивают перевод исходного кода программы из высокоуровневой формы, понятной программисту, в исполняемый код, который может быть выполнен на компьютере или устройстве подходящей архитектуры.

Языки

Компиляторы могут быть написаны на различных языках программирования, включая низкоуровневые и высокоуровневые. Выбор конкретного зависит от потребностей проекта, уровня абстракции, требуемой производительности и предпочтений разработчиков. Приведем примеры:

  • C и C++ – эти языки широко используются для написания компиляторов из-за их производительности и близости к аппаратному уровню. Многие известные компиляторы, такие как GCC (GNU Compiler Collection) и Clang, написаны на C или C++.
  • Java – некоторые компиляторы, особенно для языков, работающих в виртуальной машине Java (например, Java Compiler — javac), написаны на Java.
  • Python – для написания компиляторов часто используется Python из-за его высокого уровня абстракции и удобства разработки. Например, компиляторы для некоторых динамических языков, таких как Python или Ruby, могут быть написаны на нем.
  • Haskell – некоторые функциональные компиляторы, такие как GHC (Glasgow Haskell Compiler), написаны на нем.
  • OCaml – например, компилятор языка программирования OCaml (Objective Caml) написан на нем.
  • Rust – этот новый язык программирования также стал популярным выбором для написания компиляторов благодаря своим возможностям безопасности и производительности.
  • Ada – иногда компиляторы написаны на этом языке, так как он предоставляет высокую степень контроля и надежности.
Общий выбор зависит от требований проекта, уровня оптимизации и области применения компилятора.

Почему не всегда в одном языке один компилятор

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

  • Разработчики программных продуктов стремятся поддерживать свои программы на различных операционных системах и аппаратных платформах. Каждая платформа может иметь свои особенности, оптимизации и архитектурные особенности. Для эффективной работы на различных платформах требуются компиляторы, специфичные для каждой из них.
  • Языки программирования могут иметь несколько версий стандартов, и разработчики могут предпочесть использовать компилятор, который лучше всего соответствует конкретной версии стандарта. Например, один компилятор может быстрее внедрять новые возможности языка, в то время как другой может быть более стабильным и следовать предыдущим версиям стандарта.
  • Различные компиляторы могут применять разные уровни оптимизации и подходы к генерации кода. Некоторые могут сосредотачиваться на максимальной производительности, в то время как другие могут уделять больше внимания портируемости или размеру исполняемого файла.
  • Для некоторых специфических задач или платформ могут разрабатываться конкретные компиляторы. Например, компиляторы для встраиваемых систем, графических процессоров (GPU) или высокопроизводительных вычислений могут иметь особые требования.
  • Некоторые языки программирования могут иметь несколько компиляторов, потому что разработчики предпочитают различные инструменты в зависимости от их философии, активности сообщества, уровня документации и поддержки.

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

Виды компиляторов

  • Традиционные.

Это классические компиляторы, которые преобразуют весь исходный код программы в машинный код или код на другом языке программирования.

Цель: создание исполняемого файла, который может быть выполнен на целевой платформе.

Пример: GCC (GNU Compiler Collection) для языков C и C++.

  • Кросс-компиляторы.

Компиляторы, предназначенные для создания исполняемого кода для платформы, отличной от той, на которой происходит компиляция.

Цель: генерация кода для альтернативной архитектуры или операционной системы.

Пример: кросс-компилятор для разработки программ для встраиваемых систем или мобильных устройств.

  • Транспайлеры (компиляторы исходного кода).

Программы, которые преобразуют исходный код из одного языка программирования в код другого.

Цель: облегчение миграции кода, поддержка различных языков программирования.

Пример: Babel – транспайлер JavaScript, преобразующий код, написанный с использованием современных возможностей языка, в совместимый с более старыми браузерами или стандартами.

  • Обратные компиляторы (декомпиляторы).

Эти инструменты выполняют обратный процесс компиляции, преобразуя машинный код или исполняемый код обратно в исходный код.

Цель: помощь в анализе или отладке программ, восстановление исходного кода из исполняемого файла.

Пример: IDA Pro, Hex-Rays Decompiler – инструменты для обратной компиляции и анализа исполняемого кода.

Каждый из этих видов компиляторов служит своим специфическим целям и подходит для различных сценариев использования в разработке программного обеспечения.

Компилятор, интерпретатор и транслятор

Это различные подходы к обработке исходного кода программы. В чем же различия между ними:

  • Компилятор.

Принцип работы: компилятор преобразует весь исходный код программы в машинный код или в код на другом языке программирования.

Этапы выполнения: весь процесс компиляции выполняется до запуска программы. Программа создает исполняемый файл, который может быть выполнен непосредственно на целевой платформе.

Преимущества: исполнение скомпилированного кода обычно более эффективно с точки зрения производительности, так как множество оптимизаций могут быть применены на этапе компиляции.

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

Принцип работы: выполняет исходный код программы построчно или по блокам без предварительной компиляции в машинный код.

Этапы выполнения: программа интерпретируется во время выполнения, без создания отдельного исполняемого файла.

Преимущества: интерпретация обеспечивает более гибкий процесс разработки и отладки, так как изменения в коде могут быть немедленно протестированы без необходимости повторной компиляции.

  • Транслятор.

Принцип работы: транслятор выполняет перевод (преобразование) программы из одного языка программирования в другой без создания машинного кода.

Этапы выполнения: трансляция может быть выполнена в различные промежуточные формы или в код на другом высокоуровневом языке программирования.

Преимущества: трансляция позволяет использовать код на одном языке программирования в контексте другого языка, обеспечивая переносимость и возможность использования различных библиотек и инструментов.

Выбор между компиляцией, интерпретацией и трансляцией зависит от требований проекта, желаемой производительности, уровня абстракции и других факторов. Некоторые языки программирования и среды разработки могут использовать гибридные подходы, сочетая преимущества различных методов.

Плюсы и минусы компилируемых языков

Компилируемые языки программирования имеют свои преимущества и недостатки, которые зависят от контекста использования и требований конкретного проекта.

Преимущества

  • Компилированный код обычно выполняется быстрее, так как весь процесс оптимизации происходит на этапе компиляции, что позволяет генерировать эффективный машинный код.
  • Компиляторы могут обеспечивать статическую проверку типов и другие проверки на этапе компиляции, что уменьшает количество ошибок времени выполнения. Кроме того, разработчики имеют более прямой контроль над выделением и управлением ресурсами.
  • После компиляции исходный код может быть распространен без необходимости предоставления исходного кода, что улучшает безопасность интеллектуальной собственности.
  • Компиляторы могут применять широкий спектр оптимизаций, направленных на улучшение производительности программы.

Недостатки

  • Необходимость компиляции может вызывать задержки перед запуском программы, особенно для крупных проектов.
  • Отладка компилированных программ может быть более сложной, так как необходимо анализировать машинный код. Процесс требует дополнительных инструментов и усилий.
  • Компилированный код может требовать перекомпиляции при переносе на новую архитектуру или платформу.
  • Исполняемый код, созданный компилятором, может занимать больше места в памяти по сравнению с эквивалентным кодом на интерпретируемых языках.
  • Некоторые компилируемые языки более сложны для изучения и использования, особенно для начинающих программистов.

В зависимости от конкретных требований проекта и предпочтений разработчиков выбор между компилируемыми и интерпретируемыми языками может быть обусловлен различными факторами, и иногда проекты используют гибридные подходы для достижения оптимального баланса.

Вывод

Компилятор – это программное средство, предназначенное для преобразования исходного текста программы, написанной на языке высокого уровня, в исполняемый код. Он выполняет перевод текста программы, написанного на понятном для человека языке, в набор инструкций, который может быть исполнен компьютером.

Когда пользователь пишет текст программы, он использует простые и понятные команды, составляя последовательность инструкций для решения конкретной задачи. Этот текст программы является исходным кодом. Чтобы компьютер мог понять и выполнить эти инструкции, необходимо выполнить процесс компиляции.

Компилятор принимает исходный текст программы и делает его более доступным для понимания компьютера. На первом этапе компилятор анализирует текст программы, разбивая его на отдельные строки и выделяя ключевые команды. Затем он переводит эти команды в набор инструкций, понятных центральному процессору компьютера.

Часто компиляторы используют промежуточный формат, такой как байт-код, который представляет собой промежуточное представление между исходным кодом и исполняемым кодом. Это позволяет улучшить переносимость программы между различными платформами, так как байт-код может быть интерпретирован виртуальной машиной на любом устройстве, поддерживающем этот формат.

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

В зависимости от темы курса или задачи, компиляторы могут быть изучены более детально. Они позволяют понять, как числа и строки в исходном тексте программы преобразуются в инструкции, которые компьютер может понять и выполнить. Это делает компиляторы важным объектом изучения для тех, кто интересуется программированием и созданием программного обеспечения.

Подытожим: компилятор – это нечто большее, чем просто переводчик. Он отражает тему взаимодействия между человеком и компьютером, превращая текст программы в последовательность инструкций, понятных центральному процессору. Это, таким образом, делает компилятор неотъемлемой частью любого процесса создания программного обеспечения.

Остались вопросы?

Оставьте заявку и наш менеджер свяжется с Вами в течение 15 минут

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

Что такое компилятор?

Компилятор — это вид специального ПО, которое трансформирует программный код (программный текст) языка программирования в двоичный код, легко выполняемый компьютером. От пользователя компилятор получает исходник, а получившуюся комбинацию нулей и единиц передает компьютеру. Для преобразования программа использует методы анализа и синтаксиса.

Первые компиляторы

Впервые программа, преобразующая команды человека в двоичную форму, была создана в 1951 году американским программистом Грейс Хоппер. Эта программа за миллисекунды трансформировала программный текст высокого уровня, организовывала подпрограммы и распределяла память ЭВМ. Новую программу Хоппер назвала компоновщиком (англ. compiler). Такое название она объяснила тем, что программа подбирает нужную подпрограмму из библиотеки компьютера. Первый компилятор получил название A-0.

Впоследствии языки программирования стали снабжаться специализированными компиляторами. В 1957 было создано средство для языка FORTRAN, а в 1960-х — ПО от создателей COBOL.

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

Читать на ЦО.РФ

Языка брать будем Самые популярные языки программирования в 2022 году

В цифровой «природе» существует несколько тысяч языков программирования, позволяющих решать большое разнообразие насущных задач — от создания мобильных приложений или игр до web-разработок и робототехники. При этом универсальный язык, который позволил бы унифицировать имеющиеся запросы общества, к сожалению, пока не придуман. Разбираем топ наиболее популярных и востребованных языков программирования

Какие задачи выполняет компилятор

Кроме изложения программного кода в понятной для компьютера форме, компилятор выполняет следующие задачи:

1. Оптимизация программного текста, в рамках которой уменьшается объем используемой памяти, увеличивается скорость выполнения.

2. Анализ синтаксиса, лексики, семантики, который позволяет избежать ошибки в проектировании исходного текста.

3. Статический анализ кода для определения потенциальных уязвимостей программы.

4. Создание готовых к запуску исполняемых файлов на основе программного текста.

Как работает компилятор

Преобразование программного кода в машинный проходит в несколько этапов.

Лексический анализ

Программа идентифицирует лексические единицы исходника и группирует их по классам, таких как идентификаторы, константы, ключевые слова и т. д. Лексический анализ выполняется для прочтения компилирующим ПО исходного кода.

Синтаксический анализ (парсинг)

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

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

Проверка согласованности элементов исходника, их смысла и значения.

Генерация промежуточного кода

Создание версии кода, занимающего среднее положение между языком программирования и машинным кодом. Эта версия генерируется так, чтобы ее можно было легко преобразовать в двоичную систему. Также на базе промежуточного кода легче сделать несколько машинных кодов для разных платформ.

Оптимизация

Из промежуточного варианта убираются ненужные части, увеличивающие объем и время чтения.

Генерация машинного кода

Элементы промежуточного кода преобразуются в чисто машинную форму, легко выполняемую компьютером. Программа на этом этапе определяет инструкции и их расписание, отлаживает данные и распределяет переменные по регистрам процессора.

Итог компиляции — исполняемый файл, как правило, с расширением .exe. Для начала его работы оператору достаточно его запустить.

Виды компиляторов

Конкретная компиляция работает лишь на определенном типе устройств, платформе или архитектуре. Поэтому программисты создали несколько типов компилирующих программ для их использования в конкретной ситуации.

Традиционный

Программа, трансформирующая исходник на языке программирования высокого уровня в двоичный код или инструкцию на языке низкого уровня.

Транспилер

Средство, переводящее код с одного языка высокого уровня на другой язык такого же уровня, с сохранением уровня абстракции. Примеры транспилеров — Babel, трансформирующий ECMAScript 2015+ в Javascript; Haxe, переводящий программные тексты на одноименном языке, JSweet, переводящий Java в Typescript.

JavaScript применяют не только в интерактивных веб-страницах, но и в мобильных играх. Прочитайте об этом языке программирования в нашей статье.

Читать на ЦО.РФ

Что такое JavaScript  Что представляет собой и для чего нужен популярный язык программирования

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 году.

Перевод программного кода в машинный начинается с лексического анализа исходника, затем проверяется синтаксис (правила написания и их соблюдение) и семантика (согласованность и смысл элементов). После анализа текста создается и оптимизируется промежуточный код. Финальный этап компиляции — преобразование промежуточного кода в чисто машинный.

Компилирующие программы делятся на традиционные, а также транспилеры, кросс-компиляторы и декомпиляторы. Языком для составления компилирующего ПО обычно служит язык более низкоуровневый, чем трансформируемый программный текст.

Достоинства компиляции — быстрота работы программы, маскировка исходника, лучшая оптимизация и меньший объем программного кода. Компилированные программы рациональнее расходуют ресурсы компьютера при лучшей производительности, лучше адаптируются к разным архитектурам.

К недостаткам компиляции относятся длительность процесса, отсутствие кроссплатформенности. Также при внесении изменений в исходник компиляцию придется делать заново.

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

Читать на ЦО.РФ

Не наигрались еще Как создать компьютерную игру

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

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Перцовый пластырь инструкция по применению при боли в горле
  • Сот никот вывод маток инструкция по применению
  • Должностная инструкция специалиста по ремонту компьютерной техники
  • Гепатромбиновая мазь инструкция по применению для чего она предназначена
  • Холодильник lg ga 449 uvpa инструкция