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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> правильная реализация reflection+introspection, в С/С++ путем написания плагина для GCC. 
:(
    Опции темы
boostcoder
Дата 27.7.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



xvr, поясните пожалуйста следующие моменты ;) а то в роде и понимаю, а вроде и нет..
Цитата(xvr @  26.7.2011,  21:02 Найти цитируемый пост)
size_t get_size();

Цитата(xvr @  26.7.2011,  21:02 Найти цитируемый пост)
size_t get_align();

Цитата(xvr @  26.7.2011,  21:02 Найти цитируемый пост)
size_t get_shift();



Up.
понял smile
get_size() - это sizeof(type)
get_align() - это выравнивание
get_shift() - смещение

Это сообщение отредактировал(а) boostcoder - 27.7.2011, 20:55
PM WWW   Вверх
boostcoder
Дата 27.7.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



эм.. вопрос: метаинформацию генерить для всех типов в единице трансляции?


и еще один: при компиляции нужно собирать метаинформацию о типах. где ее сохранять?
идея первая - в генерить статический_константный_массив. но проблема в том, что типов может быть тысячи ,что вызовет переполнение стека.
идея вторая - генерировать только инициализатор для массива. а при старте программы выделять память в куче и инициализировать ее. для этого в AST находим функцию main() и в нее иньектим init() который это проделает.

выскажитесь кто-нибудь ;)

Это сообщение отредактировал(а) boostcoder - 27.7.2011, 14:50
PM WWW   Вверх
Sahab
Дата 27.7.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Цитата(boostcoder @  27.7.2011,  14:38 Найти цитируемый пост)
метаинформацию генерить для всех типов в единице трансляции?

мне кажется только для "нужных" типов помеченных нами какой-нить прагмой
PM MAIL   Вверх
boostcoder
Дата 27.7.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Sahab @  27.7.2011,  16:01 Найти цитируемый пост)
только для "нужных" типов помеченных нами какой-нить прагмой

а помечалка не устанет? smile руки-то не казенные...
в смысле, это как-то не логично, писать reflection и заставлять юзера помечать классы...

Это сообщение отредактировал(а) boostcoder - 27.7.2011, 17:14
PM WWW   Вверх
boostcoder
Дата 27.7.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



на данный момент разобрался со сбором инфы из AST.
1. итерироваться от глобального неймспейса по всем вложенным с неограниченным уровнем вложенности.
2. перечислять все декларации в любом из неймспейсов.
3. определить/фильтровать типы деклараций.
4. перечислять члены и вложенные декларации структур/классов с неограниченным уровнем вложенности.
5. добавлять/изменять AST.

вроде все что нужно...


пока что не нашел функцию, которая из строкового представления декларации генерит AST. потому как создавать AST "руками" это жесть smile 

Это сообщение отредактировал(а) boostcoder - 28.7.2011, 08:33
PM WWW   Вверх
boostcoder
Дата 27.7.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  27.7.2011,  10:15 Найти цитируемый пост)
Цитата(boostcoder @ 26.7.2011,  23:11)
Цитата(xvr @  26.7.2011,  21:02 )
TypeKind get_type_kind();

тут TypeKind - enum?

Да

какие типы он должен перечислять? все POD`ы и один non_pod ?
PM WWW   Вверх
xvr
Дата 27.7.2011, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(boostcoder @  27.7.2011,  14:38 Найти цитируемый пост)
эм.. вопрос: метаинформацию генерить для всех типов в единице трансляции?

Это должно настраиваться (через опции командной строки). Либо все, либо специально помеченные (и унаследованные от них)

Цитата(boostcoder @  27.7.2011,  14:38 Найти цитируемый пост)
идея первая - в генерить статический_константный_массив. но проблема в том, что типов может быть тысячи ,что вызовет переполнение стека.

угу, стек не переполнится - статические массивы помещаются не в стеке. Посмотрите, как генерятся RTTI таблицы, и постройте там же

Цитата(boostcoder @  27.7.2011,  19:00 Найти цитируемый пост)
 потому как создавать AST "руками" это жесть

Простые массивы с константами тоже сложно сгенерить?

Цитата(boostcoder @  27.7.2011,  19:41 Найти цитируемый пост)
какие типы он должен перечислять? все POD`ы и один non_pod ?

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

