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

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

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

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

Спасибо! :)

1 Ответ

5 голосов
/ 13 мая 2011

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

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. Это ведет хронику построения языка JITted REPL, но основа та же для статически скомпилированного языка. Вместо использования объекта llvm :: JIT вы вызываете Target.addPassesToEmitFile и передаете ему выходной поток для записи. См. Llvm / tools / llc / llc.cpp для полностью проработанного примера (он длинный; требуется лишь небольшая часть этого, если вы не хотите поддерживать все параметры, которые поддерживает llc).

...