Мысленный эксперимент: ООП без классов

Персональный блог одноименного форумчанина. Человека и парохода, не побоюсь этого сравнения :)

Модератор: tyomitch

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 8:19

1. Большая. Функция (простая всем привычная функция) всегда имеет свой собственный кадр, с которым работает. Анон-метод с замыканиями может иметь свой собственный стековый кадр, а может работать со стековым кадром функции-парента, при условии что есть замыкания на переменные парента.

2. Зачем они мне?

3. Большая.

Ты так пишешь, как будто я собираюсь скомпилить твой код и гонять какие-то тесты. Нет, я его собираюсь просто читать.

* 3. Тогда не очень большая.


По поводу твоего примера мне представляется очевидным, что по второму вызову AnonCreator (хотя бы из JaMaCa) испортится кадр всех оставшихся с первого раза анонимных методов.


██ - как это вообще может произойти? Разве что при вызове AnonCreator из анонимного метода?

██ - объясни кто и кого (какая инструкция), по твоему, испортит.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 8:26

1. Детали реализации несущественны. Вызывающая сторона всегда кладёт параметры в стек, образуя новый кадр для любой вызываемой функции.

2. Не знаю, ты же сам просил :roll:

красное. Ну они же все глядят на одну и ту же переменную. Новый вход в AnonCreator => переменная поменялась => уже было отвязанные от родительского кадра анонметоды вдруг залезли во вновь созданный кадр

синее. это инструкция "mov [flag_AnonCreator], esp"

чёрное. я дописал в свой последний пост ещё одно замечание, видимо ты его не заметил
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 8:44

1. Да, но этот кадр (аргументы и адрес возврата всегда корректно убивается retn-ом)

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

Красное:
1) Они - кто?
2) На какую "одну и ту же" переменную?
3)
Новый вход в AnonCreator => переменная поменялась

Да, был 0, стал stack-pointer
уже было отвязанные от родительского кадра анонметоды вдруг залезли во вновь созданный кадр

С чего это? До входа в AnonCreator анонметоды работали с собственным стакфреймом. После выхода их AnonCreator они продолжают работать с собственным стакфреймом. А между этими двумя событиями анонметоды работают с валидным кадром AnonCreator-а, который ещё не был убит retn-ом.

Синее:
это инструкция "mov [flag_AnonCreator], esp"

А что в ней такого губительного? Она записывает вместо нуля значение регистра esp. Что в этом губительного?



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


Ещё мне кажется, что в строчке "mov [ebp-04], eax" обращение идёт не к XIAN, а к копии старого ebp, положенной в стек первой командой

ы?





Если ты об этом, то я это заметил, но забыл прокомментировать. В этом полностью с тобой согласен.

Этой инструкции:
Код: Выделить всё
add     ebp, 4                          ; /// Теперь в EBP то же что было в ESP при входе в анон-метод

там нафиг не надо

.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 9:25

1. Не возражаю. Это дело вызываемой функции, что с ним делать.
2. Её код не нужно писать.

"Они" -- экземпляры анонимного метода, создаваемые при разных вызовах AnonCreator. Они должны замкнуться на разные локальные переменные. (В этом и состоит их локальность.)
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 9:29

tyomitch
Так кодов анонимных методов может быть много?


Иными словами, при выполнении каждого AddressOf Delegate программа выделять память и копирует туда код анон-метода?? :?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 9:36

Код один, экземпляров много.
Экземпляры различаются замыканиями.
У меня это ссылка на объект-замыкание. Что это у тебя -- я так и не понял.

При создании обычного объекта же не приходится копировать код его методов? И здесь так же.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 9:42

У меня это ссылка на объект-замыкание. Что это у тебя -- я так и не понял.


У меня это адрес стекового кадра.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 9:45

Я не против. Но однако, что по поводу совместимости твоего кода с многократными вызовами AnonCreator?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 10:06

Но однако, что по поводу совместимости твоего кода с многократными вызовами AnonCreator?


Я пока не вижу никаких проблем с этим, если вызовы будут сделаны последовательно.

Если вызовы будут делаться рекурсивно (т.е. АнонКреатор вызывается из АнонКреатора, или откуда то ещё - не важно, в момент когда не завершилась какая-то ещё инстанция АнонКреатор-а) - то да, проблема будет.

