динамическая компиляция кода - PullRequest
4 голосов
/ 18 сентября 2009

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

В настоящее время я не знаю, как это сделать, и хотел бы получить советы о том, что читать, чтобы узнать, как это сделать.

Основная программа написана на C ++, и я знаком с C ++. На самом деле, учитывая большинство сценариев, я знаю, как преобразовать его в ассемблерный код, который бы достиг цели, но я не знаю, как сделать дополнительный шаг для преобразования его в машинный код. Если возможно, я бы хотел динамически скомпилировать код, как я полагаю, многие эмуляторы игровой системы работают.

Если неясно, что я спрашиваю, скажите мне, чтобы я мог уточнить.

Спасибо!

Ответы [ 8 ]

4 голосов
/ 18 сентября 2009

Должна ли подпрограмма динамически компилироваться на каком-либо конкретном языке. Если ответ на этот вопрос «Да, это должен быть C ++», вам, вероятно, не повезло. C ++ является наихудшим вариантом для онлайн-перекомпиляции.

Является ли динамическая часть вашего приложения (фрактальная итераторная процедура) главным узким местом ЦП? Если вы можете позволить себе использовать язык, который не компилируется, вы, вероятно, избавите себя от множества неприятностей. Lua и JavaScript являются сильно оптимизированными интерпретируемыми языками, которые работают в несколько раз медленнее, чем собственный скомпилированный код.

Если вам действительно нужно, чтобы динамическая функциональность компилировалась в машинный код, вероятно, лучше всего использовать clang / llvm. clang - это интерфейс C / Objective-C, разработанный Apple (и некоторые другие), чтобы динамическая перекомпиляция работала хорошо. llvm - это бэкэнд, используемый Clang для перевода из переносимого байт-кода в машинный код. Имейте в виду, что в настоящее время Clang не поддерживает большую часть C ++, поскольку это такой сложный язык, чтобы понять его правильно.

3 голосов
/ 18 сентября 2009

Поскольку вы генерируете пиксели для отображения на экране, рассматривали ли вы возможность использования HLSL с динамической компиляцией шейдеров? Это даст вам доступ к оборудованию SIMD, предназначенному именно для такого рода вещей, а также к динамическому компилятору, встроенному прямо в DirectX.

3 голосов
/ 18 сентября 2009

Если вы можете написать свои динамические расширения на C (не на C ++), вам может пригодиться Tiny C Compiler . Он доступен под LGPL, он совместим с Windows и Linux, и это небольшой исполняемый файл (или библиотека) размером ~ 100 КБ для препроцессора, компилятора, компоновщика и ассемблера, и все это очень быстро. Недостатком этого, конечно, является то, что он не может сравниться с оптимизацией, которую вы можете получить с помощью GCC. Другим потенциальным недостатком является то, что это X86 только AFAIK.

Если вы сделали решили написать сборку, TCC может обработать это - в документации говорится, что он поддерживает синтаксис, похожий на газ, и поддерживает коды операций X86.

TCC также полностью поддерживает ANSI C и почти полностью совместим с C99.

При этом вы можете включить TCC в качестве исполняемого файла в ваше приложение или использовать libtcc (документации по libtcc в Интернете не так много, но она доступна в пакете с исходным кодом). В любом случае, вы можете использовать tcc для генерации динамических или общих библиотек или исполняемых файлов. Если бы вы пошли по динамическому библиотечному маршруту, вы бы просто поместили в него функцию Render (или любую другую), dlopen или LoadLibrary и вызвали Render, чтобы наконец запустить рендеринг, разработанный пользователем. В качестве альтернативы, вы можете сделать автономный исполняемый файл и popen его, и сделать все ваше общение через автономные stdin и stdout.

3 голосов
/ 18 сентября 2009

Некоторые эмуляторы процессора обрабатывают машинный код как байт-код и выполняют JIT-компиляцию, почти как если бы это была Java. Это очень эффективно, но это означает, что разработчики должны написать версию компилятора для каждого процессора, на котором работает их эмулятор, и для каждого эмулируемого процессора.

Это обычно означает, что он работает только на x86 и раздражает любого, кто хотел бы использовать что-то другое.

Они также могут перевести его в LLVM или байт-код Java или .Net CIL и затем скомпилировать его, что также будет работать.

В твоем случае я не уверен, что это лучший способ. Я думаю, что я бы сделал это с помощью динамических библиотек. Создайте каталог, который должен содержать «плагины», и позволить пользователю компилировать свои собственные. Заставьте вашу программу сканировать каталог и загрузить каждую DLL или .so, которую он находит.

Выполнение этого означает, что вы тратите меньше времени на написание компиляторов кода и больше времени на выполнение работы.

2 голосов
/ 18 сентября 2009

LLVM должен иметь возможность делать то, что вы хотите. Он позволяет вам сформировать описание программы, которую вы хотите скомпилировать, объектно-ориентированным способом, а затем он может скомпилировать это описание программы в машинный код во время выполнения.

1 голос
/ 18 сентября 2009

Nanojit является довольно хорошим примером того, что вы хотите. Он генерирует машинный код из промежуточного языка. Это C ++, и он маленький и кроссплатформенный. Я не использовал его очень широко, но мне нравилось играть только для демонстраций.

0 голосов
/ 18 сентября 2009

Есть ли причина, по которой вы не можете использовать решения на базе графических процессоров? Это, кажется, кричит для одного.

0 голосов
/ 18 сентября 2009

Разбейте код на файл и скомпилируйте его как динамически загружаемую библиотеку, затем загрузите и вызовите ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...