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

Поиск:

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


Эксперт
****


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

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



Цитата(boostcoder @  24.7.2011,  19:14 Найти цитируемый пост)
конечно, знание ЯП с нормальной introspection очень помогло бы в понимании... 

Я знаю их не так много (точнее совсем почти не знаю), но в Java например это сделано отдельным пакетом (java.lang.reflect). В VCL это сделано так же отдельным классом, описывающим тип. Возможно, что и тут имеет смысл сделать нечто, расширяющее RTTI.  smile 

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


pattern`щик
****


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

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



Цитата(xvr @  24.7.2011,  19:20 Найти цитируемый пост)
нечто, расширяющее RTTI

например что/как и что желательно получить в итоге?

Добавлено через 3 минуты и 24 секунды
xvr, говорю же: мне, конкретно для моей задачи необходимы два момента:
1. генерация сериализаторов/десериализаторов.
2. reflection с возможностью указать куда и как рефлектиться. т.е. - сериализатор, БД, другой объект этого же типа.

но возможно в других ЯП есть более разумные и удобные моменты о которых я просто не знаю...
PM WWW   Вверх
kosmonaFFFt
Дата 25.7.2011, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  24.7.2011,  23:23 Найти цитируемый пост)
но возможно в других ЯП есть более разумные и удобные моменты о которых я просто не знаю...


Погляди в Java, там есть класс Class, описывающий классы, экземпляр которого можно получить например так:
Код

Class c = MyClass.class;

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


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


pattern`щик
****


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

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



Цитата(kosmonaFFFt @  25.7.2011,  06:51 Найти цитируемый пост)
из него можно получить всю информацию, например методы, поля, суперклассы и т. д.

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


Эксперт
****


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

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



Цитата(boostcoder @  24.7.2011,  19:23 Найти цитируемый пост)
например что/как и что желательно получить в итоге?
  •  Описатель структуры класса: все поля, методы. Включая их тип, сигнатуру параметров (для методов) и пр. Вот только не инстанциированные шаблоны так не получишь (и видимо вообще не получишь)
  •  Метод для создания экземпляра класса
  •  Метод для получения этого самого расширенного RTTI (в виде класса) по имени типа (в виде строки или идентификатора) или из существующего экземпляра объекта

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


pattern`щик
****


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

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



Цитата(xvr @  25.7.2011,  17:07 Найти цитируемый пост)
Описатель структуры класса: все поля, методы. Включая их тип, сигнатуру параметров (для методов) и пр.

осталось понять как это должно выглядеть в коде smile

Цитата(xvr @  25.7.2011,  17:07 Найти цитируемый пост)
Метод для создания экземпляра класса

метод, или способ? тот же вопрос: как это должно выглядеть в коде?

Цитата(xvr @  25.7.2011,  17:07 Найти цитируемый пост)
Метод для получения этого самого расширенного RTTI (в виде класса)

т.е. _этот_расширенный_RTTI_ - это должен быть некий тип/класс?

Цитата(xvr @  25.7.2011,  17:07 Найти цитируемый пост)
по имени типа (в виде строки или идентификатора) или из существующего экземпляра объекта

и снова тот же вопрос: как это должно выглядеть в коде?


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


Опытный
**


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

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



Цитата(boostcoder @  26.7.2011,  07:36 Найти цитируемый пост)
и снова тот же вопрос: как это должно выглядеть в коде?


Например так:
Код

Class myClass = MyClass.class; // или Class myClass = Class.byName("MyClass");
void* myObj = myClass.newInstance();


К сожалению в С++ нету базового класса похожего на Object в Java, поэтому единственный на мой взгляд способ вернуть новый экземпляр класса, созданный через reflection - вернуть void*.


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


pattern`щик
****


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

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



Код

Class myClass = MyClass.class;

тут Class это кто? какая-то встроенная сущность?
а MyClass кто?
и в общем, что выполняется в этой строке?

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


pattern`щик
****


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

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



итак. с чем разобрался:
1. для каждой единицы трансляции формируется Abstract syntax tree.
2. реальный компилятор(cc1plus) обрабатывает только по одному файлу за раз. при передаче g++ нескольких файлов, он поочередно выполняет cc1plus для каждого файла. а значит плагин будет запускаться столько же раз, сколько файлов.
3. есть возможность навесить свой обработчик на: 1) окончание разбора единицы трансляции, 2) глобальную обработку прагм, 3) глобальную обработку атрибутов.
4. плагин может добавлять/удалять в базу стандартных прагм и атрибутов свои прагмы и атрибуты.
5. есть возможность навесить обработчик на какую-то конкретную прагму или атрибут. т.е. сначала регаем имя, потом вешаем свой обработчик на реганное имя.
6. нет возможности навесить обработчик на разбор деклараций :( хотя в инете есть патч для этого.
7. нет возможности влиять на синтаксис языка.
8. AST можно генерить/изменять/удалять. т.е. при изменении AST можно с кодом сделать все что угодно.

далее...

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


Опытный
**


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

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



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


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


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

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



Цитата(boostcoder @  26.7.2011,  06:36 Найти цитируемый пост)
тут Class это кто? какая-то встроенная сущность?
а MyClass кто?
и в общем, что выполняется в этой строке?

условно :
Class - type_info
MyClass - struct MyClass
MyClass.class - typeid(MyClass)

но применительно не для всех типов, а только для полиморфных.. что позволяет после создания объекта имея ссылку на класс динамически кастовать его к нужному интерфейсу.. 




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


pattern`щик
****


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

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



EnergoHokum, нет нужды smile

mes, а можете показать то же самое ,но в виде примера на с++? ;) т.е. каким вы видите использование, и какие дополнительные возможности должен предоставлять этот самый расширенный type_info?

Добавлено через 1 минуту
и да, type_info и typeid() никогда не использовал smile 
PM WWW   Вверх
boostcoder
Дата 26.7.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(boostcoder @  26.7.2011,  09:08 Найти цитируемый пост)
и да, type_info и typeid() никогда не использовал

это я к тому, что не очень представляю для чего они нужны, и как их использовать.
PM WWW   Вверх
mes
Дата 26.7.2011, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  26.7.2011,  08:08 Найти цитируемый пост)
 а можете показать то же самое ,но в виде примера на с++? 

вот на скорую руку : http://liveworkspace.org/code/1e9029d8cabe...e9920a195e3336a


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


pattern`щик
****


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

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



не понимаю... smile

Добавлено через 6 минут и 52 секунды
mes, т.е. смысл в том, чтоб объект мог создать объект своего же типа? а как это можно использовать?
еще не понял что Вы хотели продемонстрировать с помощью dynamic_cast?
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.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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