Как использовать LLVM в качестве бэкенда на другом языке (не на C ++)? - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь написать язык программирования и застреваю на этапе генерации кода.

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

Камнем преткновения является то, что моя работа не на C ++. Это означает, что я не мог использовать готовые классы LLVM в своем коде.

Могу ли я сгенерировать IR-код LLVM в виде строки символов, сохранить его в файл (или не нужно?), А затем скомпилировать? На случай, если я смогу, могу ли я создать какую-либо другую форму, чтобы помочь LLVM работать быстрее?

Особая благодарность за любой совет.

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Копирование документации LLVM

Внешний интерфейс вашего компилятора будет взаимодействовать с LLVM, создавая модуль в формате промежуточного представления LLVM (IR). Предполагая, что вы хотите написать компилятор своего языка на [чем-то другом, кроме C ++], есть 3 основных способа решить проблему генерации LLVM IR из внешнего интерфейса:

  1. Вызов кода библиотеки LLVM используя FFI вашего языка (интерфейс внешней функции).

    • for: лучше всего отслеживает изменения в LLVM IR, синтаксис .ll и .b c формат
    • for: включает запуск Оптимизация LLVM проходит без накладных расходов на генерирование / синтаксический анализ
    • для: хорошо адаптируется к контексту JIT
    • против: много уродливого связующего кода для записи
  2. Выпустить сборку LLVM с родного языка вашего компилятора.

    • для: очень просто начать работу
    • против: анализатор .ll медленнее, чем считыватель битового кода при взаимодействии с средний конец
    • против: может быть сложнее отслеживать изменения в IR
  3. Выдавать битовый код LLVM с родного языка вашего компилятора.

    • для: можно использовать более эффективный Считыватель битового кода ent при подключении к среднему концу
    • против: вам придется перепроектировать объектную модель LLVM IR и модуль записи битового кода на вашем языке
    • против: может быть труднее отслеживать изменения в IR

Опция, которую вы упомянули, - номер 2.

1 голос
/ 03 августа 2020

Могу ли я сгенерировать код LLVM IR в виде строки символов, сохранить его в файл (или не нужно?), А затем скомпилировать?

Этот подход используется некоторыми проекты (например, GH C), но это не рекомендуется. Вместо этого вы можете использовать привязки LLVM C. Взаимодействие с C - обычная функция для многих языков, поэтому это не должно быть проблемой.

...