Нужен препроцессор для исходников
Модератор: Модераторы
Нужен препроцессор для исходников
Всех приветствую.
В с++ есть волшебный #define - мне нужно что-то подобное, но можно и без волшебства. Есть ли готовые решения для делфи/fpc, чтобы его можно было подключить и юзать. Как я себе это представляю, до компиляции препроцессор обходит все исходники и делает свою работу, а также сохраняет бэкап исходников, после того как мы отладили он восстанавливает аккуратно бэкап.
Теперь - почему мне так нужен #define, дело в том что в моей разработке (то-что в моей подписи) он просто ЖИЗНЕННО необходим, для того чтобы оптимизировать скорость выполнения. Меня не устраивает то, что ради оптимизация я как идиот копипастю код. По моим подсчетам благодаря генератору или препроцессору я смогу увеличить скорость выполнения виртуальной машины в 2 раза. Inline функции там никак не подходят, ну совершенно, т.к. их реализация очень хромает и покрывает лишь 20% того что мне нужно.
Гугл ничего дельного не нашел. Боюсь мне придется писать препроцессор самому.
В с++ есть волшебный #define - мне нужно что-то подобное, но можно и без волшебства. Есть ли готовые решения для делфи/fpc, чтобы его можно было подключить и юзать. Как я себе это представляю, до компиляции препроцессор обходит все исходники и делает свою работу, а также сохраняет бэкап исходников, после того как мы отладили он восстанавливает аккуратно бэкап.
Теперь - почему мне так нужен #define, дело в том что в моей разработке (то-что в моей подписи) он просто ЖИЗНЕННО необходим, для того чтобы оптимизировать скорость выполнения. Меня не устраивает то, что ради оптимизация я как идиот копипастю код. По моим подсчетам благодаря генератору или препроцессору я смогу увеличить скорость выполнения виртуальной машины в 2 раза. Inline функции там никак не подходят, ну совершенно, т.к. их реализация очень хромает и покрывает лишь 20% того что мне нужно.
Гугл ничего дельного не нашел. Боюсь мне придется писать препроцессор самому.
Можно попробовать прикрутить Макропроцессор m4.
devels
Теоретически, во freepascal есть макросы, но я подозреваю, что вы их уже смотрели, и отбросили по каким-то причинам.
Теоретически, во freepascal есть макросы, но я подозреваю, что вы их уже смотрели, и отбросили по каким-то причинам.
Odyssey писал(а):devels
Теоретически, во freepascal есть макросы, но я подозреваю, что вы их уже смотрели, и отбросили по каким-то причинам.
Нужно внешнее решение, чтобы и под делфи работало.
Добавлено спустя 3 часа 15 минут 33 секунды:
Всем спасибо, написал свой не хуже чем в с++. Выложу через несколько дней.
Поддерживает макросы в стиле функций (с параметрами), а также макросы в макросах. Хы, написал за 3 часа
Код: Выделить всё
{#define %AS_REAL_MEM(var)
with TOriMemory(var) do
if typ in [mvtVariable, mvtGlobalVar] then
begin
var := Mem.ptr
if typ = mvtPointer then
var := M.mem.ptr
end;
}
{#define %GET_STACK_POP(var)
var := Self.Stack.Pop;
%AS_REAL_MEM(var);
}
{#define %TEST_DEF st := nil}
function test();
var
st: TOriMemory;
begin
%GET_STACK_POP(st);
%TEST_DEF;
end.
На выходе вот:
Код: Выделить всё
unit test;
function test();
var
st: TOriMemory;
begin
st := Self.Stack.Pop;
with TOriMemory(st) do
if typ in [mvtVariable, mvtGlobalVar] then
begin
st := Mem.ptr
if typ = mvtPointer then
st := M.mem.ptr
end;
st := nil;
end.
-
MageSlayer
- постоялец
- Сообщения: 216
- Зарегистрирован: 07.09.2006 12:30:44
Mr.Smart писал(а):Можно попробовать прикрутить Макропроцессор m4.
Два раза за
Макросы как выше делаются легко.
Есть еще m5. Но это уже экзотика.
есть же шаблоны. Я делал через шаблоны такие вещи.
Код: Выделить всё
type myfoo = template Foo<T>
class function doFoo(var a: T); inline; //ставишь class function щитобы было как глобальная функция
begin
a:='fffuuu';
end;
end;
//потом используешь
type fffuuu = specialize Foo<TOriMemory>;
fffuuu.doFoo(st);
hinst писал(а):есть же шаблоны. Я делал через шаблоны такие вещи.Код: Выделить всё
type myfoo = template Foo<T>
class function doFoo(var a: T); inline; //ставишь class function щитобы было как глобальная функция
begin
a:='fffuuu';
end;
end;
//потом используешь
type fffuuu = specialize Foo<TOriMemory>;
fffuuu.doFoo(st);
К сожалению их нет в delphi.
devels писал(а):Inline функции там никак не подходят, ну совершенно, т.к. их реализация очень хромает и покрывает лишь 20% того что мне нужно.
а что входит в оставшиеся 80%?
Забыл, inline не пашет для методов ни в делфи, ни в fpc.
Добавлено спустя 5 минут 7 секунд:
Ну и вот еще: это жесть, макросы ох как нужны:
Добавлено спустя 5 минут 7 секунд:
Ну и вот еще: это жесть, макросы ох как нужны:
Код: Выделить всё
inline не работает для любых видов методов позднего связывания (virtual, dynamic, message)
inline не работает для процедур содержащих код на языке ассемблера,
inline не работает для конструкторов и деструкторов
inline не работает для главного блока программы и секций инициализации и финализации модулей
inline код может быть использован внутри пакетов, но inline не работает через границы пакетов
inline не работает в модулях, связанных кольцевой зависимостью. Это ограничение включает и неявные кольцевые ссылки между модулями. Например, если модуль A использует модуль B, модуль B использует C, а C, в свою очередь, использует A, то при компиляции модуля A не будет производиться inline-подстановка кода из модулей B и C.
inline-подстановка в модулях, входящих в кольцевые зависимости, может быть произведена, если подстановка производится из модуля, не входящего в кольцо зависимостей. Например, если в предыдущем примере модуль A использует также модуль D, то в модуле A возможна inline-подстановка кода из модуля D.
inline не работает, если процедура объявлена в секции interface модуля и обращается к символам, объявленным в секции implementation.
inline не работает для методов в классах, если они обращаются к членам классов, имеющим более низкую видимость, чем сам метод. Например, если public метод обращается к private методу, то для такого метода inline-подстановка осуществляться не будет.
если процедура, помеченная как inline использует процедуры или переменные из внешних модулей, то все эти модули должны быть перечислены в списке uses того модуля, где inline процедура будет использована, иначе inline-подстановка не производится.
inline-подстановка не осуществляется для процедур и функций, которые используются в выражениях проверки условия циклов while и repeat.
-
MageSlayer
- постоялец
- Сообщения: 216
- Зарегистрирован: 07.09.2006 12:30:44
В тему использования m4.
Может кого мои поделки заинтересуют - http://denisgolovan.livejournal.com/11297.html
Может кого мои поделки заинтересуют - http://denisgolovan.livejournal.com/11297.html
Кстати вот так выглядят макросы в моей поделке:
http://code.google.com/p/orionphp/sourc ... .orimacros
http://code.google.com/p/orionphp/sourc ... .orimacros
Неужели и правда выигрыш быстродействия стоит этого геморроя?
Max Rusov писал(а):Неужели и правда выигрыш быстродействия стоит этого геморроя?
Еще как стоит, потому что у меня ООП стиль, и на каждый чих вызывать метод, который не инлайниться и в котором 2-3 строчки, все это накапливается и дает о себе знать, значительней чем кажется.
Кстати, исходник пре-процессора можно найти тут: http://code.google.com/p/orionphp/sourc ... s/defines/
Работает очень просто, создаем файл macros.osc например (обязательно расширение osc) и в нем следующие команды:
Код: Выделить всё
; MACROS SCRIPT
@include "/VM/ori_vmMemory.orimacros"
@include "/VM/ori_vmEval.orimacros"
@go "/VM/ori_vmMemory.m.pas" "/VM/ori_vmMemory.pas"
@go "/VM/ori_vmEval.m.pas" "/VM/ori_vmEval.pas"
@inlude - подключает файл с макросами
@go - запускает препроцессор для файла 1-параметр и сохраняет результат в другой файл 2-параметр.
Пути к файлам указывать относительно файла macros.osc.
Далее, просто открываем macros.osc через препроцессор и любуемся результатом.
P.S. А у m4 что-то уж слишком магический синтаксис.
Ну, не знаю. Посмотрел я Ваши макросы. В большинстве случаев 1 макрос раскрывается в 2/3 строки текста. Если представить какой после этого геморрой с отладкой - я бы ни за что на это не пошел...
Max Rusov писал(а):Ну, не знаю. Посмотрел я Ваши макросы. В большинстве случаев 1 макрос раскрывается в 2/3 строки текста. Если представить какой после этого геморрой с отладкой - я бы ни за что на это не пошел...
Все отлажено, под макросами только несколько корневых модулей. Кстати, даже удобнее отлаживать, т.к. я могу изменить в одной конструкции оп-кода кусочек кода, а в других местах он останется прежним, таким образом я могу манипулировать кодом гораздо лучше, а затем все вернуть с помощью препроцессора.
