Подтвердить что ты не робот

Как я могу увидеть дерево разбора, промежуточный код, код оптимизации и код сборки во время COMPILATION?

Я изучаю курс компиляторов, компиляция программы выполняется ниже шагов

  • Лексический анализ
  • Анализ синтаксиса
  • Семантический анализ
  • Генерация промежуточного кода
  • Оптимизация кода
  • Создание целевого кода.

Как я могу видеть вывод каждого шага, например, я хочу увидеть дерево синтаксиса после синтаксического анализа.

Я компилирую программу на машине Linux с компилятором GCC.

Мы можем видеть ассемблерный код программы с помощью опции -Wa-компилятора в gcc, аналогично есть опции для просмотра токенов, дерева синтаксического разбора и кода Inetmediate.

4b9b3361

Ответ 1

Хотя вы можете использовать -fdump-tree-all и -fdump-rtl-all в gcc, я не думаю, что их вывод очень полезен для ученика-компилятора. FWIW, я начал работать над gcc как часть моих исследований PhD, уже закончил два курса бакалавриата, и я обнаружил, что gcc и его файлы отладки непрозрачны и трудно следовать.

Кроме того, gcc действительно не соответствует учебному составу компиляторов. На самом деле никто не делает, потому что это плохо работает. Я уверен, что gcc не создает дерево синтаксиса или абстрактно-синтаксическое дерево. Он создает IR (называемый gimple), на котором выполняется оптимизация на высоком уровне.

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

Еще одно предложение, если я могу порекомендовать свою собственную на мгновение, - это использовать phc. С помощью phc вы можете увидеть дерево разбора в виде изображения и просмотреть AST и исходный код после каждого прохода в компиляторе. Вот сравнение частей АСТ и дерева разбора. Они генерируются тривиально с помощью phc. Вы можете видеть компилятор IRs, CFG, форму SSA и отлаживать вывод вывода типа и анализа псевдонимов. Вы также можете включать и отключать оптимизацию и передавать, чтобы увидеть эффект, который у них есть.

Я думаю, это может быть полезно для вас.

Ответ 2

Вы можете увидеть выход препроцессора с помощью -E. -fdump-tree-* выгружает внутреннее представление дерева, например. -fdump-tree-all. Существуют различные опции -d для удаления промежуточных представлений RTL, например. -fdump-rtl-all (см. руководство по невидимым проходам, которое вы получаете отвалы); кроме того, -dD сбрасывает все макроопределения.