Но проблема на данный момент не решаема, потому что я не знаю, на что должны замыкаться переменные в случае рекурсивного вызова: на самый первый экземпляр или же на самый последний?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 13:36

Хакер писал(а):
Но однако, что по поводу совместимости твоего кода с многократными вызовами AnonCreator?


Я пока не вижу никаких проблем с этим, если вызовы будут сделаны последовательно.

А я вижу.

При втором вызове портится (а именно, перезаписывается адресом нового стекового кадра) переменная flag_AnonCreator, после чего живой функтор от первого вызова неоправданно замыкается на кадр второго вызова.

Так?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 13:46

tyomitch
Странно, ася никак не показала, что от тебя пришло сообщение

При втором вызове портится (а именно, перезаписывается адресом нового стекового кадра) переменная flag_AnonCreator, после чего живой функтор от первого вызова неоправданно замыкается на кадр второго вызова.


А разве не так должно быть? :shock:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 19:05

Нет. На то локальные переменные и локальные, чтобы при каждом вызове функции они создавались заново (в стеке или где-нибудь ещё).

Пожалуйста, перечитай тот код, который я тебе предлагал для перевода. Там создаётся десять функторов, возвращающие значения от x+1 до x+10. Он понятный?

Если да, то пожалуйста, попытайся его перевести.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 19:35

На то локальные переменные и локальные, чтобы при каждом вызове функции они создавались заново (в стеке или где-нибудь ещё).


Вопрос был в другом. Изначально, вопрос стоял так: Почему код неправилен?

Тобою был дан следующий ответ:
При втором вызове портится (а именно, перезаписывается адресом нового стекового кадра) переменная flag_AnonCreator, после чего живой функтор от первого вызова неоправданно замыкается на кадр второго вызова.


Новый вопрос: Что есть первый вызов, а что есть второй? Какая разница между первым вызовом и всеми остальными вызовами?


Пожалуйста, перечитай тот код, который я тебе предлагал для перевода. Там создаётся десять функторов, возвращающие значения
от x+1 до x+10. Он понятный?

Тот код мне непонятен и, мягко говоря, не нравится. И я не возьмусь слёту его перевести.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 19:40

Первый вызов -- когда функцию вызывают в первый раз.
Второй вызов -- когда функцию вызывают во второй раз.
Ну, и на всякий случай:
Третий вызов -- когда функцию вызывают в третий раз.
:-)

Разница между любыми двумя вызовами в том, что у них разные стековые кадры.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 19:43

Ага. Мне представлялось что анон-метод замыкается на стековый кадр любого экземпляра функции (а не только первого), если он есть, а если его нету, замыкается на собственный стековый кадр, и получается, что его переменные становятся воистину локальными.

Где моё виденье твоих идей расходится с ними?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 20:05

Анон-метод замыкается на стековый кадр того вызова функции, в котором он создан (не обязательно первого), и не имеет никакой связи со всеми предшествующими или последующими вызовами.

Например, если при каждом вызове функции создаётся новый экземпляр анон-метода, как в твоём AnonCreator, то эти экземпляры замыкаются на разные стековые кадры своей внешней функции (каждый на свой).
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 20:15

tyomitch
В таком случае, мой код верный.


Для нерекурсивынх вызовов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 21:05

no wai!

Что, если изнутри второго вызова будет вызываться анон.метод, созданный при первом вызове? (Пример кода дать?)
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 21:14

Пример кода дать?


Код: Выделить всё
Public Delegate Sub Zupa()
Public MyFunctor as zupa

Public Sub AnonCreator(byval bFirst as boolean)
      dim LiLu as long
      dim Foo  as long
      iF bFirst Then
             Set MyFunctor = AddressOf Delegate
             Foo = Foo + 10     
             LiLu = LiLu - Foo
             End Delegate
      End if
      Call MyFunctor()
End Sub

AnonCreator True
AnonCreator False


пойдёт?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 21:36

Гм, слишком сложно.

Так хорошо?
Код: Выделить всё
Public Delegate Zupa() As Long
Public MyFunctor As Zupa

