Что именно является целью компиляции?

17

Я продолжаю слышать термин, и все поиски в Google приводят меня к статьям о компиляторах. Я просто хочу понять, что означает термин цель компиляции: |

ОБНОВЛЕНИЕ: Чтобы дать некоторый контекст: я слышал, что веб-сборка является целью компиляции для других языков, таких как C, C ++, Rust и т. Д.

ScionOfBytes
источник
Я бы посоветовал вам прочитать статьи о компиляторах.
4
Статьи по компиляторам предполагают, что вы уже знаете это. Это разумный вопрос.
Карл Билефельдт
Я больше думал о статьях в стиле Википедии. И я согласен, что вопрос разумный. Это было просто предложение, а не критика.
4
Вопрос разумный, но плохо написанный. Термин «цель» может иметь разные значения, поэтому я бы рекомендовал дать ссылку или больше контекста, где вы слышали или читали об этом.
Док Браун
@DocBrown Я слышал это во многих контекстах, но совсем недавно в контексте веб-сборки был целью компиляции для других языков.
ScionOfBytes

Ответы:

17

Компиляторы, по сути, являются переводчиками, которые вводят данные на одном языке и выдают результаты на другом. Например, компилятор Eiffel Software принимает ввод на языке Eiffel и создает C. GCC для Intel считывает ввод на языке C и производит сборку x86. Ассемблер GAS для Intel берет сборку x86 и создает объектный код x86. Все эти три вещи являются технически компиляторами.

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

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

Назначение компилятора не обязательно должно быть таким же, как архитектура, в которой он выполняется, и в тех случаях, когда это происходит, программа называется кросс-компилятором . (Например, GCC может быть создан для работы на системах x86 для компиляции C в сборку ARM.)

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

Blrfl
источник
2
В качестве дополнительного примечания, возможно, стоит упомянуть, что этот термин также используется в более обобщенной форме в контексте систем сборки - цель - это результат любого этапа сборки, который не обязательно должен быть действием компиляции (например, создание установщика).
BartoszKP
2
компиляторы - это переводчики, а не фильтры.
1
@Birfl. очевидно. «tr» означает переводить, а не фильтровать. фильтры не переводчики, это просто очевидно.
2
@Birfl: я не хожу по Википедии. просто производя один поток из другого ssys ничего. Различие между фильтрами и переводчиками очень хорошо известно. фильтр включает / исключает, основываясь на предикате. это не трансформируется. отфильтровать список целых чисел по четности? и вы получите не преобразованные даже целые числа. переведите тот же список, используя inc, и вы получите преобразованную версию оригинального списка.
1
ваш счет компиляции в порядке, за исключением термина "фильтр".
4

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

Таким образом, источником для компилятора является язык программирования (C), а целью является байт-код (инструкции машинного уровня). Мы часто используем target при компиляции, потому что разные системы (архитектуры ЦП) имеют разные наборы команд, например, ARM, MIPS и т. Д. Компилятору необходимо знать, какой набор команд является целевым, чтобы он мог создать правильный вывод (байт-код).

Крис Сирефице
источник
0

WebAssemby - это что-то новейшее и лучшее, которое конвертирует код c / c ++ в двоичный формат.

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

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

Проверьте этого зверя, https://godbolt.org/

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

# include<stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • Определите переносимый двоичный формат с эффективным размером и временем загрузки, который будет служить целью компиляции, который может быть скомпилирован для выполнения на собственной скорости, используя преимущества общих аппаратных возможностей, доступных на широком спектре платформ, включая мобильные и IoT.

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

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. GCC преобразует код C / C ++ в код сборки. Инструмент под названием «ассемблер» преобразует ассемблерный код в машинный код, а инструмент под названием «компоновщик» соединяет несколько файлов машинного кода в один исполняемый файл (.EXE под Windows). Большинство этих компиляторов позволяют записывать полученный ассемблерный код в файл, чтобы вы могли посмотреть на ассемблерный код или изменить его.

  2. Ассемблер и компоновщик являются частью цепочки инструментов, что означает, что они обычно поставляются вместе с компилятором.

  3. Однако некоторые компиляторы (например, Microsoft) напрямую конвертируют код C / C ++ в машинный язык, поэтому ассемблер больше не нужен. Многие из этих компиляторов не могут создавать ассемблерный код, поэтому вы не можете записать ассемблерный код в файл.

Кстати, есть даже компиляторы (не для C / C ++, а для других языков программирования), которые напрямую создают файл .EXE, поэтому компоновщик не требуется.

WebAssembly: https://github.com/WebAssembly/design

висячий указатель
источник