Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];

Вниз

Высокий/низкий уровень, ручное/автоматическое управление   Найти похожие ветки 

 
euru ©   (2010-12-02 11:38) [360]


> oxffff ©   (02.12.10 09:23) [358]

> Рассуждать о сферическом коне в вакууме сложно. Это действительно
> сложно. "нестыковки" могут быть выявлены только на практике.

Хорошо. Попробуем пойти этим путём. Жду описания операционной семантики языка.


 
oxffff ©   (2010-12-02 11:43) [361]


> euru ©   (02.12.10 11:38) [360]
>
> > oxffff ©   (02.12.10 09:23) [358]
>
> > Рассуждать о сферическом коне в вакууме сложно. Это действительно
>
> > сложно. "нестыковки" могут быть выявлены только на практике.
>
>
> Хорошо. Попробуем пойти этим путём. Жду описания операционной
> семантики языка.


Каком языке идет речь?
Это я и другие участники ждем, когда будет написано подробно что и как работает и какие используеются механизмы в языке в котором присутствуют только value типы. Чтобы попробовать поразмышлять над семантикой языка по его правилам в общем виде и попробовать найти нестыковки есть они есть.
Разве подругому?


 
euru ©   (2010-12-02 11:46) [362]


> Wogn   (02.12.10 09:38) [359]

> В противном случае, вы получите еще один SQL. Ну или Haskell,
>  если постараетесь.

Есть большая разница, что получить: ещё один SQL, Haskell или ещё один императивный язык?


> Убрав их, вы сделаете императивный язык противоестественным.

А, может быть, это и есть "новая идея"? :)


> А что до ссылок, то паттерн Maybe может быть просто встроенным
> в язык. Все ссылки - это ссылки Maybe, и программист просто
> будет вынужден всегда их обрабатывать.

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


 
Wogn   (2010-12-02 12:08) [363]

euru ©   (02.12.10 11:46) [362]

>Есть большая разница, что получить: ещё один SQL, Haskell или ещё один императивный язык?

Если вы программировали на Haskell или Clojure, то наверняка знаете какие нетривиальные мыслительные извороты приходится выполнять, чтобы остаться в рамках "immutable data structures". У вас есть только возможность конструирования и связывания, практически все то, что вы хотите оставить в своем гипотетическом императивном языке без явного управления памятью. Но я слабо понимаю, как вы себе представляете императивный язык, в котором есть только эти операции? В SQL, Haskell или Clojure, как вы понимаете, это возможно потому, что время жизни большинства переменных определяется исключительно лексическим контекстом (в Clojure можно использовать динамический контекст, для хранения данных которого используется TLS). Как такое провернуть в императивном языке?

>Лучше было бы вынудить компилятор это обрабатывать, сняв эту заботу с программиста. Я думаю, программисту найдётся, чем заняться в освободившееся от вынужденной обработки ссылок время.

А потом будете вопить: "Святая Дева, мне опять приходится создавать экземпляр объекта со значением "zzByk@nstwernnkt", чтобы выделять неинициализрованные значения. О Господи, он не эквивалентен экземпляру объекта с таким же именем, созданном в стороннем модуле, и моя логика из-за этого не работает!", "Эти чертовы разработчики языков отнимают у нас свободу! Вчера они отняли у нас возможность управлять памятью, а теперь лишили нас null! В топку эти их языки, создадим же свой новый язык с null и управлением памятью!"
Вы не цените свободу выбора, пока она у вас есть.


 
oxffff ©   (2010-12-02 12:20) [364]


> Wogn   (01.12.10 16:44) [354]
> А YAR, ну это надо же взять синтаксис Паскаля за основу.
>  Это покрытое пылью и плесенью наследие веков. Это надо
> "Паскаль с плюшечками" назвать.
> Весело, черт побери.


Кто то любит быть многословным, кто то кратким. Но главное в понимании.
Вопрос синтаксиса имеет большое отношение к семантике языка?


 
oxffff ©   (2010-12-02 12:25) [365]


