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

Существует множество различных промежуточных представлений (IR), которые можно использовать для генерации промежуточного кода, например:

  • Абстрактные синтаксические деревья (AST). AST – это древовидное представление исходного кода, которое фиксирует структуру и значение кода. AST обычно используются для представления структуры языков программирования и часто используются в качестве промежуточного представления в компиляторах.
  • Трехадресный код (TAC): TAC — это форма промежуточного представления, состоящая из последовательности операторов, каждый из которых присваивает значение переменной. Операторы TAC обычно имеют три операнда: переменную назначения, левый операнд и правый операнд.
  • График потока управления (CFG): CFG представляет собой графическое представление потока управления программы. Он фиксирует отношения между различными частями программы и может использоваться для более абстрактного представления потока управления программой.
  • Язык передачи регистров (RTL): RTL — это форма промежуточного представления, которая представляет программу как серию передач регистров. Обычно он используется для представления поведения программы на уровне инструкций и часто используется в качестве промежуточного представления при оптимизации компиляторов.

Пример

Реализовать создание промежуточного кода для простых выражений:

Объяснение

Код сначала считывает выражение как строку и вызывает функцию findopr, чтобы найти операторы в выражении. Затем он сохраняет позицию и оператор каждого оператора в структуре с именем exp.

Затем вызывается функция explore для обработки выражения. Он перебирает структуру exp и для каждого оператора вызывает функции fleft и fright, чтобы определить левый и правый операнды для оператора. Затем он генерирует промежуточный код, печатая левый операнд, оператор и правый операнд и сохраняя результат во временной переменной.

Наконец, результат выражения сохраняется в конечной переменной справа. Если в выражении нет операторов, то исходное выражение просто сохраняется справа.

Заключение

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

Первоначально опубликовано на https://dataloops.blogspot.com 16 декабря 2022 г.