PM MAIL   Вверх
mes
Дата 27.7.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  27.7.2011,  18:41 Найти цитируемый пост)
 все POD`ы и один non_pod ? 

 smile это как ?!



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 28.7.2011, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  27.7.2011,  21:04 Найти цитируемый пост)
Это должно настраиваться (через опции командной строки). Либо все, либо специально помеченные (и унаследованные от них)

кстати вариант. при том, это возможно.

Цитата(xvr @  27.7.2011,  21:04 Найти цитируемый пост)
угу, стек не переполнится - статические массивы помещаются не в стеке.

ы. а где? smile 

Цитата(xvr @  27.7.2011,  21:04 Найти цитируемый пост)
Посмотрите, как генерятся RTTI таблицы, и постройте там же

это где смотреть?

Цитата(xvr @  27.7.2011,  21:04 Найти цитируемый пост)
Простые массивы с константами тоже сложно сгенерить?

сложно - понятие относительное. я вообще-то предполагаю, что должна быть функция генерящая AST из ("int i = 0;"). но пока что я ее не нашел.

Цитата(xvr @  27.7.2011,  21:04 Найти цитируемый пост)
Все PODы

это понятно.

Цитата(xvr @  27.7.2011,  21:04 Найти цитируемый пост)
функция, структура, массив, класс

дело в том, что массив в gcc тоже под... попробую отыскать возможность получить больше информации о ноде...

Добавлено через 45 секунд
Цитата(mes @  27.7.2011,  21:48 Найти цитируемый пост)
это как ?!

в моем понимании, не_POD - это все что содержит функции-члены.
PM WWW   Вверх
mes
Дата 28.7.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  27.7.2011,  23:12 Найти цитируемый пост)
ы. а где? 

в области данных

Добавлено через 8 минут и 17 секунд
Цитата(boostcoder @  27.7.2011,  23:12 Найти цитируемый пост)
что массив в gcc тоже под..

 smile 
Цитата(boostcoder @  27.7.2011,  23:12 Найти цитируемый пост)
, не_POD - это все что содержит функции-члены. 

а почему этот не_POD один, а каких тогда POD`ов много ?

раз уже подошли вплотную к AST, мож и POD'ам уделить внимание, чтоб не вводить в заблуждение хотя бы самого себя.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 28.7.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  28.7.2011,  00:21 Найти цитируемый пост)
в области данных

это как? по правде сказать, всегда старался избегать использования статических переменных..

Цитата(mes @  28.7.2011,  00:21 Найти цитируемый пост)
что массив в gcc тоже под..

прошу прощения, запутался...

по поводу POD`ов создам лучше отдельную тему. чтоб эту не хламить..

Цитата(mes @  28.7.2011,  00:21 Найти цитируемый пост)
а почему этот не_POD один, а каких тогда POD`ов много ?

раз уже подошли вплотную к AST, мож и POD'ам уделить внимание, чтоб не вводить в заблуждение хотя бы самого себя..

да-да-да. создаю тему.

PM WWW   Вверх
boostcoder
Дата 28.7.2011, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  27.7.2011,  21:04 Найти цитируемый пост)
(и унаследованные от них)

кстати, разобрался как итерироваться по узлам-предкам smile

Это сообщение отредактировал(а) boostcoder - 28.7.2011, 01:31
PM WWW   Вверх
kosmonaFFFt
Дата 28.7.2011, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(boostcoder @ 26.7.2011,  18:13)
т.е. получается, что все объекты типа Class ссылаются на какую-то глобальную карту. и данные для этой карты нужно генерировать в компайлтайм. а инициализировать в рантайм? правильно мыслю?

Добавлено @ 14:15
kosmonaFFFt, можешь показать тоже самое в коде? или в псевдокоде.

Псевдокод:

Код

Map<String, Class>  global_classes = new Map<String, Class>();
foreach (класс in все_классы_программы) {
    Class clazz = new Class(класс);
    global_classes.put(класс.getName(), clazz);
}


Тут я вижу 2 варианта - либо вставить код инициализации объектов Class в начало main(), либо сразу сгенерировать во время компиляции и поместить в секцию данных программы, или куда там статические данные идут... Главное, чтобы global_classes из примера выше был доступен в рантайме... Можно для начала просто попробовать C++ код сгенерировать, примерно как в Qt с их QMetaObject...
И да, если я что-то где-то не очень понятно объясняю, то это потому, что для меня основными языками являются Java и C#, и к наличию  reflection я привыкший...


--------------------
user posted image
PM MAIL ICQ   Вверх
boostcoder
Дата 28.7.2011, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



6. итерироваться по списку аргументов со всеми вытекающими.
7. определить что поддерево является декларацией шаблона.
8. определить что поддерево является статической_переменной/статической_функцией/статическим_членом.

Добавлено @ 08:09
kosmonaFFFt, понял.
все же лучше использовать глобальный_статический_константный_объект.

Это сообщение отредактировал(а) boostcoder - 28.7.2011, 08:33
PM WWW   Вверх
kosmonaFFFt
Дата 28.7.2011, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(boostcoder @  28.7.2011,  12:08 Найти цитируемый пост)
все же лучше использовать глобальный_статический_константный_объект.


Ну да, тоже вариант...


--------------------
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.