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

Поиск:

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


Эксперт
****


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

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



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

Угу, только не объект (в понимании С++), а просто таблицы. Т.е. глобальный массив констант. Код, генерируемый gcc для RTTIEx не должен содержать исполняемого кода (т.е. неиспользуемая RTTIEx не должна вызывать накладных расходов run-time)

Яркий пример - уже упомянутые мною таблицы RTTI (смотреть в генерируемом ассемблере и в сорцах gcc), и таблицы для поддержки эксепшенов

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


pattern`щик
****


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

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



Цитата(xvr @  28.7.2011,  09:16 Найти цитируемый пост)
смотреть в генерируемом ассемблере и в сорцах gcc

Вы меня переоцениваете smile

Добавлено через 2 минуты и 33 секунды
Цитата(xvr @  28.7.2011,  09:16 Найти цитируемый пост)
Угу, только не объект (в понимании С++), а просто таблицы. Т.е. глобальный массив констант. Код, генерируемый gcc для RTTIEx не должен содержать исполняемого кода (т.е. неиспользуемая RTTIEx не должна вызывать накладных расходов run-time)

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


Опытный
**


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

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



Цитата(xvr @  28.7.2011,  13:16 Найти цитируемый пост)
Т.е. глобальный массив констант. Код, генерируемый gcc для RTTIEx не должен содержать исполняемого кода (т.е. неиспользуемая RTTIEx не должна вызывать накладных расходов run-time)


ИМХО не обязательно, можно сделать что-то типа class-loader'а, который бы в рантайме по мере использования классов создавал бы нужную информацию... Хотя это уже будет не С++... smile


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


pattern`щик
****


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

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



Цитата(kosmonaFFFt @  28.7.2011,  09:57 Найти цитируемый пост)
который бы в рантайме

не нужно рантайм нагружать тем, что можно сделать и без него.
PM WWW   Вверх
boostcoder
Дата 28.7.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(boostcoder @  27.7.2011,  13:45 Найти цитируемый пост)
get_shift() - смещение

может тогда назвать его offset() ?
PM WWW   Вверх
boostcoder
Дата 28.7.2011, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(xvr @  26.7.2011,  21:02 Найти цитируемый пост)
void call_method(void* ret_val, std::vector<AnyValue>& args);

а почему не ложить в вектор указатели на void?
PM WWW   Вверх
mes
Дата 28.7.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  28.7.2011,  17:24 Найти цитируемый пост)
а почему не ложить в вектор указатели на void? 

потярел нить, откуда появился этот код, но полагаю, потому что void * в отличии any не копиэйбл, а также не известно как его удалять.. 




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


pattern`щик
****


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

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



еще несколько вопросов.

как я понимаю, RTTIEX должен быть таким:
Код

struct rtti_ex_ {
   const char* name;
   type_ type;
   size_t size;
   size_t align;
};


где type - enum. так?
тогда вопрос: enum нужно генерить для всех типов в единице трансляции?

Добавлено через 1 минуту и 56 секунд
Цитата(mes @  28.7.2011,  21:37 Найти цитируемый пост)
потому что void * в отличии any не копиэйбл, а также не известно как его удалять..

не понял...
кот от xvr`а:
Код

class Class {
public:
 class member_iterator; // *member_iterator => Member
 member_iterator members_begin();
 member_iterator members_end();
 .... все остальные методы, типа find и пр .........
 Class(const char*); // create from string ID
 Class(void*); // create from Object
};
class Member {
public:
 MemberType get_type();
 const char* get_name();
 size_t get_shift();
 void put_data(void*);
 void get_data(void*);
 void call_method(void* ret_val, std::vector<AnyValue>& args);
};
class MemberType {
public:
 const char* get_type_name();
 TypeKind get_type_kind(); // Returns POD, struct, array, function, member pointer, etc
 MemberType get_nested_type(size_t idx); // For struct, functions, members returns types for struct field, function arg, etc
 size_t get_size();
 size_t get_align();
 ...
};


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


Эксперт
****


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

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



Цитата(boostcoder @  28.7.2011,  17:37 Найти цитируемый пост)
может тогда назвать его offset() ? 

