Описание тега compilation

Компиляция - это преобразование исходного текста в какую-либо другую форму или представление. Чаще всего этот тег используется для вопросов, касающихся преобразования языка программирования в машинный код. Этот тег обычно используется с другим тегом, указывающим тип исходного текста, например тегом языка программирования (C, C++, Go и т. Д.), И тегом, указывающим инструмент или компилятор, используемый для преобразования (gcc, Visual Studio, так далее.).

Компиляция - это преобразование исходного текста в какую-либо другую форму или представление. Используемый программный инструмент называется компилятором. Большинство компиляторов обрабатывают исходный текст, чтобы сгенерировать своего рода машинный код для целевой аппаратной машины. Некоторые компиляторы генерируют "машинный код" для целевой виртуальной машины (например, байт-код для виртуальной машины Java).

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

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

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

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

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

Компиляция обычно включает следующие шаги:

  • Сканирование - сканер отвечает за разметку исходного кода на мельчайшие порции информации (ключевые слова, операторы, скобки, переменные, литералы и т. Д.).
  • Разбор - синтаксический анализатор отвечает за создание абстрактного синтаксического дерева (AST), которое представляет собой древовидное представление кода в соответствии с определением исходного языка.
  • Оптимизация - AST, представляющий код, отправляется через различные оптимизаторы для оптимизации по скорости или пространству (эта часть не является обязательной).
  • Генерация кода. Генератор кода создает линейный переведенный документ из AST и определения языка вывода.

Во многих языках и компиляторах к процессу добавляются дополнительные шаги (например, предварительная обработка), но они зависят от языка и компилятора.

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

Вопросы, использующие этот тег, должны касаться процесса компиляции, а не того, как, например, писать компиляторы (используйте для этого тег компилятора).