> Wogn   (02.12.10 12:08) [363]
> euru ©   (02.12.10 11:46) [362]
>
> >Есть большая разница, что получить: ещё один SQL, Haskell
> или ещё один императивный язык?
>
> Если вы программировали на Haskell или Clojure, то наверняка
> знаете какие нетривиальные мыслительные извороты приходится
> выполнять, чтобы остаться в рамках "immutable data structures".
>  У вас есть только возможность конструирования и связывания,
>  практически все то, что вы хотите оставить в своем гипотетическом
> императивном языке без явного управления памятью. Но я слабо
> понимаю, как вы себе представляете императивный язык, в
> котором есть только эти операции? В SQL, Haskell или Clojure,
>  как вы понимаете, это возможно потому, что время жизни
> большинства переменных определяется исключительно лексическим
> контекстом (в Clojure можно использовать динамический контекст,
>  для хранения данных которого используется TLS). Как такое
> провернуть в императивном языке?


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


 
Wogn   (2010-12-02 13:11) [366]

oxffff ©   (02.12.10 12:25) [365]

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


 
jack128_   (2010-12-02 13:21) [367]


> п. Насколько я знаю, Delphi не позволяет этого делать, и
> замыкания в нем, это просто сорт сахара

начиная с 2009ой - есть.


 
jack128_   (2010-12-02 13:21) [368]

в смысле - позволяет -)


 
RWolf ©   (2010-12-02 13:54) [369]

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


 
Wogn   (2010-12-02 14:07) [370]

jack128_   (02.12.10 13:21) [367]

Нашел только анонимные процедуры. А метод Free у них наверняка тоже есть?

RWolf ©   (02.12.10 13:54) [369]

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


 
oxffff ©   (2010-12-02 14:10) [371]


> Wogn   (02.12.10 13:11) [366]
> oxffff ©   (02.12.10 12:25) [365]
>
> Замыкания хорошо работают, когда функция - это объект первого
> класса. То есть, замыкание захватывает лексический экстент
> в котором оно находится и его можно возвратить из него,
> и строить на нем ленивую логику и т.п. Насколько я знаю,
>  Delphi не позволяет этого делать, и замыкания в нем, это
> просто сорт сахара. А если в языке наличествуют замыкания
> и функции как объекты первого класса, то это уже, как минимум,
>  гибридный язык.
> А вот как вы, кстати, собираетесь делать замыкания и захват
> лексического экстента без кучи?


Видимо речь идет о первом порядке, а не о первом классе?
Я честно говоря не понял почему именно для функций первого порядка хорошо работают замыкания. Какие есть сложности для функций высших порядков?


 
Wogn   (2010-12-02 14:19) [372]

oxffff ©   (02.12.10 14:10) [371]

Имеется в виду function as a first-class object. Это просто означает, что функция может быть взята и присвоена переменной в качестве значения (при этом время ее жизни не зависит от контекста в котором она находится).
Насколько я знаком с замыканиями в Delphi - это просто локальные функции, которые могут использовать переменные из контекста в котором они находятся, но допустимость их использования, даже если указатели на них можно было бы получить, определяется временем существования контекста в котором они определены. Для функций как объектов первого класса такого ограничения нет.
Я могу ошибаться конечно, может быть в современных версиях Дельфи возможны функциональные замыкания, но как тогда производится управление памятью?


 
oxffff ©   (2010-12-02 14:19) [373]


> Wogn   (02.12.10 14:07) [370]
> jack128_   (02.12.10 13:21) [367]
>
> Нашел только анонимные процедуры. А метод Free у них наверняка
> тоже есть?
>
> RWolf ©   (02.12.10 13:54) [369]
>
> Если речь идет о функциональных замыканиях, то стек просто
> не задействуется. Если компилятор определяет, что эта функция
> будет возвращена как замыкание, то он помещает структуру
> данных, содержащую указатель на нее и память для переменных
> из захваченного ею окружения в кучу.


Анонимные методы - это еще одно название замыканий.
Явного метода Free у Delphi сlosures нет. Однако есть  семантика подсчета ссылок(однако при определенной сноровке может вызвать зацикливание).

Захват в замыканиих Delphi происходит по локации, а не значении.
Отсюда и известные проблемы например в цилках for. Но эта же проблема есть и у C#.

for i:=0 to 100 do
     begin
        a:=procedure abc;
        begin
        showmessage(inttostr(i));
        end;
     end;

Реализация также как и у всех: размещение вне в записи активации метода(например куча, или если активация методов не стековая(то есть при покидании метода, можно сохранить его состояние, то в его активации, а сама активация в куче)).


 
oxffff ©   (2010-12-02 14:24) [374]