Можно. А еще можно посмотреть интерфейсы в java.lang.reflection и скопировать идеи оттуда (насколько это будет возможно)
Цитата(boostcoder @  28.7.2011,  18:24 Найти цитируемый пост)
а почему не ложить в вектор указатели на void? 

В принципе можно. Но тогда на вызывающей стороне придется создавать все параметры в виде явных переменных и брать на них указатели. Кроме того, передавая значения в некой обвертке (AnyValue) можно существенно упростить жизнь вызывающей стороне, если дать возможность объекту Class проводить неявные преобразования аргументов. Например - если функция принимает параметр целочисленного типа, то вызывающая сторона может задать нечто типа long long и не вдаваться в подробности о конкретных размерах аргумента.

Цитата(boostcoder @  28.7.2011,  21:40 Найти цитируемый пост)
как я понимаю, RTTIEX должен быть таким:

Типа такого. Для составных типов (структур, классов, массивов, функций и т.п.) тут еще должны присутствовать такие же записи для всех вложенных элементах (поля структур, аргументы функций и пр)

Цитата(boostcoder @  28.7.2011,  21:40 Найти цитируемый пост)
тогда вопрос: enum нужно генерить для всех типов в единице трансляции?

Не enum'ы а инстансы rtti_ex_. Да, для всех.

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


pattern`щик
****


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

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



Цитата(xvr @  28.7.2011,  22:15 Найти цитируемый пост)
А еще можно посмотреть интерфейсы в java.lang.reflection

я ж не знал smile

Цитата(xvr @  28.7.2011,  22:15 Найти цитируемый пост)
В принципе можно. Но тогда на вызывающей стороне придется создавать все параметры в виде явных переменных и брать на них указатели. Кроме того, передавая значения в некой обвертке (AnyValue) можно существенно упростить жизнь вызывающей стороне, если дать возможность объекту Class проводить неявные преобразования аргументов. Например - если функция принимает параметр целочисленного типа, то вызывающая сторона может задать нечто типа long long и не вдаваться в подробности о конкретных размерах аргумента.

понял.

Цитата(xvr @  28.7.2011,  22:15 Найти цитируемый пост)
Типа такого. Для составных типов (структур, классов, массивов, функций и т.п.) тут еще должны присутствовать такие же записи для всех вложенных элементах (поля структур, аргументы функций и пр)

ага.

Цитата(xvr @  28.7.2011,  22:15 Найти цитируемый пост)
Не enum'ы а инстансы rtti_ex_. Да, для всех.

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


pattern`щик
****


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

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



xvr, меня тут мысль посетила...
вот AST генерится на основании кода единицы трансляции. значит в нем(в AST) все связанно. а если я в этот AST добавлю свой подAST, то, прежний AST по идее станет незаконченным/неправильным/испорченным. так?
PM WWW   Вверх
kosmonaFFFt
Дата 29.7.2011, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @ 29.7.2011,  06:07)
xvr, меня тут мысль посетила...
вот AST генерится на основании кода единицы трансляции. значит в нем(в AST) все связанно. а если я в этот AST добавлю свой подAST, то, прежний AST по идее станет незаконченным/неправильным/испорченным. так?

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


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


pattern`щик
****


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

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



Цитата(kosmonaFFFt @  29.7.2011,  05:59 Найти цитируемый пост)
добавления чего-то в AST может быть эквивалентен эффекту добавления чего-то в исходники перед компиляцией

а вот я не уверен... нужно попробовать что-то сгенерить...
PM WWW   Вверх
kosmonaFFFt
Дата 29.7.2011, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Главное изменить AST до прохода всяческих оптимизаций, тогда вероятность ошибок уменьшится...
А вообще на тему компиляции могу посоветовать почитать что-то типа этого: http://www.proklondike.com/books/thobshee/compiler2.html


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


pattern`щик
****


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

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



Цитата(kosmonaFFFt @  29.7.2011,  07:46 Найти цитируемый пост)
Главное изменить AST до прохода всяческих оптимизаций

я его и изменяю сразу после построения.

еще вопрос.
допустим юзер хочет создать объект в неймспейсе:
Код

std::string* str = Class::create("std::string");

как быть?
получается что таблицу типов нужно генерить не в виде простого массива.. это должен быть массив cons`ов ? я правильно мыслю?
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0647 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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