Компилятор - это программа, которая переводит исходный код другой программы с языка программирования в исполняемый код.
Исходный код обычно написан на языке программирования высокого уровня (например, Pascal, C, C ++, Java, Perl, C # и т. Д.). Исполняемый код может быть последовательностью машинных инструкций, которые могут выполняться непосредственно процессором, или это может быть промежуточное представление, которое интерпретируется виртуальной машиной (например, байт-код Java).
Короче говоря, компилятор преобразует программу из удобочитаемого формата в машиночитаемый формат.
Относительно того, как работает компилятор, это действительно сложно. На эту тему есть книги и университетские курсы. Я попытаюсь кратко изложить основные этапы процесса, но это будет очень краткий обзор.
- Lexing - разбить текст программы на «жетоны». Токены - это «слова» языка программирования, такие как идентификаторы (ключевые слова, имена переменных, имена функций и т. Д.) Или операторы (=, *, & и т. Д.).
- Парсинг - преобразование последовательности токенов в дерево разбора, которое представляет собой структуру данных, представляющую различные языковые конструкции: объявления типов, объявления переменных, определения функций, циклы, условные выражения, выражения и т. Д.
- Оптимизация - оценивать константные выражения, оптимизировать удаление неиспользуемых переменных или недоступного кода, развернуть циклы, если это возможно, и т. Д.
- Переведите дерево разбора в машинные инструкции (или байт-код JVM).
Я еще раз подчеркиваю, что это очень краткое описание. Современные компиляторы очень умны, а, следовательно, очень сложны.