Компилятор - задний конец - программирование
Подтвердить что ты не робот

Компилятор - задний конец

Я понимаю структуру компилятора в отношении интерфейсного и back-end. Тем не менее, я не уверен, почему компиляторы часто делятся на front-end и back-end. Я уверен, что есть много причин, которые вы можете мне дать? потому что большинство книг/веб-сайтов говорят вам, что они, но не могут сказать вам, почему!

Спасибо.

4b9b3361

Ответ 1

Интерфейс касается самого языка: сканирования, разбора, дерева синтаксического анализа. Задняя часть имеет дело с целевой системой: форматы объектных кодов, сам машинный код... У двух вещей не так много общего, как для друг друга, и для переносного компилятора очень желательно использовать те же самые front-end с несколькими бэкендами, по одному на цель.

Это можно сделать так, как это делает gcc, и иметь интерфейс front/backend, который не зависит от языка, поэтому вы можете использовать разные языковые интерфейсы с одним и тем же бэкэнд. В прежние времена это называлось проблемой MxN: вы не хотите писать компиляторы MxN, где у вас есть M-языки и N целевых систем. Идея состоит в том, чтобы писать только компиляторы M + N.

Ответ 2

Если вы говорите о том, что fron-end является парсером, который токенизирует исходный код, а back-end - это бит, который генерирует исполняемый код на основе токенированного кода, то одна очень веская причина заключается в следующем: переносимость.

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

Ответ 3

Потому что вы хотите использовать какой-то внутренний псевдо-код или таблицы/структуры данных. Например, если у вас есть строка кода:

a = b + c;

Вы хотели бы взять это и разбить его на

load b
load c
add b + c
store a

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

Я не знаю достаточно об этом, но я думаю, что у вас также есть общие используемые парсеры bison/flex, сварить вас в какой-то промежуточный код/​​набор команд, а затем вы напишите для этого бэкэнд.

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

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