> Wogn   (02.12.10 14:19) [372]
> oxffff ©   (02.12.10 14:10) [371]
>
> Имеется в виду function as a first-class object. Это просто
> означает, что функция может быть взята и присвоена переменной
> в качестве значения (при этом время ее жизни не зависит
> от контекста в котором она находится).
> Насколько я знаком с замыканиями в Delphi - это просто локальные
> функции, которые могут использовать переменные из контекста
> в котором они находятся, но допустимость их использования,
>  даже если указатели на них можно было бы получить, определяется
> временем существования контекста в котором они определены.
>  Для функций как объектов первого класса такого ограничения
> нет.
> Я могу ошибаться конечно, может быть в современных версиях
> Дельфи возможны функциональные замыкания, но как тогда производится
> управление памятью?


Есть функциональные замыкания.
Захваченные переменные будут размещены в куче.


 
Wogn   (2010-12-02 14:25) [375]

oxffff ©   (02.12.10 14:19) [373]

>Анонимные методы - это еще одно название замыканий.

Это конечно буквоедство, но замыканием называется именно захват окружения. А анонимные методы, это анонимные методы.

А на счет анонимных методов в Дельфи стоит еще покопать, это интересно. Вижу, постепенно язык тоже обзаводится хромыми костылями.


 
euru ©   (2010-12-02 14:30) [376]


> oxffff ©   (02.12.10 11:43) [361]

> Каком языке идет речь?

Прошу прощения. Возникло небольшое недопонимание. :)

Целостного описания семантики языка у меня нет, есть только идеи. Одна из них: представлять все типы в языке с точки знения программиста как значимые. Что это даёт? Например:
- упрощение языка в связи с отсутствием понятия ссылок и указателей;
- отсутствие проблемы утечки памяти.
Собственно, по ходу обсуждения я обо всём этом уже говорил. Если что-то непонятно, задавайте вопросы.


 
oxffff ©   (2010-12-02 14:34) [377]


> euru ©   (02.12.10 14:30) [376]
>
> > oxffff ©   (02.12.10 11:43) [361]
>
> > Каком языке идет речь?
>
> Прошу прощения. Возникло небольшое недопонимание. :)
>
> Целостного описания семантики языка у меня нет, есть только
> идеи. Одна из них: представлять все типы в языке с точки
> знения программиста как значимые. Что это даёт? Например:
>
> - упрощение языка в связи с отсутствием понятия ссылок и
> указателей;
> - отсутствие проблемы утечки памяти.
> Собственно, по ходу обсуждения я обо всём этом уже говорил.
>  Если что-то непонятно, задавайте вопросы.


Тогда если нет ссылок и указателей, как создать например двунаправленный связный список?
Или все таки все типы значимые, но cкрыто(неявно) ссылочные?


 
oxffff ©   (2010-12-02 14:36) [378]


> Wogn   (02.12.10 14:25) [375]
> oxffff ©   (02.12.10 14:19) [373]
>
> >Анонимные методы - это еще одно название замыканий.
>
> Это конечно буквоедство, но замыканием называется именно
> захват окружения. А анонимные методы, это анонимные методы.
>


Это конечно буквоедство, однако

http://en.wikipedia.org/wiki/Closure_(computer_science)

In computer science, a closure is a first-class function with free variables that are bound in the lexical environment.


 
euru ©   (2010-12-02 14:48) [379]


> oxffff ©   (02.12.10 14:34) [377]

> Или все таки все типы значимые, но cкрыто(неявно) ссылочные?

Именно.


 
Wogn   (2010-12-02 14:55) [380]

oxffff ©   (02.12.10 14:36) [378]

Где там написано про анонимность? Вас это беспокоит, вы хотите поговорить об этом? Вот, например:


(defun fun1 (arg1 arg2)
 (* arg1 arg1 arg2))

(defun fun1-bind (arg1)
 (curry fun1 arg1))


Где же здесь анонимные функции и иже с ними?


 
Wogn   (2010-12-02 15:15) [381]

euru ©   (02.12.10 14:48) [379]

Помнится кое-кто из майкрософта пытался такое сделать. И что в результате получилось? Автобоксинг с кучей подводных камней? Явная реализация методов интерфейсов, способная существовать совместно с одноименными методами классов? Nullable объекты? Вы хотите эффективности при этом? У вас уже есть решения этих проблем?


 
oxffff ©   (2010-12-02 15:16) [382]


> Wogn   (02.12.10 14:55) [380]


Про буквоедство не я начал. Ответил Вам в Вашем стиле.
Обижаетесь?
Тогда начните плакать

anonymous method

