динамическая компиляция кода

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

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

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

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

Спасибо!


person Mark    schedule 17.09.2009    source источник
comment
Какая О/С? Вы спрашиваете, как написать/спроектировать определяемый пользователем код, как его скомпилировать или как загрузить после компиляции?   -  person ChrisW    schedule 18.09.2009
comment
В настоящее время он совместим только с Windows. Я спрашиваю, как скомпилировать язык сценариев, который я определяю, в машинный код. LLVM, о котором все упоминали ниже, выглядит решением, но я все еще читаю о его использовании.   -  person Mark    schedule 18.09.2009
comment
Вам следует изучить HLSL, который является решением именно этой проблемы для предметной области.   -  person Crashworks    schedule 18.09.2009


Ответы (8)


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

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

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

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

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

person Zan Lynx    schedule 18.09.2009

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

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

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

person SingleNegationElimination    schedule 18.09.2009
comment
эффективность является серьезной проблемой, поскольку для IFS может потребоваться от 1000 до 100 000 итераций на пиксель, поэтому небольшое ускорение каждой итерации оказывает огромное влияние на приложение в целом. Вот почему мне нужно скомпилировать скрипты. В настоящее время я смотрю на LLVM в данный момент. - person Mark; 18.09.2009

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

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

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

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

person Mark Rushakoff    schedule 18.09.2009

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

person Crashworks    schedule 18.09.2009
comment
Я думал об этом, но мне нужна была поддержка переменной точности, а большинство видеокарт поддерживают только 32-битную точность. Что я, вероятно, сделаю, так это то, что если они настроят 32-битную точность, я буду использовать HLSL, но в противном случае я не буду. Но я планирую, чтобы программа поддерживала бесконечную точность. Конечно, я мог бы эмулировать более высокую точность на видеокартах, но я также не могу полагаться на то, что у всех есть видеокарты с хорошей вычислительной мощностью. Я не уверен, что встроенная видеокарта действительно будет иметь большую пропускную способность, чем ее связанный процессор. - person Mark; 18.09.2009
comment
Для того, для чего они предназначены — линейных преобразований огромных массивов чисел с плавающей запятой — графические процессоры определенно быстрее, чем центральные, из-за выделенного оборудования, широких АЛУ и глубоких конвейеров. Но вы правы, от них мало толку, кроме 32-битной точности. - person Crashworks; 19.09.2009

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

person Adam Rosenfield    schedule 18.09.2009

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

person Lee Baldwin    schedule 18.09.2009

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

person Pete Kirkham    schedule 18.09.2009

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

person Tim    schedule 18.09.2009