Вопрос

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

Первоначальное использование будет заключаться в генерации небольших заглушек кода во время выполнения, аналогично тому, как Delphi отправляет SOAP-запросы.Если я не смогу найти что-то, я, скорее всего, сделаю свое собственное, но мне бы не хотелось изобретать велосипед.Что-то в "C" может меня заинтересовать, при условии, что лицензия разрешит перевод и использование в коммерческих проектах с открытым исходным кодом.

Обновить:

Вот еще немного контекста:То, над чем я работаю, - это реализация интерфейсов и / или классов во время выполнения как части платформы сохранения.Что-то вроде персистентности, управляемой аннотациями Java (JPA / EJB3), за исключением явно выраженного привкуса Delphi.Цель вызова - это модульная / расширяемая платформа, которая будет реализовывать обобщенную модель сохранения.Мне нужно отправлять и перехватывать вызовы методов на основе RTTI и модели аннотаций / атрибутов (что-то похожее на метаданные InstantObjects) очень динамичным и плавным способом.

Спасибо, Дэвид

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

Решение

В соответствии с особенностями Пакскомпилятор, вы можете создавать автономные исполняемые файлы.

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

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

Если вы знаете сигнатуру рассматриваемого метода, вы можете легко это сделать, используя TMethod и установив адрес метода и данные.

procedure TForm8.Button1Click(Sender: TObject);
begin
  Showmessage('Hello1');
end;

procedure TForm8.Button2Click(Sender: TObject);
var
 M : TMethod;
begin
  M.Code := MethodAddress('Button1Click');
  M.Data := Self;
  TNotifyEvent(M)(self);
end;

Если вы не знаете сигнатуру метода, вы можете написать класс с помощью {$METHODINFO ON} Затем используйте функциональность ObjAuto.pas для вызова метода.

У меня есть пример в моем Код презентации RTTI из DelphiLive о том, как это сделать.

Очень умозрительный ответ:Что -то вроде LLVM?Я не уверен, можно ли его использовать из delphi или нет, но вы должны иметь возможность создавать библиотеки dll с ним.

По логике вещей, вы бы просто сгенерировали код delphi, скомпилировали в DLL / BTL с помощью компилятора cmdline, а затем dyn загрузили бы его?

К сожалению, Delphi Explorer не поставляется с компилятором cmdline.И ваш основной двоичный файл также должен быть в Delphi Explorer (или, по крайней мере, в D2006, если он достаточно совместим с двоичным файлом)

Любое сочетание версий Delphi (или Free Pascal), вероятно, не будет работать на уровне пакета или HLL, только на базовом процедурном уровне DLL.

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

Дасмджит порт на Delphi для проект asmjit

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