FAQ — различия между версиями

Материал из Compilers Wiki
Перейти к: навигация, поиск
м (Можно ли использовать С++?: .cpp)
(Как использовать QBE IL?)
 
(не показаны 2 промежуточные версии 1 участника)
Строка 44: Строка 44:
 
-h          prints this help
 
-h          prints this help
 
-o file    output to file
 
-o file    output to file
-t <target> generate for a target among:
+
-t &lt;target> generate for a target among:
 
            amd64_sysv, arm64
 
            amd64_sysv, arm64
 
-G {e,m}    generate gas (e) or osx (m) asm
 
-G {e,m}    generate gas (e) or osx (m) asm
-d <flags>  dump debug information
+
-d &lt;flags>  dump debug information
  
 
Типичное использование утилиты заключается в компиляции файла с промежуточным представлением в файл на языке ассемблера:
 
Типичное использование утилиты заключается в компиляции файла с промежуточным представлением в файл на языке ассемблера:
Строка 54: Строка 54:
 
  $ cc my-loop.s
 
  $ cc my-loop.s
 
Команды компиляции и запуска можно объединить в одну:
 
Команды компиляции и запуска можно объединить в одну:
  $ qbe my-loop.il | cc -xassembler - -o exe && ./exe
+
  $ qbe my-loop.il | cc -xassembler - -o exe &amp;&amp; ./exe
 
----
 
----
 
Источник: [https://compilers.ispras.ru/qbe.html | ispras.ru]
 
Источник: [https://compilers.ispras.ru/qbe.html | ispras.ru]
  
 
== Как пользоваться Си-интерфейсом? ==
 
== Как пользоваться Си-интерфейсом? ==
 +
{{ТребуютсяПравки|FAQ}}
 +
 
Неофициальный Cи-интерфейс [[QBE]] представлен файлом [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD all.h] в корневой директории проекта.  
 
Неофициальный Cи-интерфейс [[QBE]] представлен файлом [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD all.h] в корневой директории проекта.  
  
Строка 82: Строка 84:
 
Для линковки (в т.ч. со стандартной библиотекой языка C++) воспользуйтесь командой:
 
Для линковки (в т.ч. со стандартной библиотекой языка C++) воспользуйтесь командой:
 
  g++ -L/путь/до/qbe/lib -lqbe объектныйФайл.o -o Программа
 
  g++ -L/путь/до/qbe/lib -lqbe объектныйФайл.o -o Программа
Либо используйте драйвер g++ для компиляции и линковки одной командой:
+
Либо используйте драйвер <code>g++</code> (либо <code>clang++</code>, либо <code>c++</code> — некоторые UNIX системы предоставляют исполняемый файл с таким именем в качестве обобщения) для компиляции и линковки одной командой:
 
  g++ -I/путь/до/qbe/include -L/путь/до/qbe/lib исходныйФайл.cpp -lqbe -o Программа
 
  g++ -I/путь/до/qbe/include -L/путь/до/qbe/lib исходныйФайл.cpp -lqbe -o Программа
  
 
(подразумевается, что QBE проинсталлирован в директорию /путь/до/qbe — например, с помощью <code>DESTDIR=/путь/до/qbe make install</code>).
 
(подразумевается, что QBE проинсталлирован в директорию /путь/до/qbe — например, с помощью <code>DESTDIR=/путь/до/qbe make install</code>).

Текущая версия на 06:30, 22 сентября 2024

Что такое QBE IL?[править]

Ответ на данный вопрос Вы сможете найти в статье про QBE. Документация ко внутреннему представлению доступна в оригинале на сайте c9x.me (англоязычная версия) и в данном проекте Wiki (оригинал с параллельным переводом).

Документация на Wiki:

  1. QBE
  2. Типы
    1. Простые типы данных
    2. Подтипирование
  3. Константы
  4. Объявления
    1. Составные типы данных
    2. Data
    3. Функции
  5. Управление
    1. Блоки
    2. Переходы
  6. Инструкции
    1. Арифметические и битовые операции
    2. Память
    3. Сравнения
    4. Преобразования
    5. Инструкции Cast и Copy
    6. Инструкция Call
    7. Вариативность
    8. Инструкция Phi
  7. Список всех инструкций

Как получить QBE IL?[править]

Первое, что Вам необходимо сделать – обзавестись самим QBE. Сделать это можно из git-репозитория ИСП РАН.

$ git clone https://compilers.ispras.ru/git/qbe.git 
$ cd qbe

Сборка полученных файлов осуществляется с помощью GNU_Make командой:

$ make && make install DESTDIR=/path/to/install

Результатом сборки является исполняемый файл qbe (qbe.exe), представляющий интерфейс командной строки к QBE, а также библиотека libqbe.a, предоставляющая программный интерфейс.


Источник: | ispras.ru

Как использовать QBE IL?[править]

QBE предоставляет утилиту для работы с файлами на языке промежуточного представления:

$ qbe -h
qbe [OPTIONS] {file.ssa, -}

-h prints this help -o file output to file -t <target> generate for a target among: amd64_sysv, arm64 -G {e,m} generate gas (e) or osx (m) asm -d <flags> dump debug information

Типичное использование утилиты заключается в компиляции файла с промежуточным представлением в файл на языке ассемблера:

$ qbe my-loop.il -o my-loop.s

Для компиляции ассемблерного файла в объектный или исполняемый файл можно использовать компиляторы GCC и Clang:

$ cc my-loop.s

Команды компиляции и запуска можно объединить в одну:

$ qbe my-loop.il | cc -xassembler - -o exe && ./exe

Источник: | ispras.ru

Как пользоваться Си-интерфейсом?[править]

Требуются правки: см. Обсуждение.

Неофициальный Cи-интерфейс QBE представлен файлом all.h в корневой директории проекта.

Для реализации анализов и трансформаций на уровне промежуточного представления вам понадобятся функции parse и printfn для чтения и записи QBE IL в текстовом формате.

Программа на QBE IL является последовательностью определений функций, данных и типов. Определения функций представлены структурой Fn, содержащий указатель на entry-блок Fn::start.

Базовые блоки представлены структурой Blk, содержащей указатель на следующий блок в некотором порядке обхода Blk::link, указатели на последующие блоки Blk::s1 и Blk::s2, указатели на предшествующие блоки Blk::pred, а также на начало массива инструкций Blk::ins.

Инструкции представлены структурой Ins, содержащий код операции Ins::op (который может использоваться в качестве ключа в массиве optab), и ссылки Ins::to и Ins::arg на результат операции и её операнды.

Рекомендуется использовать функцию freeall для освобождения памяти.


Источник: | ispras.ru

Можно ли использовать С++?[править]

Ответ - можно. Но вместо директивы # include "qbe/all.h" используйте

#define export exports
extern "C" {
    #include "qbe/all.h"
}
#undef export

Для линковки (в т.ч. со стандартной библиотекой языка C++) воспользуйтесь командой:

g++ -L/путь/до/qbe/lib -lqbe объектныйФайл.o -o Программа

Либо используйте драйвер g++ (либо clang++, либо c++ — некоторые UNIX системы предоставляют исполняемый файл с таким именем в качестве обобщения) для компиляции и линковки одной командой:

g++ -I/путь/до/qbe/include -L/путь/до/qbe/lib исходныйФайл.cpp -lqbe -o Программа

(подразумевается, что QBE проинсталлирован в директорию /путь/до/qbe — например, с помощью DESTDIR=/путь/до/qbe make install).