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

Поиск:

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


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


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

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



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

нет в том, что объектом не является не только инстанция класса, но и сам класс.. какими возможностями будет обладать объект-класс зависит от идеологии.. 

Цитата(boostcoder @  26.7.2011,  08:46 Найти цитируемый пост)
 Вы хотели продемонстрировать с помощью dynamic_cast

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

Добавлено через 1 минуту и 39 секунд
мой пример был приведен не по теме, а  как ответ на 
Цитата(boostcoder @  26.7.2011,  06:36 Найти цитируемый пост)
и в общем, что выполняется в этой строке?


Добавлено через 5 минут и 37 секунд
если ближе к теме, то кусок должен выглядить так :
Код

type  const& _type = get_class("A");
object *obj = _type.create();


Добавлено через 7 минут и 50 секунд
P.S. и вместо type по смыслу больше подходит Class..


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


pattern`щик
****


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

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



Цитата(mes @  26.7.2011,  10:37 Найти цитируемый пост)
нет в том, что объектом не является не только инстанция класса, но и сам класс.

все равно не понял..
можете как-то псевдокодом показать пример того как это дело можно использовать... и для чего? ;)

Добавлено через 3 минуты и 52 секунды
я не понимаю я этого, наверное потому что никогда не писал на ЯП которые это умеют делать smile
PM WWW   Вверх
xvr
Дата 26.7.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(boostcoder @  26.7.2011,  08:49 Найти цитируемый пост)
3. есть возможность навесить свой обработчик на: 1) окончание разбора единицы трансляции,

Вешать сюда. По AST со входа нужно генерить таблицы с расширенным RTTI (RTTIEx), и специальный сегмент для общей таблицы с именами типов и ссылками на RTTIEx для каждого типа.

Цитата(boostcoder @  26.7.2011,  07:36 Найти цитируемый пост)
тут Class это кто?

Это вторая часть reflection - специальная библиотека. Этот Class использует таблицы RTTIEx для выдачи энумераторов на все member'ы класса. Каждый экземпляр Class описывает один конкретный тип

Кроме энумераторов Class должен содержать функции для чтения/записи/вызова member'ов исходного класса и функцию для создания этих самых исходных классов.

Конкретные интерфейсы написать прямо тут затрудняюсь - их слишком много

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


pattern`щик
****


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

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



Цитата(mes @  26.7.2011,  10:37 Найти цитируемый пост)
type const& _type = get_class("A");

тут type - какой-то базовый тип?
т.е. таким образом мы можем получить объект базового типа который умеет создавать объекты типа "A" ?
PM WWW   Вверх
mes
Дата 26.7.2011, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  26.7.2011,  09:57 Найти цитируемый пост)
т.е. таким образом мы можем получить объект базового типа который умеет создавать объекты типа "A" 

таким образом мы получаем объект (объект-тип), который знает "все" о классе типа "А"  , а также может создатьинстанцию этого класса.. 
P.S. к базовым классам типа A отношение не имеет, это отдельная линия.. 




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


pattern`щик
****


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

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



Цитата(xvr @  26.7.2011,  10:55 Найти цитируемый пост)
Вешать сюда.

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

Цитата(xvr @  26.7.2011,  10:55 Найти цитируемый пост)
По AST со входа нужно генерить таблицы с расширенным RTTI (RTTIEx), и специальный сегмент для общей таблицы с именами типов и ссылками на RTTIEx для каждого типа.

очень желательно это объяснить в боооолее развернутой форме. ибо я никогда не разрабатывал/модифицировал компиляторы. и мне еще многое не понятно smile

Цитата(xvr @  26.7.2011,  10:55 Найти цитируемый пост)
Это вторая часть reflection - специальная библиотека. Этот Class использует таблицы RTTIEx для выдачи энумераторов на все member'ы класса. Каждый экземпляр Class описывает один конкретный тип

с этим понятно. вроде...

Цитата(xvr @  26.7.2011,  10:55 Найти цитируемый пост)
Кроме энумераторов Class должен содержать функции для чтения/записи/вызова member'ов исходного класса и функцию для создания этих самых исходных классов.

тоже понятно...

Цитата(xvr @  26.7.2011,  10:55 Найти цитируемый пост)
Конкретные интерфейсы написать прямо тут затрудняюсь - их слишком много

чьи интерфейсы?
PM WWW   Вверх
mes
Дата 26.7.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  26.7.2011,  10:05 Найти цитируемый пост)
чьи интерфейсы? 

Цитата(xvr @  26.7.2011,  09:55 Найти цитируемый пост)
 функции для чтения/записи/вызова member'ов исходного класса и функцию для создания


Добавлено @ 11:22
вот еще пример 
Код

struct A { 
 published:
    Void fn(Int i, Double d) // где все аргументы наследники object
    {    }

};

fn(4, 4.5); // прямой вызов

// "безличностный вызов" : 
Args args;
args.push_back(Int(4));
args.push_back(Double(5));

std::string cls = "A";
Class classA = get_class(cls); 

object * obj  = classA.create ();
obj->invoke(classA.get_memfn("fn"), args);




Это сообщение отредактировал(а) mes - 26.7.2011, 11:48


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


pattern`щик
****


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

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



mes, минутку... это нужно переварить..

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


pattern`щик
****


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

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



к примеру, если имя типа/объекта известны во время компиляции в виде строки, то как создать объект или получить ссылку на существующий объект - понятно.
Код

// создание объекта по его имени.
obj = create("A"); // находим декларацию типа "A", и заменяем эту строку на это: A obj;

// далее, получение ссылки на объект.
ref = get("obj"); // находим переменную "obj", определяем ее тип, и вместо этой строки записываем это: A& ref = obj;

// вызов метода.
get("ref").invoke("method")(args);

тут все просто.

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

struct Class {
   Class* create(const char*) {} // это правильно?
   Class* invoke(const char*, ...) {} // а вот тут не понятно. invoke() должен возвращать значение.
              // вопрос: для возвращаемых/принимаемых значений должен быть какой-то базовый тип? или использовать тот же Class?
};



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


pattern`щик
****


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

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



т.е. к примеру такая программа:
Код


struct type1 {
   int add(int a, int b) {return a+b;}
};

struct type2 {
   int mul(int a, int b) {return a+b;}
};

int main() {
   type1 t1;
   int r1 = t1.add(2, 2);
   type2 t2;
   int r2 = t2.mul(2, 2);
}



должна быть оттранслирована в нечто типа этого:
Код


struct Class {
   Class* create(const char*) {}
   Class* invoke(const char*, ...) {}
};

struct type1: Class {
   int add(int a, int b) {return a+b;}
};

struct type2: Class {
   int mul(int a, int b) {return a*b;}
};

int main() {
   Class* r1 = create("type1")->invoke("add", 2, 2);
   Class* r2 = create("type2")->invoke("mul", 2, 2);
}


правильно?

еще не понятно, как быть с объектами... create и invoke должны возвращать указатели?

и еще, будет ли такой код считаться логичным, и нужно ли оно вообще?
Код

   Class* obj1 = create("type1");
   Class* obj2 = obj1->create("type2");



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


Опытный
**


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

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



Цитата(boostcoder @  26.7.2011,  16:13 Найти цитируемый пост)
но для того чтоб интроспекция была динамической, нам нужно уметь выполнять все тоже самое но в рантайме...


Чтобы это сделать, нужно при компиляции сгенерировать код, который для каждого класса в программе при ее запуске создаст объект типа Class (или type_info или как-нибуть еще) и положит его в какую-нибудь коллекцию (например в Java этим занимается ClassLoader виртуальной машины), чтобы можно было потом его в это коллекции найти, извлечь и использовать... Классы в программе не должны наследоваться от класса Class, для каждого класса должен быть создан объект класса Class, но желательно иметь что-то типа класса Object, от которого они бы наследовались... Ну или как-то так...

З.Ы. Все это взято мной из воспоминаний о том, как работает reflection в Java...


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


pattern`щик
****


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

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



т.е. получается, что все объекты типа Class ссылаются на какую-то глобальную карту. и данные для этой карты нужно генерировать в компайлтайм. а инициализировать в рантайм? правильно мыслю?

Добавлено через 1 минуту и 36 секунд
kosmonaFFFt, можешь показать тоже самое в коде? или в псевдокоде.
PM WWW   Вверх
mes
Дата 26.7.2011, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  26.7.2011,  11:13 Найти цитируемый пост)
 // вопрос: для возвращаемых/принимаемых значений должен быть какой-то базовый тип? или использовать тот же Class?

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

Добавлено через 2 минуты и 14 секунд
Цитата(boostcoder @  26.7.2011,  11:13 Найти цитируемый пост)
известны во время компиляции в виде строки

я приводил примеры по динамическому, потому как в статике и так все типы известны и никаких доп. ухищрений не надо.. 


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


pattern`щик
****


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

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



Цитата(mes @  26.7.2011,  15:44 Найти цитируемый пост)
просьба не путать типы Object и Class.. если первый является базой для всех полиморфных типов, то второй метаинформация о классе..

о! понял smile 

mes, а по остальным вопросам что-нибудь ответите? ;)

Добавлено через 1 минуту и 14 секунд
еще нужно решить что нужно в интерфейсах Class и Object...

и этот момент мне все еще не понятен -
Цитата(boostcoder @  26.7.2011,  13:50 Найти цитируемый пост)
еще не понятно, как быть с объектами... create и invoke должны возвращать указатели?


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


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


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

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



все принимают и возвращают объекты, а Void :
Код

struct Void : Object {} ;




--------------------
PM MAIL 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.0650 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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