Вопросы для компиляции в LLVM - PullRequest
10 голосов
/ 09 апреля 2009

Я играл с LLVM в надежде узнать, как его использовать.

Однако, мой разум поражен уровнем сложности интерфейса.

Взять, к примеру, их функцию Фибоначчи

int fib(int x) {
    if(x<=2) 
        return 1;
    return fib(x-1) + fib(x-2);
   }

Чтобы получить это для вывода LLVM IR, требуется 61 строка кода !!!

Они также включают BrainFuck, который известен тем, что имеет самый маленький компилятор (200 байтов). К сожалению, с LLVM он превышает 600 строк (18 КБ).

Это норма для бэкэндов компилятора? До сих пор кажется, что было бы гораздо проще сделать сборку или бэкэнд C.

Ответы [ 4 ]

17 голосов
/ 12 мая 2009

Проблема в C ++, а не в LLVM.

Используйте язык, разработанный для метапрограммирования, такой как OCaml , и ваш компилятор будет значительно меньше. Например, эта статья в журнале OCaml описывает 87-строчный компилятор Brainfuck на основе LLVM , в этом сообщении рассылки описывается полная реализация языка программирования, включая синтаксический анализатор , который может компилировать функцию Фибоначчи (среди прочего программ), и весь компилятор содержит менее 100 строк кода OCaml с использованием LLVM, а HLVM - это высокоуровневая виртуальная машина с многоядерной сборкой мусора в менее чем 2000 строк кода OCaml с использованием LLVM .

1 голос
/ 09 октября 2009

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

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

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

Есть и другие проблемы. Промежуточное представление на самом деле не предназначено для написания людьми, но оно должно быть читаемым. Кроме того, он должен быть достаточно общим, чтобы выдержать несколько версий без полной несовместимой редизайн с нуля.

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

1 голос
/ 09 апреля 2009

LLVM требует некоторого стандартного кода, но как только вы его поймете, это действительно довольно просто. Попробуйте найти простой интерфейс GCC, и вы поймете, насколько чист LLVM. Я определенно рекомендую LLVM поверх C или ASM. ASM вообще не переносим, ​​и генерация исходного кода обычно плохая вещь, потому что это замедляет компиляцию.

1 голос
/ 09 апреля 2009

Разве LLVM не оптимизирует IR в зависимости от конкретной архитектуры, реализованной в серверной части? ИК-код напрямую не переводится 1: 1 в окончательный двоичный файл. Насколько я понимаю, вот как это работает. Тем не менее, я только начал играть с бэкэндом (я портирую его на пользовательский процессор).

...