фреймворк генератора кода x86 для Delphi

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

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

Обновлять:

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

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


person David Taylor    schedule 29.05.2009    source источник
comment
Delphi не использует генерацию кода для отправки запросов SOAP. Это делается с помощью информации RTTI, найденной с помощью {$ METHODINFO} и ObjAuto.pas. У меня есть примеры приложений, если вам интересно, как это работает.   -  person Robert Love    schedule 29.05.2009
comment
Технически вы правы, но логика вызова на самом деле устанавливает кадры стека и параметры, необходимые для отправки вызовов на основе RTTI. Это требует некоторой работы с ассемблером на низком уровне. Я хочу абстрагироваться от этого процесса, а также иметь возможность генерировать короткие последовательности кода для таких вещей, как преобразователи, которые немного сложнее.   -  person David Taylor    schedule 29.05.2009


Ответы (5)


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

person ErvinS    schedule 29.05.2009
comment
У меня была более старая версия PaxCompiler до того, как эта функция была добавлена. Эта функция генерации собственного кода звучит интересно и входит в мой список вещей, с которыми можно поиграть. Вероятно, не очень подходит с точки зрения лицензирования с открытым исходным кодом. - person David Taylor; 29.05.2009

Тем более что я думал над твоим вопросом. Я не уверен, все ли вы пытаетесь просто выполнить вызов динамического метода. Даже если вы спрашиваете о создании кода 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 есть пример того, как это сделать.

person Robert Love    schedule 29.05.2009

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

person SeanX    schedule 29.05.2009
comment
Да, что-то в этом роде, но, возможно, более специфичное для Delphi, и оно не обязательно должно быть таким же мощным. В идеале что-то, что понимает поддерживаемые соглашения о вызовах Delphi (возможно, интегрируется с RTTI) и может выполнять базовую генерацию кода (конечно, требуется знание сборки). - person David Taylor; 29.05.2009

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

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

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

person Marco van de Voort    schedule 29.05.2009
comment
Привет, Марко, я действительно хочу чего-то более динамичного. Я могу писать код на встроенном ассемблере в Delphi, но не могу сразу угадать все перестановки, которые потребуются заранее. - person David Taylor; 29.05.2009

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

DAsmJit порт Delphi проект asmjit

person David Taylor    schedule 31.10.2011
comment
Жаль, что это старый порт. Ищу более новый порт. - person user3655788; 25.05.2014