Методы реализации ООП на низком уровне?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Arthur, 4 мар 2007.

  1. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Доброе время суток.

    Хочу написать интерпретатор, который переводит синтаксис языка
    на fasm и уже fasm компилирует в программу. Язык естественно
    должен быть ООП.

    Я немного почитал теории о ООП, но это всего лишь теория, правда было там что то
    про tasm, но и этого мало.

    Понял я то что все классы, это те же самые структуры (еще ниже, простые метки), методы
    классов, формируются таким образом, что вместе с параметрами, также передается дополнительный
    параметер (указатель на класс, он и является this или self и т. п.), а все остальное как то смутно и непонятно :dntknw:

    Собственно интересующие вопросы:
    -Унаследование классов?
    -Как динамически создаются классы?
    -Как удаляются динам. классы?
    -Как реализуются массивы в классах?

    Я так понимаю что дин. классы создаются не без участия Heap'ов (кучь), но как реализуются? а
    как реализуются массивы в этих классах? Используют GlobalAlloc? или VirtualAlloc(непосредственно
    вместе с классом?)

    Желательно тиории + примеры на asm(если таковы имеются).
    Пишу под винду xp sp2.
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Arthur
    Возьми любой компилятор C++ и посмотри, как он все это делает. Собственно, и топик надо было назвать вроде как работает компилятор объектно-ориентированных языков на платформе...
     
  3. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    crypto мда что то я и забыл о том что многие C++, выдают листинг на асме, просто он у них ужасный получается :dntknw:

    Но все же может есть хорошие статьи с примерами на asm, как и все, зачем и почему :)
     
  4. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    Вот этот документ рассказывает о том, как реализовать ООП на чистом Си - а там уже можно и ассемблере похожий подход применить.
     
  5. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Блин видимо мне уже давным давно пора отложить изучения языков программирования, и начать учить английский :) Жаль что когда было время изучить не изучил :dntknw:

    Aquila
    За ссылку спасибо, попробую разобраться.

    crypto
    Когдато давным давно, на Borland C++, делал листинг, ужас, ща на VC++ 2005 Express Edition, зделал листинг, и подумал: лучше отказаться от написания программы, нежели изучать то что cl.exe там намудрил :) Это не asm listing, это hellasm listing :)
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    полное копирование методов и структуры кроме тех полей и методов, которые перегружаются. виртуальные вызывать по таблице, которая строится конструктором динамически.
    аллокация места + вызов конструктора или я не понял?
    а что тут такого7
    что ты понимаешь под динамическими классами?
     
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    <offtop>
    и ЭТО нормально компилится MASM'ом после небольшой правки...
    </offtop>
     
  8. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    RamMerLabs
    Нууу слушай, яж тебе не MASM :)

    Динамическое создание классов (экземпляров).
    К примеру:
    На fasm'e, создается section readable, туда записываются метки (классов, методов, структур, переменных)
    далее при создании экземпляра, создается аллокация в куче, теперь что туда копировать? как копировать? Или я чего то не догоняю?

    А собственно под динамическими классами, я понимаю классы, которые создаются в реал-тайме, а не заранее скомпилированными.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    может быть не класс, а объект?
    тогда просто динамическая аллокация места под описывающую его структуру в куче и вызов конструктора.
    конструктор по умолчанию будет создавать _vftable
     
  10. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Да именно Обьект (экземпляр класса).
    Как капировать обьект в кучу? Посредством самого fasm, или OS? и что копировать (переменные, методы, и т. д.)?

    _vftable - как это реализуемо на fasm, что есть виртуальный метод?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    HealAlloc'ом выделяешь столько памяти, чтобы сохранить там сами поля объекта + массив _vftable, длину которого можно посчитать из рассчета на то, что максимальная длина этого массива равна числу виртуальных методов * размер адреса (4 байта).
    Виртуальный метод - это метод, адрес которого задается не во время компиляции, а динамически во время выполнения.

    Классический пример на С++:
    Код (Text):
    1. class Parent
    2. {
    3. public: virtual void func() { cout << "Parent::func()" << endl; }
    4. };
    5.  
    6. class Child: public Parent
    7. {
    8. public: virtual void func() { cout << "Child::func()" << endl; }
    9. };
    10.  
    11. int main()
    12. {
    13.   Child* obj_c = new Child;
    14.   Parent* obj_p = (Parent*) obj_c;
    15.   obj_p->func();
    16.   delete obj_c;
    17. }
    Посколькку встретив конструкцию obj_p->func() компилятор не знает, какой реально метод мы хотим вызвать (не важно что указатель типа Parent*, объект-то типа Child). Поэтому это решается во время выполнения, а точнее определяющий код компилятор автоматом вставляет в конструктор класса.

    Вывод этого примера будет - Child::func()
    Если убрать ключевые слова virtual, вывод будет противоположный - Parent::func()
     
  12. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Блин этоже полиморфизм :) Тыкаюсь почучуть :)
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Inside C++ Object model, книжка такая есть.
     
  14. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Судя по название книги, она тоже на английском, а я даже с техническим плохо лажу, и поэтому вряд ли пойму что зачем и пачему :dntknw:

    Особо углубленная информация и не нужна, немного примеров желательно на asm, плюс простое обьяснение что да как (ну и на русском языке :), т. е. философия не к чему, хотя в ООП, это ох как.
     
  15. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Посмотри в пакете масма Object Creator в папке OOP.
     
  16. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    О ужас! Никто не знает как реализованы классы - а как же вы тогда программы пишете?!!!

    Итак! Класс обекта - Виртуальные методы:

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

    Экземпляр объекта:
    Выделяется (где угодно - хоть статически в данных определяйте) память под объект - для хранения всех определенных полей объекта. САМОЕ ГЛАВНОЕ - первое поле экземпляра объекта - это указатель на таблицу виртуальныъ методов.

    Как оно вызывается:
    В коде программы для вызова вируального метода объекта делаем:
    1) Получить адрес объекта (если вызывается из какой-то функции объекта - то это же первый ее параметр - адрес экземпляра объекта)
    2) Получить адрес таблицы виртуальных методов (это всегда первое поле в экземпляре объекта)
    3) Вызвать через таблицу виртуальных методов функцию номер Х (не забудьте передать и ей в качестве первого параметра ссылку на экземпляр объекта)

    Новая мода - динамические методы:

    Вся вышеприведенная кухня сохраняется с небольшими изменениями.

    Таблица динамических методов хранит номер динамического метода и его адрес. В таблице хранятся только определенные\переопределенные для этого класса динамичические методы
    Пусть первый элемент этой таблицы будет адрес на таблицу предка этого класса. Тогда запуск динамического метода выглядит так:
    1) Получить адрес объекта (если вызывается из какой-то функции объекта - то это же первый ее параметр - адрес экземпляра объекта)
    2) Получить адрес таблицы виртуальных методов (это всегда первое поле в экземпляре объекта)
    3)Поискать в таблице метод с номером Х. Если его нету, получить адрес таблицы динамических методов предка, и искать там. Повторять поиск во всех предках пока метод не будет найден (если вообще не найден - ну не делайте ничего).

    Кто такие конструктор и деструктор:

    Конструктор - выделение места под объект (вообще не обязательно, все зависит от реализации) и ИНИЦИАЛИЗАЦИЯ ПЕРВОГО ПОЛЯ ЭКЗЕМПЛЯРА ОБЪЕКТА - ССЫЛКИ НА ТАБЛИЦУ ВИРТУАЛЬНЫХ МЕТОДОВ.

    Деструктор - просто освобождение памяти от экземпляра объекта (тоже не обязательно, все зависит от реализации). Так что можно сказать что деструктор был придуман как противник конструктора :))
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Great
    Не слишком ли накладно для каждого экземпляра создавать свой массив ?
    Таблица виртуальных методов одинакова для всех экземпляров одного класса, поэтому не знаю как в C++, а в дельфи компилятор создает по одной таблице на каждый класс и при создании экземпляра объекта в него пишется только указатель на соотв.таблицу
     
  18. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    А вот теперь дайте мне понять:
    массив служащий для адресов виртуальных методов(_vftable), нужен только для того что бы определить с какого экземпляра класса вызывается ф-ция? Или еще для чего то она нужна?

    Вот создал кучу, вызвал аллокацию места под класс, а далее как теперь скопировать поля класса? Можно прямо адресоваться на тот адрес, который возвращает ф-ция HeapAlloc? Или какая то кухня еще и с этим?
    Если же HeapAlloc возвращает чистый адрес, тогда можно ли использовать сторовые каманды процессора, для копирования полей обьекта?

    Asvald
    У меня самая свежая версия из masm'a это версия 6.1, и нет там папки OOP, и Object Creator'a.
     
  19. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Я имел ввиду masm32
     
  20. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Arthur

    Занятно!
    Я реализую сейчас что-то очень похожее.

    На моём сайте есть статья про OOP на ассемблере (TASM code, правда).
    Посмотри, если интересно:

    http://www.codexxi.com/Articles.html

    Кстати, OOP в MASM32 не эффективен - таблица сделана динамически, в момент создания объекта. Лучше если таблица просто объявлена в сегменте данных и инициализирована в момент ассемблирования.