Нужен препроцессор для исходников

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Нужен препроцессор для исходников

Сообщение devels » 14.04.2011 14:15:51

Всех приветствую.

В с++ есть волшебный #define - мне нужно что-то подобное, но можно и без волшебства. Есть ли готовые решения для делфи/fpc, чтобы его можно было подключить и юзать. Как я себе это представляю, до компиляции препроцессор обходит все исходники и делает свою работу, а также сохраняет бэкап исходников, после того как мы отладили он восстанавливает аккуратно бэкап.

Теперь - почему мне так нужен #define, дело в том что в моей разработке (то-что в моей подписи) он просто ЖИЗНЕННО необходим, для того чтобы оптимизировать скорость выполнения. Меня не устраивает то, что ради оптимизация я как идиот копипастю код. По моим подсчетам благодаря генератору или препроцессору я смогу увеличить скорость выполнения виртуальной машины в 2 раза. Inline функции там никак не подходят, ну совершенно, т.к. их реализация очень хромает и покрывает лишь 20% того что мне нужно.

Гугл ничего дельного не нашел. Боюсь мне придется писать препроцессор самому.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Нужен препроцессор для исходников

Сообщение Mr.Smart » 14.04.2011 14:22:12

Можно попробовать прикрутить Макропроцессор m4.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Нужен препроцессор для исходников

Сообщение Odyssey » 14.04.2011 14:30:02

devels
Теоретически, во freepascal есть макросы, но я подозреваю, что вы их уже смотрели, и отбросили по каким-то причинам.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Нужен препроцессор для исходников

Сообщение devels » 14.04.2011 14:33:25

Odyssey писал(а):devels
Теоретически, во freepascal есть макросы, но я подозреваю, что вы их уже смотрели, и отбросили по каким-то причинам.


Нужно внешнее решение, чтобы и под делфи работало.

Добавлено спустя 3 часа 15 минут 33 секунды:
Всем спасибо, написал свой не хуже чем в с++. Выложу через несколько дней.
Поддерживает макросы в стиле функций (с параметрами), а также макросы в макросах. Хы, написал за 3 часа :mrgreen:

Код: Выделить всё
{#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.   
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Нужен препроцессор для исходников

Сообщение MageSlayer » 14.04.2011 20:09:44

Mr.Smart писал(а):Можно попробовать прикрутить Макропроцессор m4.


Два раза за :). Самая адекватная вещь из бесплатных. Стабилен как скала :)
Макросы как выше делаются легко.
Есть еще m5. Но это уже экзотика.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Нужен препроцессор для исходников

Сообщение hinst » 14.04.2011 21:33:39

есть же шаблоны. Я делал через шаблоны такие вещи.
Код: Выделить всё
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
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Нужен препроцессор для исходников

Сообщение devels » 14.04.2011 22:33:50

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
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Нужен препроцессор для исходников

Сообщение скалогрыз » 15.04.2011 05:28:23

devels писал(а):Inline функции там никак не подходят, ну совершенно, т.к. их реализация очень хромает и покрывает лишь 20% того что мне нужно.

а что входит в оставшиеся 80%?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Нужен препроцессор для исходников

Сообщение devels » 16.04.2011 16:12:15

Забыл, inline не пашет для методов ни в делфи, ни в fpc.

Добавлено спустя 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.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Нужен препроцессор для исходников

Сообщение MageSlayer » 17.04.2011 16:03:29

В тему использования m4.
Может кого мои поделки заинтересуют - http://denisgolovan.livejournal.com/11297.html
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Нужен препроцессор для исходников

Сообщение devels » 17.04.2011 18:07:32

Кстати вот так выглядят макросы в моей поделке:

http://code.google.com/p/orionphp/sourc ... .orimacros
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Нужен препроцессор для исходников

Сообщение Max Rusov » 17.04.2011 18:17:40

Неужели и правда выигрыш быстродействия стоит этого геморроя?
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Нужен препроцессор для исходников

Сообщение devels » 17.04.2011 18:46:16

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 что-то уж слишком магический синтаксис.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Нужен препроцессор для исходников

Сообщение Max Rusov » 17.04.2011 19:28:38

Ну, не знаю. Посмотрел я Ваши макросы. В большинстве случаев 1 макрос раскрывается в 2/3 строки текста. Если представить какой после этого геморрой с отладкой - я бы ни за что на это не пошел...
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Нужен препроцессор для исходников

Сообщение devels » 17.04.2011 19:37:22

Max Rusov писал(а):Ну, не знаю. Посмотрел я Ваши макросы. В большинстве случаев 1 макрос раскрывается в 2/3 строки текста. Если представить какой после этого геморрой с отладкой - я бы ни за что на это не пошел...


Все отлажено, под макросами только несколько корневых модулей. Кстати, даже удобнее отлаживать, т.к. я могу изменить в одной конструкции оп-кода кусочек кода, а в других местах он останется прежним, таким образом я могу манипулировать кодом гораздо лучше, а затем все вернуть с помощью препроцессора.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru