Как работает компилятор? [закрыто]

17

Примечание: я удивлен, что об этом раньше не спрашивали, и если это так, я не смог найти его в поиске.

Я был на тоннах веб-сайтов, я прочитал тонны статей и услышал тонны объяснений. Большинство из них были хорошими, но все они были либо широкими, либо слишком сложными, либо просто плохими. Итак, мой вопрос, как работает компилятор?

Если это сложный, широкий вопрос, пожалуйста, скажите мне. Но если нет, пожалуйста, ответьте на вопрос.

динамический
источник
4
Слишком широк, по крайней мере, часть «Как это работает». Есть целые книги, написанные на эту тему.
Одед
1
en.wikipedia.org/wiki/Compiler - это ссылка на Википедию, которую легко найти, что конкретно вам интересно? Вопрос достаточно широкий, и я хотел бы дать умный ответ: «Компиляторы переводят код с одного языка на другой», так как это общая идея, в которой много нюансов, когда начинаешь смотреть что это действительно включает.
JB King
1
Да, и я думаю, что на это ответили довольно хорошо.
Джереми
1
Любое объяснение того, как работает компилятор, будет либо слишком широким, либо слишком сложным. Это сложный предмет, и уроки компиляторов были самыми сложными компьютерными курсами, которые я когда-либо посещал.
Дэвид Торнли
1
@ Дэвид Конечно, компиляторы сложны, и вы не можете объяснить все детали того, как они работают здесь. Тем не менее, я уверен, что у вас было общее представление о том, что такое компилятор или как он работает, до того, как вы прошли курс обучения компилятору.
Дима

Ответы:

24

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

Исходный код обычно написан на языке программирования высокого уровня (например, Pascal, C, C ++, Java, Perl, C # и т. Д.). Исполняемый код может быть последовательностью машинных инструкций, которые могут выполняться непосредственно процессором, или это может быть промежуточное представление, которое интерпретируется виртуальной машиной (например, байт-код Java).

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

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

  1. Lexing - разбить текст программы на «жетоны». Токены - это «слова» языка программирования, такие как идентификаторы (ключевые слова, имена переменных, имена функций и т. Д.) Или операторы (=, *, & и т. Д.).
  2. Парсинг - преобразование последовательности токенов в дерево разбора, которое представляет собой структуру данных, представляющую различные языковые конструкции: объявления типов, объявления переменных, определения функций, циклы, условные выражения, выражения и т. Д.
  3. Оптимизация - оценивать константные выражения, оптимизировать удаление неиспользуемых переменных или недоступного кода, развернуть циклы, если это возможно, и т. Д.
  4. Переведите дерево разбора в машинные инструкции (или байт-код JVM).

Я еще раз подчеркиваю, что это очень краткое описание. Современные компиляторы очень умны, а, следовательно, очень сложны.

Дима
источник
2
На самом деле, это превращает язык в другой. Ранний компилятор C ++ делал компиляцию в C. То же самое относится и к компилятору Vala. Компилятор Java компилируется в байт-код, который не может быть выполнен без JIT-компилятора JVM.
Deadalnix
1
@deadalnix ИМХО, дело в том, что вы переходите от неисполняемого кода к исполняемому коду. Я бы сказал, что C-front - это не компилятор, а front-end для C-компилятора. Или этап компиляции, если хотите. Виртуальные машины, конечно, стирают границу между «исполняемыми» и «неисполняемыми». Здесь я бы просто считал исполняемый код тем, что входит в виртуальную машину, например, байтовый код, и абстрагировал бы все, что происходит внутри виртуальной машины, например, JIT.
Дима
1
@ Дима, это не должно быть от неисполняемого кода к исполняемому коду. Например, вы не можете выполнить байт-код JVM непосредственно на машинах Windows.
1
@ Thorbjørn Ravn Andersen: но байт-код исполняется JVM. Разве не смысл "виртуальной машины" выглядеть программистом как настоящая машина?
Дима
2
Я бы сказал, что традиционно компилятор преобразовывал программу из читаемого человеком формата в машиночитаемый, как сказал Дима. Вариации, такие как преобразование Cfront C ++ в C или javac преобразование Java в байт-код, являются более сложными темами, которые, вероятно, следует оставить до тех пор, пока они не объяснят основную, традиционную концепцию кому-то незнакомому с ней.
Carson63000
5

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

Компиляторы связывают исходные программы на языках высокого уровня с базовым оборудованием. Компилятор требует:

  1. Определение правильности синтаксиса программ
  2. Генерация правильного и эффективного объектного кода
  3. Организация во время выполнения
  4. Форматирование вывода в соответствии с соглашениями ассемблера и / или компоновщика.
Марио Стилиану
источник