Public Sub AnonCreator(ByVal X As Long)
    If Not (MyFunctor Is Nothing) Then MsgBox MyFunctor()
    Set MyFunctor = AddressOf Delegate() As Long
        Delegate = X
    End Delegate
End Sub

AnonCreator 1
AnonCreator 2
AnonCreator 3


(Должно получиться два сообщения, "1" и "2".)
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 21:48

Не понимаю, откуда возьмутся 1 и 2. Я склонен считать, что получатся два сообщения "0" и "0".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.08.2007 (Вт) 22:12

Ну как, каждый создаваемый функтор замыкается на локальный X своей внешней функции.
А вот откуда возьмутся нули, я понять не могу.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 22:18

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

При выходе из внешней функции он "отмыкается".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.08.2007 (Ср) 8:42

Ещё раз: разные экземпляры анон-метода могут замыкаться на разные вещи.
А откуда возьмутся нули?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.08.2007 (Ср) 12:08

Ещё раз: разные экземпляры анон-метода могут замыкаться на разные вещи


Разумеется.

Объясняю:
AnonCreator 1
    В стек кладётся 1, делается вызов AnonCreator-а
    If Not (MyFunctor Is Nothing) Then MsgBox MyFunctor()
    МайФунктор действительно ещё установлен. Ничего не выполняется.
    Set MyFunctor = AddressOf Delegate() As Long
    Delegate = X
    End Delegate

    Функтор устанавливается на анон-метод. AnonMethod::X замыкается на AnonCreator::Argument[X].

    End Sub
    Выход из AnonCreator. Стековый кадр этого вызова разрушается, AnonMethod::X отмыкается от AnonCreator::Argument[X], потому как последний был в стековом кадре, который мы собираемся разрушить.

    Теперь AnonMethod::X замыкается уже не на стековый кадр AnonCreator-а, а на собственный стековый кадр (котого нет, но который обязательно появится, при вызове анон-метода), т.е. вообще не замыкается. AnonMethod::X становится неинициализированной локальной переменной анон-метода (а чем ей ешё быть?). В ней содержится 0 (а что ещё там может быть? при условии что стековый кадр чистится, хотя в моём коде этого нет).


AnonCreator 2
    В стек кладётся 2. Делается вызово AnonCreator-а.
    If Not (MyFunctor Is Nothing) Then MsgBox MyFunctor()
    МайФунктор действительн. Делается вызов АнонМетода:
      Delegate = X В eax копируется значение AnonMethod::X - напомню - AnonMethod::X уже ни-на что не замыкается, а является локальной переменной анон-метода со значением 0.
      End Delegate
      Происходит возврат из анон-метода в AnonCreator-2.
    Содержащийся в EAX ноль превращается в стринг и скармливается MsgBox-у.

    ....
    Далее создаётся новый экземпляр анон-метода, AnonMethod::X которого замыкается на аргумент АнонКреатера, сразу же "отмыкается" от него, превращаясь в просто-локальный-X-со-значением-0.

    ...


И история повторяется ещё раз, только с тройкой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.08.2007 (Ср) 12:13

Нет, после завершения внешнего метода функтор не размыкается, а продолжает работать с теми же самыми переменными. Они никогда не сбрасываются до тех пор, пока использующие их функции живы.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.08.2007 (Ср) 16:19

tyomitch
Путаешь опять функтор с анон-методом?

Иными словами, после выхода из функции-создателя замыкания убираются, но переменные не теряют свои значения, да (а точнее, размыкаются и превращаются в не просто локальные переменные, а локальные статические переменные)?

Тогда код несколько усложнится.

Но когда всё таки мир увидит продолжение топика?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.08.2007 (Ср) 16:31

Они не статические. Они свои у каждого экземпляра.

Продолжение запощу, как только кончатся вопросы по первой части.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.08.2007 (Ср) 16:34

tyomitch
C твоих слов они статические, потому что между вызовами анон-метода их значения сохраняются.

Нет?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.08.2007 (Ср) 16:54

По твоим понятиям, поля объекта тоже статические, раз сохраняются между вызовами его методов?
А то, что у каждого экземпляра они свои, это их статичности не мешает?
Изображение

Пред.След.

Вернуться в Tyomitch

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList