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