Я занимаюсь внедрением кросс-платформенного приложения (Mac OS X, Windows и Linux), которое будет проводить много анализа интенсивных аналитических данных. Основная часть механизма анализа будет написана на С++ по соображениям скорости, при этом пользовательский механизм сценариев взаимодействует с механизмом тестирования С++. Я хочу написать несколько интерфейсов для скриптов, чтобы подражать другому популярному программному обеспечению с существующими большими пользовательскими базами. Первым фронтом будет язык сценариев, похожий на VisualBasic.
Я думаю, что LLVM будет идеально подходит для моих нужд. Производительность очень важна из-за огромного объема данных; для получения ответа может потребоваться несколько часов или дней для запуска одного теста. Я полагаю, что использование LLVM также позволит мне использовать единое внутреннее решение, в то время как я реализую разные интерфейсы для разных вкусов языка сценариев с течением времени.
Сам механизм тестирования будет отделен от интерфейса, и тестирование будет происходить даже в отдельном процессе с прогрессом и результатами, сообщаемыми интерфейсу управления тестированием. Тесты будут состоять из кода сценария, интегрированного с кодом кода тестирования.
В предыдущей реализации аналогичной коммерческой системы тестирования, которую я написал, я построил быстрый интерпретатор, который легко взаимодействовал с библиотекой тестирования, потому что он был написан на С++ и напрямую связан с библиотекой движков тестирования. Обратные вызовы от кода сценария к тестированию объектов библиотеки включали перевод между форматами со значительными накладными расходами.
Мне кажется, что с LLVM я мог бы реализовать обратные вызовы в С++ напрямую, чтобы я мог заставить скриптовый код работать почти так, как если бы он был написан на С++. Аналогично, если весь код был скомпилирован в формат байт-кода LLVM, кажется, оптимизаторы LLVM могут оптимизировать границы между языком сценариев и кодом ядра тестирования, написанным на С++.
Я не хочу, чтобы каждый раз составлял модуль тестирования. В идеале я хотел бы JIT компилировать только код сценария. Для небольших тестов я пропустил некоторые проходы оптимизации, а для больших тестов я бы выполнил полную оптимизацию во время ссылки.
Так возможно ли это? Могу ли я предварительно скомпоновать механизм тестирования файлу объекта .o или .a, а затем связать код сценария с помощью JIT?
Наконец, в идеале, я хотел бы, чтобы код сценария реализовал определенные методы в качестве подклассов для определенного класса С++. Таким образом, механизм тестирования С++ будет видеть только объекты С++, в то время как код установки JIT скомпилировал скриптовый код, который реализовал некоторые из методов для объектов. Похоже, что если бы я использовал алгоритм правильного определения имени, было бы относительно легко настроить генерацию LLVM для языка сценариев, чтобы он выглядел как вызов метода С++, который затем можно было бы связать с механизмом тестирования.
Таким образом, этап компоновки будет проходить в двух направлениях: вызовы с языка сценариев в объекты объекта тестирования для извлечения информации о ценах и информации состояния теста и вызовов из механизма тестирования методов некоторых конкретных объектов С++, где код был предоставлен не из С++, но с языка сценариев.
Вкратце:
1) Могу ли я связать файлы precompiled (.bc,.o или .a) как часть компиляции JIT, процесс генерации кода?
2) Могу ли я связать код, используя процесс в 1) выше, таким образом, что я могу создать код, который действует так, как если бы все было написано на С++?