QBE
QBE IL (QBE intermediate language) - промежуточный язык, является языком более высокого уровня, чем язык ассемблера. Он сглаживает большинство проблем базового оборудования и позволяет использовать бесконечное количество временных конструкций. Этот более высокий уровень абстракции позволяет сторонним программистам сосредоточиться на проблемах разработки языка.
The intermediate language (IL) is a higher-level language than the machine's assembly language. It smoothes most of the irregularities of the underlying hardware and allows an infinite number of temporaries to be used. This higher abstraction level allows frontend programmers to focus on language design issues.<pre> =Входные файлы Промежуточный язык предоставляется QBE в виде текста. Как правило, один файл создается для каждой программы с входного языка интерфейса. IL-файл представляет собой последовательность определений для данных, функций и типов. После обработки QBE полученный файл может быть собран и связан с использованием стандартного инструментального ПО (например, [https://ru.wikipedia.org/wiki/GNU_Binutils GNU binutils]). <pre>The intermediate language is provided to QBE as text. Usually, one file is generated per each compilation unit from the frontend input language. An IL file is a sequence of Definitions for data, functions, and types. Once processed by QBE, the resulting file can be assembled and linked using a standard toolchain (e.g., GNU binutils).
Ниже приведено полное содержимое IL-файла "Hello World", в котором определена функция, выводящая на экран "hello world". Поскольку строка не является объектом штатным объектом (только указатель) языка, она определяется вне тела функции. Комментарии начинаются с символа # и заканчиваются концом строки.
Here is a complete "Hello World" IL file which defines a function that prints to the screen. Since the string is not a first class object (only the pointer is) it is defined outside the function's body. Comments start with a # character and finish with the end of the line.
# Объявление константной строки "hello world" data $str = { b "hello world", b 0 }
function w $main() { @start # Вызов функции puts с аргументом $str. %r =w call $puts(l $str) ret 0 }
Если вы прочитали ссылку про язык LLVM, вы можете понять вышеприведенный код. В сравнении, QBE предоставляет гораздо более простое использование типов и синтаксиса.
If you have read the LLVM language reference, you might recognize the example above. In comparison, QBE makes a much lighter use of types and the syntax is terser.
=Запись БНФ
Синтаксис языка, который Вы сможете найти в разделах данной Wiki (и в оригинальной документации), описан с использованием БНФ. Различные используемые конструкции БНФ перечислены ниже.
Ключевые слова заключены в кавычки; ... | ... выражает дизъюнкции; [ ... ] обозначает некоторый синтаксис как необязательный; ( ... ), обозначает разделенный запятыми список прилагаемого синтаксиса; ...* и ...+ используются для произвольных обозначений и для повторений соответственно.
Символы
Промежуточный язык изобилует разными символами, все пользовательские имена выделяются символьным префиксом. Это делается для предотвращения конфликтов ключевых слов, а также для быстрого определения области видимости и характера идентификаторов.
The intermediate language makes heavy use of sigils, all user-defined names are prefixed with a sigil. This is to avoid keyword conflicts, and also to quickly spot the scope and nature of identifiers.
:
используется для определенных пользователем составных типов данных
$
используется для глобальных переменных (представленных в виде указателя)
%
используется для переменных внутри функций
@
используется для обозначения меток блоков
В этом синтаксисе БНФ мы используем ?IDENT
для обозначения идентификатора, начинающегося с символа ?
.
Источник: c9x.me