As the name suggests, an anonymous method is a procedure or function that does not have a name associated with it. An anonymous method treats a block of code as an entity that can be assigned to a variable or used as a parameter to a method. In addition, an anonymous method can refer to variables and bind values to the variables in the context in which the method is defined. Anonymous methods can be defined and used with simple syntax.
They are similar to the construct of closures defined in other languages.


 
Wogn   (2010-12-02 15:25) [383]

oxffff ©   (02.12.10 15:16) [382]

Ну здесь остается только сказать, что анонимный метод может не быть замыканием. (map #"(lambda (x) (+1 x)) "(1 2 3)). Где здесь замыкание? Я надеюсь, после этого, все вопросы снимаются? Честно говоря, я не понимаю, откуда они это взяли. Вы сами-то в это верите?


 
oxffff ©   (2010-12-02 15:25) [384]


> Wogn   (02.12.10 15:15) [381]
> euru ©   (02.12.10 14:48) [379]
>
> Помнится кое-кто из майкрософта пытался такое сделать. И
> что в результате получилось? Автобоксинг с кучей подводных
> камней? Явная реализация методов интерфейсов, способная
> существовать совместно с одноименными методами классов?
> Nullable объекты? Вы хотите эффективности при этом? У вас
> уже есть решения этих проблем?


А можно о сложностях в деталях?


 
oxffff ©   (2010-12-02 15:29) [385]


> Wogn   (02.12.10 15:25) [383]
> oxffff ©   (02.12.10 15:16) [382]
>
> Ну здесь остается только сказать, что анонимный метод может
> не быть замыканием. (map #"(lambda (x) (+1 x)) "(1 2 3)).
>  Где здесь замыкание? Я надеюсь, после этого, все вопросы
> снимаются? Честно говоря, я не понимаю, откуда они это взяли.
>  Вы сами-то в это верите?


Я не владею надстройкой над лямбда исчислениям в виде функционального языка.
Мне более понятнее будет в нотации лямбда исчисления или своими словами. Это возможно?


 
oxffff ©   (2010-12-02 15:45) [386]


> Wogn   (02.12.10 15:25) [383]
> oxffff ©   (02.12.10 15:16) [382]
>
> Ну здесь остается только сказать, что анонимный метод может
> не быть замыканием. (map #"(lambda (x) (+1 x)) "(1 2 3)).
>  Где здесь замыкание? Я надеюсь, после этого, все вопросы
> снимаются? Честно говоря, я не понимаю, откуда они это взяли.
>  Вы сами-то в это верите?


Прочитал про map и космический синтаксис.
Какие вопросы снимаются?  У кого вопросы?

Насколько я знаю есть возможность создания функции run-time c захватом свободных переменных. Такая функция называется замыканием.
В императивных языках существует схожая возможность называемая анонимным методом. Хотите захватывайте контекст, хотите нет.


 
Wogn   (2010-12-02 15:56) [387]

oxffff ©   (02.12.10 15:25) [384]

Если вы хотите эффективности, то вы будете использовать стек для value-объектов и будете остерегаться передавать объекты по значению. Но если нет семантики ссылок, то как передавать по ссылке value объекты? Как использовать полиморфизм? Автобоксинг/анбоксинг приходит на помощь. Вы создаете объект ссылочного тип из value-типа в куче и пользуетесь всеми прелестями. Но при этом возникает еще и куча подводных камней. Если value тип реализует интерфейс, то объекты этого типа при вызове методов интерфейса должны бокситься/анбокситься, прощай производительность. Более того, вы можете даже не подозревать когда объект боксится, а когда не боксится, вызывая метод напрямую у объекта, или у ссылки на объект (у ссылки-то понятное дело, всегда боксится, а вот у объекта может и не бокситься, так как в C# есть возможность явного описания интерфейсов, и явно описанные методы будут работать, только тогда, когда вызываются по ссылке на интерфейс). И наконец, как вы будете присваивать null value типам? Вам придется создать специальную оберкту (Nullable тип), который будет хранить информацию о том, не null ли объект? Да прочтите CLR via С#, и еще не такое увидите. null не нужен? Каковы же альтернативы null-у? Знаете ли вы какие подводные камни скрываются в альтернативах?

oxffff ©   (02.12.10 15:45) [386]

Ну если заниматься буквоедством дальше, то:

1. Замыкание - это ни что иное как захват окружения и оно может не возвращать функцию как результат, например, следующий код использует замыкание, но не возвращает ничего, определяя именованную top-level функцию add-1, которая захватывает переменную a.

(let (a 1)
 (defun add-1 (arg)
   (+ arg a))
 (values))

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


 
oxffff ©   (2010-12-02 16:18) [388]


> Wogn   (02.12.10 15:56) [387]
> oxffff ©   (02.12.10 15:25) [384]
>
> Если вы хотите эффективности, то вы будете использовать
> стек для value-объектов и будете остерегаться передавать
> объекты по значению. Но если нет семантики ссылок, то как
> передавать по ссылке value объекты? Как использовать полиморфизм?
>  Автобоксинг/анбоксинг приходит на помощь. Вы создаете объект
> ссылочного тип из value-типа в куче и пользуетесь всеми
> прелестями. Но при этом возникает еще и куча подводных камней.
>  Если value тип реализует интерфейс, то объекты этого типа
> при вызове методов интерфейса должны бокситься/анбокситься,
>  прощай производительность. Более того, вы можете даже не
> подозревать когда объект боксится, а когда не боксится,
> вызывая метод напрямую у объекта, или у ссылки на объект
> (у ссылки-то понятное дело, всегда боксится, а вот у объекта
> может и не бокситься, так как в C# есть возможность явного
> описания интерфейсов, и явно описанные методы будут работать,
>  только тогда, когда вызываются по ссылке на интерфейс).
>  И наконец, как вы будете присваивать null value типам?
> Вам придется создать специальную оберкту (Nullable тип),
>  который будет хранить информацию о том, не null ли объект?
>  Да прочтите CLR via С#, и еще не такое увидите. null не
> нужен? Каковы же альтернативы null-у? Знаете ли вы какие
> подводные камни скрываются в альтернативах?
>


А внимательно читали Рихтера сами?
Про вызов интерфейсных методов у value типов?
Насколько мне помнится при вызове интерфейсного метода объект не боксится С#(вообщем ILdasm в помощь), а используется некий трюк комиплятора использующий управляемый указатель на поле активации метода(ссылка на локальную переменную).


> oxffff ©   (02.12.10 15:45) [386]
>
> Ну если заниматься буквоедством дальше, то:
>
> 1. Замыкание - это ни что иное как захват окружения и оно
> может не возвращать функцию как результат, например, следующий
> код использует замыкание, но не возвращает ничего, определяя
> именованную top-level функцию add-1, которая захватывает
> переменную a.
>
> (let (a 1)
>  (defun add-1 (arg)
>    (+ arg a))
>  (values))
>
> 2. Под анонимными функциями подразумевается синтаксис для
> определения функций, но они могут не использовать замыкания
> (но так как являются функциями первого класса, могут и использовать).
>


Я не даю свои определения, а использую общепризнанные.


 
oxffff ©   (2010-12-02 16:18) [389]


> объект не боксится


value тип не боксится


 
jack128_   (2010-12-02 16:25) [390]


> а используется некий трюк комиплятора использующий управляемый
> указатель на поле активации метода(ссылка на локальную переменную).
>  

какой трюк то??
int i = 10;
....
MessageBox.Show(i.ToString());

i - struct, поэтому не может наследоваться, поэтому ToString нельзя переопределить, поэтому компилятор просто вызывает конкретный метод Int32.ToString


 
Wogn   (2010-12-02 16:27) [391]

oxffff ©   (02.12.10 16:18) [389]

Ну во всяком случае, в последнем издании С# via CLR, на странице 332 явно написано, что: "Value type instances are boxed when cast to an interface". Если приведете ссылку на опровержение, буду благодарен.


 
oxffff ©   (2010-12-02 16:32) [392]


> jack128_   (02.12.10 16:25) [390]
>
> > а используется некий трюк комиплятора использующий управляемый
>
> > указатель на поле активации метода(ссылка на локальную
> переменную).
> >  
>
> какой трюк то??
> int i = 10;
> ....
> MessageBox.Show(i.ToString());
>
> i - struct, поэтому не может наследоваться, поэтому ToString
> нельзя переопределить, поэтому компилятор просто вызывает
> конкретный метод Int32.ToString


Конечно это не трюк, а просто правильный анализ.


 
jack128_   (2010-12-02 16:32) [393]


> "Value type instances are boxed when cast to an interface"

кастятся они, куда им деваться то??


 
oxffff ©   (2010-12-02 16:36) [394]


> Wogn   (02.12.10 16:27) [391]
> oxffff ©   (02.12.10 16:18) [389]
>
> Ну во всяком случае, в последнем издании С# via CLR, на
> странице 332 явно написано, что: "Value type instances are
> boxed when cast to an interface". Если приведете ссылку
> на опровержение, буду благодарен.


Постойте.
Речь идет о вызове интерфесного метода у value типа. А не о casting.
Для casting - box необходим, для гарантии того что ссылка на значение будет действительна, если интерфейс "переживет" вызов метода.


 
oxffff ©   (2010-12-02 16:41) [395]


> jack128_   (02.12.10 16:25) [390]
>
> > а используется некий трюк комиплятора использующий управляемый
>
> > указатель на поле активации метода(ссылка на локальную
> переменную).
> >  
>
> какой трюк то??
> int i = 10;
> ....
> MessageBox.Show(i.ToString());
>
> i - struct, поэтому не может наследоваться, поэтому ToString
> нельзя переопределить, поэтому компилятор просто вызывает
> конкретный метод Int32.ToString


Не совсем так, то что ты описал используется при вызове call или callvirt.
Поскольку значение будет жить в момент вызова его можно вызвать напрямую минуя box обертку.


 
jack128_   (2010-12-02 16:45) [396]


>
> Не совсем так, то что ты описал используется при вызове
> call или callvirt.

а что ты имел в виду? пример кода мона?


 
oxffff ©   (2010-12-02 16:55) [397]


> jack128_   (02.12.10 16:45) [396]
>
> >
> > Не совсем так, то что ты описал используется при вызове
>
> > call или callvirt.
>
> а что ты имел в виду? пример кода мона?


Допустим есть объект TSomeA и он помечен как final. Есть переменная

A:TSomeA;

при вызове А.VirtualMethod(), поскольку после A не содержит подтипов, то можно вызвать прямой вызов вместо виртуального, что положительно отразится на скорости. По идее можно вызывать и последний перекрытый родительский виртуальный метод, если он не перекрыт в TSomeA.

Вместо

.ldloc a
.callvirt .. TSomeA.VirtualMethod ..

Будет прямой вызов минуя VMT.

.ldloc a
.call .. TSomeA.VirtualMethod ..

Вроде этот мини финт пошел c JAVA.


 
jack128_   (2010-12-02 16:58) [398]


> oxffff ©   (02.12.10 16:55) [397]

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


 
oxffff ©   (2010-12-03 08:53) [399]


> jack128_   (02.12.10 16:58) [398]
>
> > oxffff ©   (02.12.10 16:55) [397]
>
> это то, что я описал.  а в каком случае будет использоваться
> твой
> некий трюк комиплятора использующий управляемый указатель
> на поле активации метода
> ?


Подумал. Посмотрел Рихтера(не нашел я этого в нем.
Однако в памяти осталось что именно упаковка не происходит в ассоциации методов интерфейса). Опять подумал.

Доводы против

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

Boxed value type cостоит из

--> служебное поле
   поля Boxed value type

Managed pointer to value type

--> поля Boxed value type

Соответственно если в теле метода интерфейса трактовать context как managed pointer to value type, то все будет OK, с одной сложностью, что в вызове через интерфейс через boxed value type, в него передаваться будет уже boxed value type с его содержимым, поскольку помимо методов интерфейса можно дергать и методы object например ToString, который виртуален и вызывается соответственно,и который физически(boxed value type) отличен от содержимого по Managed pointer to value type.
Возникает не соответствие.

Доводы за
Однако это препятствие можно было бы преодолеть по моему мнению, если использовать небольшие трюки

1. Есть две копии методов для интерфейса для value type
  (очень маловероятно)
2. При вызове через интерфейс boxed value type преобразуется через stub в managed pointer to value type. Должно поддерживаться не на уровне языка, а на уровне .NET.
 А тело метода интерфейса для value type использует в качестве контекста managed pointer to value type.


 
DiamondShark ©   (2010-12-03 18:02) [400]


> oxffff ©   (03.12.10 08:53) [399]

ILdasm откроет истину.



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 вся ветка

Форум: "Прочее";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.12 MB
Время: 0.082 c
1-1248801245
Sergey
2009-07-28 21:14
2011.03.20
Ищу функцию, чтобы рисовать на картинке формулы с дробью


15-1291268467
JohnKorsh
2010-12-02 08:41
2011.03.20
Можно ли извлечь процедуры и функции из драйвера.


8-1208898067
Музыкант
2008-04-23 01:01
2011.03.20
Циклическое проигрывание midi-файла без разрывов в звучании


1-1249315691
sunnmas
2009-08-03 20:08
2011.03.20
узнать о завершении потока


15-1291296907
TP
2010-12-02 16:35
2011.03.20
Turbo Pascl & реестр





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский