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






