Каков размер программы, использующей LLVM/CLANG для пользовательской виртуальной машины с байт-кодом?

Я оцениваю различные возможности для пользовательской виртуальной машины и не включил LLVM в другой вопрос. Поскольку я все еще работаю над оценкой виртуальных машин со встроенным языком, я пока не могу проверить/проверить это самостоятельно. Я хотел бы узнать следующую информацию о LLVM/CLANG:

  • Хорошо ли он поддерживается в Windows? Или Солярис? (кроссплатформенность для меня плюс)
  • Если я хочу написать свою собственную/пользовательскую виртуальную машину на C-подобном языке, что мне нужно будет включить в проект? (разделы или компоненты LLVM/CLANG и т. д.)
  • Я бы по понятным причинам держал компилятор отдельно от виртуальной машины (а не писал интерпретатор). Каковы будут размеры необходимых компонентов? Могу ли я встроить их «в» программу вместо динамической ссылки на них?
  • Могу ли я избежать JIT? Я хотел бы иметь виртуальную машину с байт-кодом, которая не обязательно преобразуется в собственный код. Это поможет, когда JIT не поддерживается на платформе (например, системы с ограничительными разрешениями памяти, которые не позволяют отображать память wx/rwx).

Я знаю, что антивирус clamav, например, использует байт-код, поддерживаемый LLVM/clang, для поддержки динамических подписей/подписей времени выполнения. Однако я не знаю, существует ли средство для реализации этого и/или учебные пособия или документация, которые проведут вас через процесс реализации такой вещи.

Спасибо! :)


person soze    schedule 12.03.2011    source источник


Ответы (1)


Clang — это парсер для C-подобных языков, включая C++. Если ваш язык достаточно C-подобный (т. е. Java нет), то вы можете добавить поддержку вашего языка в clang, который знает, как создавать LLVM IR.

LLVM не требует JIT и обычно компонуется статически. LLVM предоставляет библиотеки, которые выполняют оптимизацию и генерацию кода LLVM IR. JIT — это просто генерировать код в память, а не на диск. Обычно Clang+LLVM используется в качестве замены GCC, генерируя код в файлы .o.

Насколько большим он будет, зависит от того, что вам нужно. Хотите все оптимизации? Вам нужны все цели (в отличие от GCC, LLVM может быть собран с таким количеством бэкендов в одном двоичном файле, как вы хотите). Поскольку вы упомянули встроенные, одним из примеров является Android, использующий LLVM на мобильных телефонах: http://android-developers.blogspot.com/2011/02/introduction-renderscript.html

Windows поддерживается довольно хорошо, вы можете собрать LLVM с помощью MSVC++, используя нашу систему сборки CMake или mingw32. Поддержка Solaris более сомнительна, мы периодически получали исправления, чтобы исправить это, но я не видел их какое-то время.

Наконец, вы можете прочитать руководство по адресу http://llvm.org/docs/tutorial . Это хроника построения JIT-языка REPL, но основа та же самая для статически скомпилированного языка. Вместо использования объекта llvm::JIT вы вызываете Target.addPassesToEmitFile и передаете ему выходной поток для записи. См. llvm/tools/llc/llc.cpp для полного рабочего примера (он длинный; нужна лишь небольшая его часть, если вы не хотите поддерживать все параметры, которые делает llc).

person Nick Lewycky    schedule 13.05.2011
comment
Спасибо, я не ответил на этот вопрос раньше, чем сегодня ...! - person soze; 23.09.2011