фреймворк генератора кода x86 для Delphi - PullRequest
4 голосов
/ 29 мая 2009

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

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

Обновление:

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

Спасибо, David

Ответы [ 5 ]

5 голосов
/ 29 мая 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 Presentation от DelphiLive о том, как это сделать.

2 голосов
/ 29 мая 2009

Очень эффектный ответ: Что-то вроде LLVM ? Я не уверен, может ли он быть использован в Delphi или нет, но вы должны быть в состоянии создать DLL с ним.

2 голосов
/ 29 мая 2009

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

0 голосов
/ 31 октября 2011

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

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

0 голосов
/ 29 мая 2009

Логически вы просто сгенерируете код Delphi, скомпилируете в DLL / BPL компилятор cmdline, а затем загрузите его dyn?

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

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

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