Здравствуйте, Сергей Губанов, Вы писали:
СГ>Про оптимизацию оператора switch по сравнению с обычной цепочкой if-else можно почитать, например. там:
Тесты показали, что разница минимальна. На gcc 2.95 она в пределах статистической погрешности, на win-компиляторах было что-то порядка 15-20%. Пусть yeti меня поправит, если где наврал.
ИМХО даже если разница 150%, это совершенно некритично, т.к. выполняется это хозяйство в любом случае ОЧЕНЬ быстро
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Которая называется — "процедурная переменная" и о которой я сто раз тут говорил. Если уж на то пошло, то Delphi вся на них построена...
Если уж на то пошло, то называетс она делегат, замыкание, клозюр, но не "процедурная перемнная". Дельфийский клозюр конечно похож, но по возможностям и чистоте абстракции он уступает. Похож он тем, что так же позволяет хранить ссылку на метод конкретного экземляра. А не похож, тем что:
1. Абстрагируется от реализации.
2. Позвляет комбинировать несколько ссылок в один объект.
3. Является полноценным типом (а стало быть и объектом).
4. Прозрачен. Например, делегаты могут с успехом передаваться чрез кграницы процессов и компьютеров и вызваться по сети.
К тому же одно дело клозюр в Дельфи, а другое указатель на процедуру в Обероне. Против Дельфи я бы возражал меньше.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Сергей Губанов, Вы писали:
VD>>Указатели — это вредная (по крайней мере на стадии первичного обучения) идиома.
СГ>Наоборот.
Агащасблин. Видмо именно по этому указатели выбидывают из всех современных языков.
СГ> Как показывает практика (info21), дети с легкостью пишут программы работающие с динамическими списками. Потому что это интуитивно понятно. А вот написание фортраноподобных алгоритмов — есть уже следующая ступень развития детского разума. СГ>
СГ>TYPE
СГ> List = POINTER TO ListDesc;
СГ> ListDesc = RECORD
СГ> Data: ....
СГ> Next: List;
СГ> END;
СГ>
Вот и сравни:
class Element
{
.... Data;
Element Next;
}
Или дженерик вариант (чтобы .... не писать):
class Element<T>
{
T Data;
Element Next;
}
Тут и объяснять нечего.
СГ>Да что Вы такое говорите! Без указателей невозможны динамические структуры данных. Теже списки, например. Все наоборот: в Java нет не указателей на объекты, а там нет самих объектных переменных как таковых, любая объектная переменная в Java это и есть УКАЗАТЕЛЬ на объект, а не САМ объект.
Нда. Первая половина каменного века. Про обстрагирование от реализации ничего не слышал?
СГ>Указатели нужны для работы с динамическими структурами (время исполнения); а обобщенный код — статичен (время компиляции). Ваш пример не относится к делу.
Указатели ненжны вообще! Это вредная инфомация. Это информация об внутреннем устройстве. Для сознания нужно понятие передача/хранение объекта по ссылки или по значению. Все! Остальное тараканы в голове.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Кодт, Вы писали:
К>Тут появляется другая идиома, value/reference типы. То есть, передаваемые по значению (копируемые) и по ссылке (разделяемые). К>Она, конечно, более прозрачна для понимания
Именно!
К> — но тоже содержит ряд приколов (ошибкоопасностей): К>* нечаянный разрыв связи: модификация переменной не доходит до партнёра К>* нечаянное создание/сохранение связи: модификация, казалось бы, локальной копии уходит на сторону
Как показывает практика эта идеома съедается на раз даже самыми не подготовленными, а об указателю ломают себе зубы очень многие.
ЗЫ
Убивает, не это. Убивает то что человек берущийся за обучение детей не вкурсе, что такое абстракция и идиома. Вот погляди: Re[5]: Мощность...
Здравствуйте, Сергей Губанов, Вы писали:
СГ>К чему пример адресной арифметики? К тому чтобы показать ее наличие!
Ее вред. Но дело тут в другом. Указатили и ссылки это разные идеомы. Они по разному воспринимаются людьми. И порождают совершенно разное представление о мире.
В идеоме указателей есть области памяти и адресная арифметика. В идеоме ссылок есть ссылочные и вэлью-типы.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VladD2:
> Он серьзено считает, что ссылка и указатель это одно и то же.
И в некотором смысле он может оказаться правым Все зависит от определений. Похоже, у него более общее определение понятия "указатель", не привязанное к C или C++ и адресной арифметике. Скажем, в том же Паскале указатели были ближе к ссылкам в Шарпе, чем к указателям в C++. Если я, конечно, еще не окончательно Паскаль забыл
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Переменная типа Element есть УКАЗАТЕЛЬ на размещенный в куче объект. Если объект не размещен, то эта переменная есть null. Обратите внимание: не объект равен null, а переменная типа Element равна null. Еслибы Element не был бы указетелем, то струтура Element в силу своего рекуррентного определения была бы бесконечного размера.
Здравствуйте, VladD2, Вы писали:
VD>В идеоме указателей есть области памяти и адресная арифметика. В идеоме ссылок есть ссылочные и вэлью-типы.
Чего это вдруг Вы перемешали указатели с адресами-то? Указатели — это одно, а адреса — это другое, ну а ссылки — это третье.
Есть три независимых друг от друга понятия
1) Адрес и адресная арифметика.
2) Указатели и проверка на NIL.
3) Ссылки и автоматическое разыменование.
Примеры:
1) Адрес:
void* a = (void*)&A;
a — адрес какой-то переменной "A"
2) Указатель:
TYPE
Tree = POINTER TO TreeDesc;
TreeDesc = RECORD
Data:..
Left, Right: Tree;
END;
VAR
p: Tree;
p — указатель на объект TreeDesc. Он может быть равен NIL если объект не размещен в памяти.
3) Ссылка:
PROCEDURE Proc(VAR t: TreeDesc);
BEGIN
...
END Proc;
t — ссылка на объект TreeDesc. Она НЕ может быть равна NIL, ее собственное значение скрыто от программиста обращение к ней всегда приводит к автоматическому ее разыменованию.
ПОВТОРЯЮ. Запомните! Есть ТРИ РАЗНЫХ НЕСМЕШИВАЕМЫХ ДРУГ С ДРУГОМ ПОНЯТИЯ 1) Адреса, 2) Указатели, 3) Ссылки!
Здравствуйте, Павел Кузнецов, Вы писали:
>> Он серьзено считает, что ссылка и указатель это одно и то же.
ПК>И в некотором смысле он может оказаться правым Все зависит от определений. Похоже, у него более общее определение понятия "указатель", не привязанное к C или C++ и адресной арифметике.
Паша, не ты ли мне доказывал обратное в С++ где разница и правда не столь существенна? А вот Шарпе разница не просто существенна, а ябы сказал, принципиальна. Да еще и четко прописана в стандарте языка.
ПК> Скажем, в том же Паскале указатели были ближе к ссылкам в Шарпе, чем к указателям в C++. Если я, конечно, еще не окончательно Паскаль забыл
В Паскали уазатели были уаказателями. Понятие ссылчного типа появилось в дельфи, где оно мирно сосуществует с указателями до сих пор. И разница как ты понимаешь тут лежит отнюдь не в том что они мало похоже. Разрица во взгляде на жизнь.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, VladD2, Вы писали:
VD>>Вот и сравни: СГ>
СГ>class Element
СГ>{
СГ> .... Data;
СГ> Element Next;
СГ>}
СГ>
СГ>Переменная типа Element есть УКАЗАТЕЛЬ на размещенный в куче объект.
Да? Содись. Два. Итак дети открываем спецификацию C# 1.2 и читаем раздел 25.2:
In an unsafe context, a type (§11) can be a pointer-type as well as a value-type, a reference-type, or a type-parameter. 47
parameter...
Сюрприз! Оказывается в C# тоже есть указатели. Только в ансэйф-режиме (который спуциально включать нужно и код размечать).
Еще раз повторю свою мысль, так как она до сих пор так и не была понята: В современных языках программирования не используется парадигма указателя. Вместо нее используется парадигма ссылочных- и влэлью-типов. Причем в том же Шарпе указатели оставлены в небезопасном режиме, вот только для повседневной работы они ненужны. И прежде чем учить чему-то других, нужно самому понять принципиальную разницу этих взглядов.
СГ> Если объект не размещен, то эта переменная есть null. Обратите внимание: не объект равен null, а переменная типа Element равна null.
Мне кажется тут кого-то другого нужно учить программированию. Я уже леть эдак 15 как умею это делать. Указатели и все что с ними связано я освоил где-то в начале 90-ых.
A reference type is a class type, an interface type, an array type, or a delegate type.
...
A reference type value is a reference to an instance of the type, the latter known as an object. The special value null is compatible with all reference types and indicates the absence of an instance.
За тем продолжить с пункта 8.2 (Types):
C# supports two kinds of types: value types and reference types. Value types include simple types (e.g., char, int, and float), enum types, and struct types. Reference types include class types, interface types, delegate types, and array types.
Value types differ from reference types in that variables of the value types directly contain their data, whereas variables of the reference types store references to objects. With reference types, it is possible for two variables to reference the same object, and thus possible for operations on one variable to affect the object referenced by the other variable. With value types, the variables each have their own copy of the data, and it is not possible for operations on one to affect the other.
СГ> Еслибы Element не был бы указетелем, то струтура Element в силу своего рекуррентного определения была бы бесконечного размера.
По этму поводу могу только отослать вот сюда: http://en.wikipedia.org/wiki/Abstraction . Если как следует понять описанный там принцип, то не тнудно будет догадаться чем физическая реализация отличается от абстракции.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Чего это вдруг Вы перемешали указатели с адресами-то? Указатели — это одно, а адреса — это другое, ну а ссылки — это третье.
О! Уже сдвижки появились. Все же значит ссылки это третье. Ну, хорошо хоть так. А то только что они были указателями.
СГ>Есть три независимых друг от друга понятия
СГ>1) Адрес и адресная арифметика. СГ>2) Указатели и проверка на NIL. СГ>3) Ссылки и автоматическое разыменование.
Oberon
Much as with Modula-2, pointers are available. There are fewer ways to evade the type system and so Oberon and its variants are still safer with respect to pointers than Modula-2 or its variants. As with Modula-3, garbage collection is a part of the language specification.
СГ>Примеры: СГ>1) Адрес: СГ>
СГ>void* a = (void*)&A;
СГ>
СГ>a — адрес какой-то переменной "A"
А, ну, отношение ясно. Если С++ — то адрес. А если Оберон то указатель. Себя ты уже буедил.
СГ>t — ссылка на объект TreeDesc. Она НЕ может быть равна NIL, ее собственное значение скрыто от программиста обращение к ней всегда приводит к автоматическому ее разыменованию.
Понятно. Познаиня закончились на Обероне. Ладно немного их разовсьем
C#:
// Сслочный тип данных.
calss A {}
...
// Не инициализированная (равных null) ссылка.
A a1;
// Ссылка на некоторый объект.
A a2 = new A();
// Ссылка на массив неинициализированных ссылок на A.
A[] array = new A[2];
// Инициализированный массив.
A[] array = new A[] { new A(), new A() };
Итого мы имеем возможность писать полноценные программы не прибегая к ненужным понятиям вроде указателей и темболее адресов. Ненужны всякие крышки, звездочки и другая хрень. А вот и указатели:
unsafe
{
int i = 1; // value-тип.int* p = &i; // Указатель! :)
++p; // Сюрприз! Адресная арефметика. :))
}
СГ>ПОВТОРЯЮ. Запомните! Есть ТРИ РАЗНЫХ НЕСМЕШИВАЕМЫХ ДРУГ С ДРУГОМ ПОНЯТИЯ 1) Адреса, 2) Указатели, 3) Ссылки!
Моежт сам таки запонишь и не будшь потом рассказывать, что в Яве или Шарпе переменная — это указатель?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Сергей Губанов, Вы писали:
VD>> Он серьзено считает, что ссылка и указатель это одно и то же.
СГ>"Он" так не считает и не понимает с чего это вдруг Вы делаете такие заявления!!!
СГ>http://www.rsdn.ru/Forum/Message.aspx?mid=870001&only=1
Ну, это видимо он уже понял что фигня спорол и вместо того, чтобы чесно в этом признаться начал учить других и делать вид что не понимает о чем речь. А речь то вот о чем: Re[7]: Указатель
Вот тут он четко дает всем понять, что не отделяет понятия указатель, от понятия ссылка. Но вот с ним не согласны авторы Явы и C#-а. Они то как раз называют переменную Next ссылкой. А Element типом. Кстати, утверждение что Element — это УКАЗАТЕЛЬ вообще выглядит странно. Хоть сказал бы уж "pointer type" (то биш тип указателя).
И этот человек имет наглость рвссуждать у чьей-то компетенции. Я фигею, дорогая редакция. (с)
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VladD2:
>>> Он серьзено считает, что ссылка и указатель это одно и то же.
> ПК>И в некотором смысле он может оказаться правым Все зависит от определений. Похоже, у него более общее определение понятия "указатель", не привязанное к C или C++ и адресной арифметике.
> Паша, не ты ли мне доказывал обратное в С++ где разница и правда не столь существенна? А вот Шарпе разница не просто существенна, а ябы сказал, принципиальна. Да еще и четко прописана в стандарте языка.
Дык, одно дело, когда говоришь о C++ или C# — там все понятно: в соответствующих стандартах есть соответствующие определения. А другое дело, когда идет разговор "вообще". В этом смысле я вполне могу понять Сергея, употребляющего термины несколько по-иному, чем это привычно мне или тебе. Без привязки к конкретным языкам и дополнительного доопределения терминов мне не кажется уместным тыкать собеседника в разницу ссылок и указателей, т.к. "в общем" смысле разницы между ними нет, пока нет четких определений, что конкретно вкладывается в каждый из терминов.
> И разница как ты понимаешь тут лежит отнюдь не в том что они мало похоже. Разрица во взгляде на жизнь.
Ну, с точки зрения C++ эта разница проявляется одним образом, с точки зрения C# — другим. А для Оберона, может, еще каким-то третим... И не обязательно таким, как ты или я это себе представляем.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, WolfHound, Вы писали:
WH>Кстати объясни пожалуйста почему WH>
WH> FOR i := 0 TO Self.p DO
WH> h.x := h.x + N[i] * Self.Pw[span - Self.p + 1].x;
WH> h.y := h.y + N[i] * Self.Pw[span - Self.p + 1].y; //тут точка с запятой нужна
WH> h.z := h.z + N[i] * Self.Pw[span - Self.p + 1].z //А тут нет
WH> END;
WH>
WH>В чем тайный смысл?
А Вирт под прикрытием заботы о программисте на самом деле упрощает граматику языка. Такой подход идеален для LL(1)-парсеров. Если ты обратиш внимание, то в Паскале и Обероне все конструкции идеальны для LL(1)-парсинга. Любая конструкция распознается прямолинейно без анализа в глубь. Вирт считает, что это понятнее неподготовленному человеку. Хотя веловеку то понятно совсем иное. Он не простату ищет, а гармонию.
Вот так вирт описывает список стэйтментов:
StatementSeq = Statement { ";" Statement }.
А вот так тоже самое описывают в С-подобных языках:
Кстати, если допустить NullStatement, то можно и в случае Паскале-подомного варианта ставить ";" у последнего утверждения. Правда при этом их вообще везде можно будет лепить.
В общем, в Паскале и других языках Вирта ";" разделяет утверждения, а не завершает их. Так что в принципе правльно было бы писать в твоем любимом стиле:
a := 1
; b := a + 3
; c := b + a
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Дык, одно дело, когда говоришь о C++ или C# — там все понятно: в соответствующих стандартах есть соответствующие определения. А другое дело, когда идет разговор "вообще".
И о указателях в препадавании.
ПК> В этом смысле я вполне могу понять Сергея, употребляющего термины несколько по-иному, чем это привычно мне или тебе.
И где я уже мог это слышать?
ПК> Без привязки к конкретным языкам и дополнительного доопределения терминов мне не кажется уместным тыкать собеседника в разницу ссылок и указателей, т.к. "в общем" смысле разницы между ними нет, пока нет четких определений, что конкретно вкладывается в каждый из терминов.
Ну, т.е. тебе было влом вникать в суть дела. Ты увидил меня и решил защетить того кого я обижаю?
Ладно поясню суть дела. Я объясняю товарищу, что можно жить без понятия указатель. Что есть парадигма ссылочных и вэлью-типов. Что она с успехом заменяет тот самый указатель и необходимость его явного получения в виде указаения разных крышек и введения специальных типов данных.
ПК>Ну, с точки зрения C++ эта разница проявляется одним образом, с точки зрения C# — другим.
И тем не менее суть одна. С++-ная ссылка просто сильно огранична в виду отсуствия понятий ссылочного и влэью- типов.
ПК> А для Оберона, может, еще каким-то третим... И не обязательно таким, как ты или я это себе представляем.
Да нет. Указатели в обероне такие же как в Моудуле или Паскле. Может ограничений по более (по безопаснее), но суть та же. Акцент на указателе как типе. Вот я товарищу и объясняю, что есть другие взгляды на жизнь. И что при обучении они проходят намного более безболезненно. А товарищ думает, что перед ним глупый упершийся ученик и пытается ему навизать свою волю. Типа я учитель, ты дурак.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VladD2:
> ПК>Ну, с точки зрения C++ эта разница проявляется одним образом, с точки зрения C# — другим. > > И тем не менее суть одна. С++-ная ссылка просто сильно огранична в виду отсуствия понятий ссылочного и влэью- типов.
Скорее ограничена C#-вская, ввиду того, что не всяким типом можно оперировать по значению, и, если я не ошибаюсь, не всяким типом можно оперировать по ссылке
> Акцент на указателе как типе.
Дык, как ни крути, хоть указатель, хоть ссылка как тип все равно присутствуют. Разница только в том, явно или нет.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Скорее ограничена C#-вская, ввиду того, что не всяким типом можно оперировать по значению, и, если я не ошибаюсь, не всяким типом можно оперировать по ссылке
О! Я сморю задеты религиозные чувства. Извиняте батько.
>> Акцент на указателе как типе.
ПК>Дык, как ни крути, хоть указатель, хоть ссылка как тип все равно присутствуют. Разница только в том, явно или нет.
Это очень большая разница! В одном случая ты обязан думать о ней. А в другом необязан. Те ограничения которые есть отловит сам компилятор. Для обучение — это ой как важно. Да и для работы тоже. Это как раз и есть то саме повышение уровня языка, позволяющее вместо того думать "как сделать", думать о том "что нужно сделать".
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VladD2:
> ПК> Дык, как ни крути, хоть указатель, хоть ссылка как тип все равно присутствуют. Разница только в том, явно или нет.
> Это очень большая разница! В одном случая ты обязан думать о ней. А в другом необязан. Те ограничения которые есть отловит сам компилятор. Для обучение — это ой как важно.
Обязан ты думать о наличии ссылок в любом случае. Только в одном случае ты их видишь, а в другом — нет.
Псевдокод 1 (тип определяет семантику "ссылочности", ссылки неявные):
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Где у учеников будет больше вопросов относительно разницы в работе двух примеров?
Ну, если первы вариант Шарп, то конечно во втором. Так как в первом будет только один вопрос: А почему компилятор написал что не может изменить строку так как она доступна тольк для чтения.
А вот во втором случае будет очень много вопросов. И один из них "Как зовут того дядю (возможно более емкое название), что спроектировал язык в котором вот так за проста можно изменить значение константы?".
Что же до обяснений концепции ссылочных и вэлью-тиов, то достаточно дать аналогию с рельным миром где можно расплатиться наличными, а можно дать карточку ссылающуюся на банковский счет.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.