Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>Теперь Вы можете вызывать любую процедуру из загруженной DLL. Но сама DLL не может вызывать Ваши процедуры. Вы ее можете, а она Ваши не может. Так вот с помощью процедурных переменных можно сделать так, чтобы и загруженная Вами DLL тоже могла вызывать Ваши процедуры. Чтоб симметрично было.
Д>Если она тоже будет следовать принятым соглашениям, то сможет — никаких принципиальных проблем я здесь не вижу.
Каким соглашениям? Ваша программа загрузила DLL-ку, а не DLL-ка загрузила Вашу программу.
Д>С# тоже прекрасно обходится делегатами Только не надо говорить, что это те же самые указатели на функции — на самом деле это совсем другая вещь. Хотя где-то внутри указатели вероятно используются.
Почему только не надо говорить? Вы прям процедурных переменных, как буд-то бы боитесь.
type
MyProcedure = procedure(s: string) of object;
MyObject = class
procedure DoSmth(s: string);
end;
var
A : MyObject;
A_DoSmth: MyProcedure;
...
A_DoSmth := A.DoSmth;
A_DoSmth('привет!'); // эквивалентно A.DoSmth('привет!');
Кодт:
> ПК> Скажем, в том же Паскале указатели были ближе к ссылкам в Шарпе, чем к указателям в C++. Если я, конечно, еще не окончательно Паскаль забыл
> Указатели С/С++ точно такие же, как в Паскале, а адресная арифметика — приятный бонус
А можно, в таком случае, сформулировать отличия между указателями в Паскале и ссылками в C#/Java, естественно, игнорируя сборку мусора, каковой в Паскале не было?
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
VD>Еще раз повторю свою мысль, так как она до сих пор так и не была понята: VD>В современных языках программирования не используется парадигма указателя. Вместо нее используется парадигма ссылочных- и влэлью-типов. Причем в том же Шарпе указатели оставлены в небезопасном режиме, вот только для повседневной работы они ненужны. И прежде чем учить чему-то других, нужно самому понять принципиальную разницу этих взглядов.
Это смотря у кого какая повседневная жизнь. Глядя на исходники классов Net там указатели кишат в огромных количествах.
Правда для них и унсейв не указ.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Курилка, Вы писали:
К>>Объясни — чем ты меряешь мощность языка? Ваттметром?
СГ>Формального определения не дам. Дам интуитивное. Мощностью ЯВУ я называю количество вариантов разных программ, которые на нем можно написать. Например, интуитивно понятно, что если убрать из ЯВУ указатели, ссылки и оператор NEW, то на таком ЯВУ нельзя будет написать ни одной программы работающей с динамическими структурами данных, то есть размерность пространства всевозможных программ, которые можно написать на таком ЯВУ уменьшиться. Я употребляю слово "мощность", чтобы обозвать, хм, эту штуковину.
Не, две ошибки
1. И без указателей прекрасно можно писать динамические структуры данных — есть даже книжка про такие на Яве.
2. Количество программ от изымания — не уменьшится. Один хрен — бесконечное количество, как правильных, так и неправильных. В этом смысле все языки эквивалентны — равномощны.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Павел Кузнецов, Вы писали:
>> Указатели С/С++ точно такие же, как в Паскале, а адресная арифметика — приятный бонус
ПК>А можно, в таком случае, сформулировать отличия между указателями в Паскале и ссылками в C#/Java, естественно, игнорируя сборку мусора, каковой в Паскале не было?
Э... "отличия те же, что и между указателями в Си и ссылками в C#|Java"
Здравствуйте, Зверёк Харьковский, Вы писали:
A>>Примерно это мне всегда хотелось сказать тому, кто придумывал Perl... ЗХ>Не флейма ради, а самообразования для: например? ЗХ>(Еще раз: я не собираюсь спорить. Мне действительно интересно Ваше мнение.)
Кодт:
>>> Указатели С/С++ точно такие же, как в Паскале, а адресная арифметика — приятный бонус
> ПК> А можно, в таком случае, сформулировать отличия между указателями в Паскале и ссылками в C#/Java, естественно, игнорируя сборку мусора, каковой в Паскале не было?
> Э... "отличия те же, что и между указателями в Си и ссылками в C#|Java"
И в чем они, если отбросить сборку мусора и адресную арифметику, которой в Паскале, если я правильно помню, не было?
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Кодт:
>>>> Указатели С/С++ точно такие же, как в Паскале, а адресная арифметика — приятный бонус
>> ПК> А можно, в таком случае, сформулировать отличия между указателями в Паскале и ссылками в C#/Java, естественно, игнорируя сборку мусора, каковой в Паскале не было?
>> Э... "отличия те же, что и между указателями в Си и ссылками в C#|Java"
ПК>И в чем они, если отбросить сборку мусора и адресную арифметику, которой в Паскале, если я правильно помню, не было?
В паскале была адресная арифметика, но не в явном виде, а через приведения типа pointer к integer
Здравствуйте, Сергей Губанов, Вы писали: СГ>В С# или в Java основным является ReferenceType = POINTER TO RECORD. А, видимо, из аналогий с Си++, Вы посчитали, что PointerType = POINTER TO ValueType; есть что-то опасное, хотя это не имеет отношения к адресам и управляется сборщиком мусора и абсолютно безопасно. В C# и Java есть value-type и есть refernce-type, а в Обероне в добавок к этому еще есть совершенно безопасный управляемый сборщиком мусора pointer-type. Кстати, из-за того что pointer-type нет в C#, там ввели такой изврат как Boxing/Unboxing.
1. В C# есть pointer-type. Как тебе уже неоднократно сказали.
2. Boxing/Unboxing никак не связан с отсутствием или наличием поинтеров (что особенно очевидно в свете 1).
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
rockandroll:
>>> Э... "отличия те же, что и между указателями в Си и ссылками в C#|Java"
> ПК> И в чем они, если отбросить сборку мусора и адресную арифметику, которой в Паскале, если я правильно помню, не было?
> В паскале была адресная арифметика, но не в явном виде, а через приведения типа pointer к integer
Если я не ошибаюсь, это не Паскаль, а его расширения от фирмы Борланд aka Turbo-Pascal. Впрочем, настаивать не буду: точно уже не помню. Да и не важно это, т.к. не адресная это арифметика, а арифметика целых В любом случае, мне было интересно услышать именно о тех радикальных семантических отличиях ссылок от указателей, на существовании которых так настаивали большевики Без привязки к определению какого-либо конкретного языка, а именно каких-то существенных "обще-программистских" отличиях, позволяющих говорить о "разнице во взгляде на жизнь".
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Каким соглашениям? Ваша программа загрузила DLL-ку, а не DLL-ка загрузила Вашу программу.
А какая разница, кто кого загрузил? Загрузчик может вызвать любой необходимый код инициализации у каждой загруженной DLL.
Я так понял — с COM ты никогда не работал.
СГ>Почему только не надо говорить? Вы прям процедурных переменных, как буд-то бы боитесь.
Они плохи, как и любой указатель. Хотя начиналось все с того, что я сказал — указатель на функцию тоже не является необходимым для ЯВУ типом и при некотором желании без него можно обойтись. Прекрасным примером могут служить COM и .NET
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>В любом случае, мне было интересно услышать именно о тех радикальных семантических отличиях ссылок от указателей, на существовании которых так настаивали большевики Без привязки к определению какого-либо конкретного языка, а именно каких-то существенных "обще-программистских" отличиях, позволяющих говорить о "разнице во взгляде на жизнь".
Указатель — это адрес некоторой области в памяти. Он может быть и чем-то более сложным, чем просто адрес, как например __closure в BCB. Но задача его от этого не меняется — указывать на какой-то участок памяти. Иными словами, это — понятие уровня реализации.
Ссылка указывает не на участок памяти, а на объект. Такое понятие как "память" здесь вообще не фигурирует. Именно поэтому не имеет смысла такая вещь как "арифметика ссылок" Понятие ссылки просто находится на более высоком уровне абстракции.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>rockandroll:
>>>> Э... "отличия те же, что и между указателями в Си и ссылками в C#|Java"
>> ПК> И в чем они, если отбросить сборку мусора и адресную арифметику, которой в Паскале, если я правильно помню, не было?
>> В паскале была адресная арифметика, но не в явном виде, а через приведения типа pointer к integer
ПК>Если я не ошибаюсь, это не Паскаль, а его расширения от фирмы Борланд aka Turbo-Pascal. Впрочем, настаивать не буду: точно уже не помню. Да и не важно это, т.к. не адресная это арифметика, а арифметика целых В любом случае, мне было интересно услышать именно о тех радикальных семантических отличиях ссылок от указателей, на существовании которых так настаивали большевики Без привязки к определению какого-либо конкретного языка, а именно каких-то существенных "обще-программистских" отличиях, позволяющих говорить о "разнице во взгляде на жизнь".
Согласен. Принципиальных различий между ссылками и указателями (если не брать во внимание GC) я тоже не вижу. Может кто-нибудь видит?
), то вроде как с COM-ом я знаком. Но с другой стороны, я их использовал только в рамках одного приложения....
СГ>>Почему только не надо говорить? Вы прям процедурных переменных, как буд-то бы боитесь.
Д>Они плохи, как и любой указатель. Хотя начиналось все с того, что я сказал — указатель на функцию тоже не является необходимым для ЯВУ типом и при некотором желании без него можно обойтись. Прекрасным примером могут служить COM и .NET
А указатель на функцию — это всего лишь одна из возможных реализаций процедурной переменной. COM-интерфейс — это другая из возможных реализаций. Делегаты — еще одна из возможных реализаций процедурной переменной.
с которого началась наша дисскусия о процедурных переменных:
Здравствуйте, Сергей Губанов, Вы писали:
СГ>А что есть ООП? В узком смысле, ООП-ом можно обозвать процедурные переменные. Процедурные переменные (или в терминологии Си/Си++ — указатели на функцию) добавляют мощности языку (динамический полиморфизм). Кстати в самом первом обероне виртуальных функций не было, полиморфизм достигался благодаря процедурным переменным, тем не менее язык являлся ОО языком. Что касается расширения типов (наследования), наверное, напрямую мощность языка от этого не увеличивается (хотя утверждать этого не буду), но зато это позволяет сохранить в языке строгую статическую типизацию одновременно как бы и нарушая ее в каком-то более высоком смысле...
Указатели на функции тоже не являются абсолютно необходимыми. Их при желании можно заменить на большой такой switch, который в зависимости от полученного числа будет вызывать разные функции. Значит, они тоже не добавляют языку "мощности"?
То же самое касается и наследования. С помощью copy-paste и такой-то матери без него тоже можно прекрасно обойтись
Ну и в чем, собственно, смысл дискуссии? switch-ем не заменишь, а COM интерфейс — это и есть (много)процедурная переменная.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>rockandroll:
>>>> Э... "отличия те же, что и между указателями в Си и ссылками в C#|Java"
>> ПК> И в чем они, если отбросить сборку мусора и адресную арифметику, которой в Паскале, если я правильно помню, не было?
>> В паскале была адресная арифметика, но не в явном виде, а через приведения типа pointer к integer
ПК>Если я не ошибаюсь, это не Паскаль, а его расширения от фирмы Борланд aka Turbo-Pascal. Впрочем, настаивать не буду: точно уже не помню. Да и не важно это, т.к. не адресная это арифметика, а арифметика целых В любом случае, мне было интересно услышать именно о тех радикальных семантических отличиях ссылок от указателей, на существовании которых так настаивали большевики Без привязки к определению какого-либо конкретного языка, а именно каких-то существенных "обще-программистских" отличиях, позволяющих говорить о "разнице во взгляде на жизнь".
Если разложить по полочкам отдельно
1) адрес
2) указатель (указатель это не адрес!)
3) ссылка
то указатель отличается от ссылки тем, что указатель может быть связан с объектом, а может быть не связан с объектом, то есть быть равным NIL. В то время как ссылка всегда связана с объектом, не бывает ссылок не связанных с объектом. Именно поэтому операция проверки ссылки на NIL не имеет смысла — любое обращение к ссылке есть обращение к объекту. Ссылка прозрачна для программиста.
TYPE
MyRecord = RECORD(* ... *)END;
PROCEDURE Proc(VAR t: MyRecord); (* t - передается по ссылке, обращение к t есть обращение к переменной типа MyRecord, нельзя проверить t # NIL *)
Однако, в языках С# и Java под ссылкой (refernce) и указателем (pointer) понимают совсем другое. В этих языках ссылкой называют то, что выше я назвал указателем, а указателем в них называют то, что выше я назвал адресом. Ссылок в вышеизложенном смысле в них нет.
LVV>2. Количество программ от изымания — не уменьшится. Один хрен — бесконечное количество, как правильных, так и неправильных. В этом смысле все языки эквивалентны — равномощны.
Хорошо, скажем так: уменьшается размерность пространства всевозможных программ.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Да это как посмотреть. В Delphi, например, COM-интерфейсы интегрированы в сам язык, и так как я их постоянно использую (смотри, например, это: http://www.rsdn.ru/Forum/Message.aspx?mid=822951&only=1
), то вроде как с COM-ом я знаком. Но с другой стороны, я их использовал только в рамках одного приложения....
Вот я и вижу, что знаний о принципах его работы у тебя нет никаких.
СГ>А указатель на функцию — это всего лишь одна из возможных реализаций процедурной переменной. COM-интерфейс — это другая из возможных реализаций. Делегаты — еще одна из возможных реализаций процедурной переменной.
Чушь. Это совершенно разные вещи, хотя цель их применения действительно одна.
СГ>Ну и в чем, собственно, смысл дискуссии? switch-ем не заменишь, а COM интерфейс — это и есть (много)процедурная переменная.
Свитчем они могут заменены безо всяких проблем, ты просто не хочешь или не в состоянии это понять. Хотя, если брать исключительно абстрактное понимание, предложенный мной вариант тоже можно назвать в некотором роде процедурной переменной, хотя там и не используется указатель.
Но можно подойти к вопросу и с другой стороны. Как насчет функторов?
Как насчет декларативных языков, ФП и ЛП? Вероятно, их тоже не должно существовать, если там нет процедурных переменных?
Ну так я тебя огорчу — они существуют и прекрасно себя чувствуют.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, VladD2, Вы писали:
VD>>Моежт сам таки запонишь и не будшь потом рассказывать, что в Яве или Шарпе переменная — это указатель?
СГ>Ссылка отличается от указателя тем, что она совершенно прозрачна для программиста.
+1
СГ> Указатель можно проверить на NIL, а ссылку нельзя проверить на NIL,
Неверное утверждение. Не нужно путать ссылки в С++ и ссылки в целом. Я уже какжется давал тут ссылку на Википедию. Там было все подробно рассмотрено.
СГ> так как любое обращение к ссылке полностью равноценно обращению к самому объекту на который она ссылается. Вы просто используете термин "ссылка" обзывая им указатели в Java и в C#.
Я просто использую терминалогию создателей языка, которая в свою очередь базируется на общепринятой терминалогии.
Основная разница ссылки и указателя состоит в том, что ссылку не нужно разыменовывать и со сылкой невозможно производить вычисления. Другими словами ссылки польностью безопасны и обеспечивают чистый (без лишних "шумов") синтаксис.
СГ>Еще раз про ссылку:
... СГ>Переменная типа MyRecord занимает много места в памяти, для того чтобы передать ее по быстрому в процедуру можно не копировать ее, а передать по ссылке
Вот по этому я и говорю, что вам лучше не учить детей. Ну, как можно рассказывая про абстракцию спускаться до объемов занимаемой памяти? Да еще говорить об этом, как о главном аспекте?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Спор о терминологии.
Так изучи ее. java.sun.com http://msdn.microsoft.com/vcsharp/team/language/default.aspx
СГ>В С# или в Java основным является ReferenceType = POINTER TO RECORD. А, видимо, из аналогий с Си++, Вы посчитали, что PointerType = POINTER TO ValueType; есть что-то опасное, хотя это не имеет отношения к адресам и управляется сборщиком мусора и абсолютно безопасно.
Вредна сама возня с указателями. Это абстракция более никого уровня. Идиома ссылочного типа и типа-значения в купе с понятием ссылки дают намного более высокий уровень восприятия кода. Код практически не отличается при использовании ссылочных типов и вэлью-типов.
СГ> В C# и Java есть value-type и есть refernce-type, а в Обероне в добавок к этому еще есть совершенно безопасный управляемый сборщиком мусора pointer-type.
Вот это и есть вред. Язык обрублен до предела с понтом дела для урощения, и при этом он использует идиомы 70-ых говод.
СГ> Кстати, из-за того что pointer-type нет в C#, там ввели такой изврат как Boxing/Unboxing.
Нда, и этот человек рассуждает о чужой компетенции! В Шарпе таки есть указаетели! И они никак не мешают наличию или отсуствию боксинга. Например, в Яве вообще нет указателей, но так же нет боксинга и анбоксинга (вренее небыло, в Ява 1.5 они введены).
Боксинг был введен чтобы сгладить разницу между вэлью-типами и объектами. В Шарпе можно приводить встроенные типы, перечисления и структуры к object и обратно. Таким образом поддерживается полиморфизм для всех типов. Извратом, причем полнейшим, является наличие указателей в языке рассчитаном на сборку мусора.
Попробуй на досуге повторить вот этот код, и сравни его с исходным:
class A
{
static void Test()
{
object[] array = new object[] { 1, 1.2, "Wow!", new A(), RateTime.Now };
foreach (object value in array)
Console Write("'{0]'", value);
}
}
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.