Вопрос

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

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

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

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

Спасибо!

Это было полезно?

Решение

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

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

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

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

Подобный подход означает, что вы тратите меньше времени на написание компиляторов кода и больше времени на фактическую работу.

Другие советы

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

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

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

Если вы можете писать свои динамические расширения на C (а не на C++), вы можете найти Крошечный компилятор 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.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top