Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2009-04-09 02:02:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:Вестник Дурдома, Компутерщина, Кунсткамера

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

x/dx
нельзя сократить на
x
в Java нет передачи параметров по ссылке.


(Добавить комментарий)


[info]mipa
2009-04-09 00:25 (ссылка)
Надо мне, наверное, йогой заняться. Я бы не смог так долго пытаться объяснить насчет передачи параметров, просто дал бы ссылку на простую и понятную статью: http://javadude.com/articles/passbyvalue.htm

Чувак видно читал Эккеля, да только пропускал примечания мелким шрифтом, где тот прямо пишет:
"I read in one book where it was “completely wrong to say that Java supports pass by reference,” because Java object identifiers (according to that author) are actually “object references.” And (he goes on) everything is actually pass by value. So you’re not passing by reference, you’re “passing an object reference by value.” One could argue for the precision of such convoluted explanations, but I think my approach simplifies the understanding of the concept without hurting anything (well, the language lawyers may claim that I’m lying to you, but I’ll say that I’m providing an appropriate abstraction)."

С другой стороны, почему бы и не пофлеймить на сон грядущий...

(Ответить) (Ветвь дискуссии)


[info]alamar
2009-04-09 01:35 (ссылка)
"the language lawyers may claim that I’m lying to you"
Именно это и происходит в нашей милой дискуссии

[info]kouzdra - language lawyer.
А я в гробу видел. Я знаю, как там байты передаются, и судя по байтам - передача идёт по ссылке, а остальное-то меня чай не е.

Ну и годного опровержения пока не нашли.
С "простой и понятной статьёй" я тупо не согласен: "But you cannot do this in Java!" Я берусь написать swap() на жабе.

Ну и разница между "указателем" и "ссылкой" - это то самое красноглазое языкодрочерство.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-04-09 01:38 (ссылка)
Ага - а на вершине всего ентного стоит cOoL Hazkerz AlaMarZ и гордо плюет на все с высоты своего дилетантизма.

PS: Вопрос и правда яйца выеденного не стоит - как таблица умножения примерно - но ежели в некоего мена не влазит таблица умножения, коей ему "пытались мозги ипать"... - ну в общем понятно, что я хочу сказать?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alamar
2009-04-09 01:50 (ссылка)
ДА, конечно, я должен, не спрашивая никаких доказательств или обоснований смотреть вам в рот.
Только мне совершенно почему-то непонятно, исходя из чего.

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-04-09 01:55 (ссылка)
Не - вы никому ничего не должны и никто вам ничего не должен. Но позволю заметить, что если этот тред попадется вашему интервьеру при найме на работу - он может сослужить вам довольно нехорошую службу.

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alamar
2009-04-09 02:22 (ссылка)
У меня очень толстый footprint участия в сетевых баталиях по поводу программирования.

Я склонен считать, что с точки зрения интервьюера это существенный плюс:
Я предпочту взять человека, который каждую неделю влипал во флейм по поводу программирования, чем человека, который сидел на авто-ру или там занимался фотографией. Даже если он троллил в пользу б-гомерзкого C++. Даже если с громатическими ошибками!

Впрочем, я не доллар, чтобы нравиться всем. Нравиться я готов своему работодателю, а остальным придётся меня терпеть.
Причем я не троллю (сейчас), а честно высказываю собственное мнение и недоумение.

(Ответить) (Уровень выше)


[info]kouzdra
2009-04-09 01:45 (ссылка)
А я в гробу видел. Я знаю, как там байты передаются, и судя по байтам - передача идёт по ссылке, а остальное-то меня чай не е

PS: Да судя по диспуту - как раз ни хера не представляешь....

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alamar
2009-04-09 01:49 (ссылка)
Судя по диспуту, у тебя ум за разум зашел, зато тебе подгавкивает тусовочка.

Но я стараюсь всё-таки дождаться от тебя определений и критериев.

(Ответить) (Уровень выше)


[info]vkni
2009-04-09 10:14 (ссылка)
Спасибо. Очень познавательно. А в C# - то же самое? Или там ссылки?

(Ответить) (Уровень выше)


[info]lolepezy
2009-04-09 17:12 (ссылка)
Смешная дискуссия.
Где-то (у Спольски что ли) было про людей, которые
в принципе не понимают указателей, типа мозг у них
без этой фичи. Вот тут самое оно, хотя вроде человек
относительно адекватный.

У вас поразительное терпение, я б не смог так
долго объяснять.

(Ответить) (Ветвь дискуссии)


[info]lolepezy
2009-04-09 17:21 (ссылка)
Ой.
Только что обратил внимание, что это тот же самый персонаж
рвёт глотку про доведение до самоубийства. Касательно
адекватности тут всё плохо, да.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2009-04-09 17:33 (ссылка)
Во-во - доведение до самоубийства путем передачи параметров по ссылке. С запиской "в моей смерти прошу винить язык Java и [info]kouzdra"

(Ответить) (Уровень выше)


[info]alamar
2009-04-09 22:59 (ссылка)
"было про людей, которые
в принципе не понимают указателей, типа мозг у них
без этой фичи. Вот тут самое оно"
Простите, вы беретесь ответить за это высказывание?
Например, дать мне какие-либо проверки, с вашей точки зрения, достаточные, чтобы убедиться, понимаю я указателей, или нет?

Потому что мне хотелось бы, чтобы вы убедились, что причина моего неприятия "передачи по значению" кроется отнюдь не в непонимании механизмов происходящего.
Я расписал эту тему подробнее вот в этом комментарии:
http://lj.rossia.org/users/kouzdra/630759.html?thread=4024551#t4024551

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]lolepezy
2009-04-10 10:28 (ссылка)
> вы беретесь ответить за это высказывание
Нет, не берусь. Вот [info]kouzdra не поленился
вам ответить на два десятка комментариев, а мне лень.

Вы статью читали, которая в первом комментарии к этому посту?

The terms "pass-by-value" semantics and "pass-by-reference"
semantics have very precise definitions
и т.д.?

Там всё четко и однозначно сказано и ссылка есть прямо
на спецификацию языка от Сана. Вы с кем и с чем спорите
вообще? С Саном что ли?
Разговоры про "выделены на куче" и "в ссылочном языке значения
функциям не принадлежат" --- это все кастанеда какая-то.
У всех упомянутых вами вещей есть однозначная общепринятая
семантика, на которую есть ссылка в спецификации языка, и
весь словесный поток вообще мимо кассы.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alamar
2009-04-10 10:51 (ссылка)
То есть вы признаете, что ваше обвинение в непонимании мной указателей - это широко известный демагогический приём перехода на личность?

"Вы статью читали, которая в первом комментарии к этому посту?"
Прочитал, конечно.

Почему вы все исходите из того, что я ничего не знаю и ничего не читаю?
Я прочитал и знаю, знаю и прочитал, и всё равно с вами несогласен.

"Вы с кем и с чем спорите вообще? С Саном что ли?"
Я спорю не с кем, а с чем.
С тезисом.
Кто его источник, тут неважно.

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

"У всех упомянутых вами вещей есть однозначная общепринятая
семантика"
А у call-by-sharing - общепринятая семантика?
Если да, то считаете ли вы, что call-by-sharing сводимо к call-by-value?
Если нет, то почему вы не видите разницы между call-by-value в C и якобы-call-by-value в Java? "How can anybody be so blind?"

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]lolepezy
2009-04-10 11:33 (ссылка)
Ох.
Ну сделайте себе, например, майку с надписью "ваше обвинение в непонимании
мной - это широко известный демагогический приём перехода на личность".

> Почему вы все исходите из того, что я ничего не знаю и ничего не читаю
Я исхожу не из этого, а из того, что вы делаете странные утверждения
и разводите мутную дискуссию в том месте, где всё однозначно.

> Вы спорите со мной и обижаетесь на меня
Я на вас не обижаюсь совсем, с чего вдруг.

> call-by-sharing сводимо к call-by-value?
Да, по определению: call-by-sharing для объекта это передача
ссылки на него by-value. В джаве этот термин не любят использовать,
потому что придётся оговариваться, что для примитивных типов
call-by-value, а для объектов call-by-sharing. Это избыточно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alamar
2009-04-10 13:06 (ссылка)
"Да, по определению: call-by-sharing для объекта это передача
ссылки на него by-value."
Нет.
Потому что ряд условий выполняется в call-by-value, а не в call-by-sharing
In call-by-value, the argument expression is evaluated, and the resulting value is bound to the corresponding variable in the function (frequently by copying the value into a new memory region). If the function or procedure is able to assign values to its parameters, only its local copy is assigned — that is, anything passed into a function call is unchanged in the caller's scope when the function returns.
Механизм тот же, а результат, и семантика, принципиально другие.

"значение ссылки" - это то, на что она ссылается.
Никакого другого значения у ссылки нет!

"потому что придётся оговариваться - Это избыточно. "
Неееет.
Это не избыточно, это необходимо. Потому что именно в этой разнице вся соль и заключена.
Не оговорили == сказали глупость.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]lolepezy
2009-04-10 13:24 (ссылка)
> Никакого другого значения у ссылки нет!
Теперь понятно, откуда у вас "толстый footprint", ага.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alamar
2009-04-10 13:34 (ссылка)
Насколько я понимаю, наш спор скатился до вырожденно-терминологического:
Мы оба признаём, что в случае языка Java имеет место call-by-sharing.
Но вы считаете, что call-by-sharing сводимо к call-by-value, потому что с технической точки зрения это одно и то же; а я считаю, что несводимо, потому что с семантической точки зрения это противоположные вещи.

Очевидно, спорить дальше не о чем.
Беспокоит меня то, что для вас (и [info]kouzdra@lj) основной способ ведения дискуссии - это обвинение собеседника в некомпетентности в обсуждаемой области.
При этом доказывать оную некомпетентность вы явно отказались - вы не считаете, что надо доказывать то, что вам очевидно.

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

Причём все носители такого синдрома - исключительно русские почему-то.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]lolepezy
2009-04-10 13:50 (ссылка)
Вы просто ненавидите всё русское.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alamar
2009-04-10 13:54 (ссылка)
Я лично ниибацца патриот, и на все русское практически дрочу.

(Ответить) (Уровень выше)

Вот суть.
(Анонимно)
2009-04-10 17:45 (ссылка)
In Java, take the case of

public void foo(Dog d) {
d = new Dog("Fifi");
}

Dog aDog = new Dog("Max");
foo(aDog);

the variable passed in (aDog) is not modified! After calling foo, aDog still points to the "Max" Dog!

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
(Анонимно)
2009-04-10 17:49 (ссылка)
То есть методу, конечно, передается не объект. Но ему передается и не ссылка, а копия ссылки, т.е. происходит передача ссылки по значению. Создается новая область памяти, в которую копируется значение, указывающее на ту область памяти, где хранится собственно объект.

Если бы в Java объекты передавались бы по ссылке, то в предыдущем коде aDog в конце указывала бы на Dog("Fifi").

(Ответить) (Уровень выше)

Re: Вот суть.
[info]alamar
2009-04-10 18:19 (ссылка)
Билли! Сдаётся мне, твой новый друг хочет обидеть нас!

С другой стороны:
public void foo(Dog d) {
d.setName("Fifi");
}

Dog aDog = new Dog("Max");
foo(aDog);

тогда как в C оно будет совсем по-другому себя вести:
void foo(struct dog d) {
d.name = "Fifi";
}

struct dog aDog = { "Max" };
foo(aDog);

Так вот, можно нарисовать такую таблицу:
Присвоение параметру передается вызывающему Изменение значения параметра передаётся вызывающему
call-by-value, C/C++ Нет Нет
call-by-reference, C++ Да Да
call-by-sharing, Java Нет Да


Очевидно, что семантически call-by-sharing несводимо к call-by-value!
Технически - сводимо (если спуститься на уровень, где ссылка - это указатель, и передается значение указателя - налицо).
Семантически - несводимо (потому что ведёт себя в результате совершенно по-другому, чем когда мы передаём по значению данные, а не указатель на них).

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
(Анонимно)
2009-04-10 18:29 (ссылка)
Dog aDog - это не объект, это ссылка. Она и передается в метод. По значению, да. Передается ссылка, по значению. Я так понимаю, употребляя термин "call-by-sharing" Вы именно это и хотите выразить, но, во-первых, лично я такой термин вижу в первый раз, а, во вторых, он ИМХО не передает важного: при вызове метода выделяется новая область памяти, ей присваивается имя d и туда вкопируется значение области памяти, имеющей имя aDog. Эначение это - адрес объекта на куче.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]alamar
2009-04-10 18:42 (ссылка)
"ссылка. Она и передается в метод. По значению, да. Передается ссылка, по значению."
Понимаете, дело в том, что ссылка больше ни по чему, кроме как по значению, передаваться не может, иначе она уже не будет ссылкой.

Так что "ссылка. Она и передаётся в метод."

Я такой термин тоже узнал только позавчера, в статье википедии, на которую мне дал ссылку [info]kouzdra.
Этот термин логично объясняет все противоречия, на которые мы наткнулись в процессе спора про передачу параметров в языке Java.

"не передает важного: при вызове метода выделяется новая область памяти, ей присваивается имя d и туда вкопируется значение области памяти, имеющей имя aDog."
Понимаете, в чём дело. Ссылка - эта такая штука, про которую нам известна семантика, но не метод реализации. Нам неизвестно ничего про ссылку, кроме того, что у нее есть значение - либо null, либо объект.
Поэтому "вкопируется значение области памяти" обсуждать уместно, если мы обсуждаем передачу указателей, но не передачу ссылок.

Дело в том, что в Java нет ссылок в стиле C++.
Но эта не беда, ведь в Java нет значений в стиле C! Кроме примитивных типов.
Поэтому мы не можем передать ни по ссылке, ни по значению: ни того, ни другого у нас тупо нет в языке. Поэтому я пришел к выводу, что следует применять термин call-by-sharing (или, возможно, какие-то его синонимы).

Соответственно, моя изначальная посылка была неверна. Как и посылка [info]kouzdra.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
(Анонимно)
2009-04-10 19:20 (ссылка)
>ссылка больше ни по чему, кроме как по значению, передаваться не может

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

Вообще, при такой семантике у нас есть 2 варианта: метод работает с копией ссылки или с оригинальной ссылкой. Выражение "call_by_sharing" можно употреблять для обеих ситуаций, и чтобы различать, что именно происходит в Java, ИМХО, стоит говорить о передаче ссылки по ссылке или по значению.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]alamar
2009-04-10 20:19 (ссылка)
"Может. Будучи обернутой в массив, например."
Какой тип будет у ссылки, обёрнутой в массив?
Dog[]&? Dog&[]?
Я не представляю себе семантики этого.
С точки зрения байтов я оборачивание ссылки в массив представляю влёгкую (Dog** банальный), а вот с точки зрения семантики - воображение отказывает.
Какой тип у "ссылки на ссылку на собаку"?

"при такой семантике у нас есть 2 варианта: метод работает с копией ссылки или с оригинальной ссылкой."
Система типов языков типа Java не имеет такого типа, как "ссылка, принадлежащая другой функции".
Такой тип был бы миной, заложенной под код, тем более - если внешне он не отличался бы от обычной, человеческой ссылкой.
Но это можно сделать, да. Назовём это call-by-stupidity.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]kouzdra
2009-04-10 20:31 (ссылка)
Dog&[] конечно. & и * могли бы быть вполне взаимозаменяемы, если бы в С++ & могло бы возвращать lvalue - работала конструкция
int & x = ....; &x = &y;
Никакой мистики там нет.

Реально разница между ссылками и значениями снимается при наличии referentional transparency - когда нет способа отличить ссылки на две разных копии объекта (то есть разные ссылки) от ссылок на одну и ту же копию (то есть - одинаковые ссылки). Но это только в purely functional languages имеет смысл (ну и отчасти - ограничено в ML но не O'Caml, где помимо специально введенного типа ref нет mutable objects и нет операции сравнения ссылок)

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]alamar
2009-04-11 03:14 (ссылка)
"работала конструкция
int & x = ....; &x = &y
Никакой мистики там нет."
Я согласен, что если мы разрешим &x = &y, то никакой мистики там не будет.

Но тогда вопрос: а будет ли работать код:
function(struct dog& bark)
{
struct dog *howl = malloc(sizeof(struct dog));
&bark = howl;
}
?
Потому что если да, то 1) ссылки уже ничем не отличаются от указателей, кроме синтаксиса (что и требовалось доказать, я понимаю), и 2) вы ещё на шаг ближе к идеалу C++: it's not like you can't write code, it's just that you can't tell for sure what any particular name or some other part of it means.

А так, конечно, можно.

(Ответить) (Уровень выше)

Re: Вот суть.
(Анонимно)
2009-04-10 20:37 (ссылка)
>Какой тип у "ссылки на ссылку на собаку"?

Ссылка, так-то! Фактически, у нас есть 3 типа сущностей: примитивы, ссылки и объекты, при этом работать напрямую с объектами мы не можем вообще. Вы почему-то, рассматривая семантику, хотите сделать вид, что ссылки никакой нет, а есть только объекты.

>ссылка, принадлежащая другой функции

Ересь какая-то, извините. Упаковал я ссылку в массив, передал в метод - и там могу невозбранно менять ее значение. Никакой принадлежности ссылок нет

"внешне он не отличался бы от обычной, человеческой ссылкой" - это как? С точки зрения хотя бы синтаксиса будет отличаться.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]alamar
2009-04-11 03:09 (ссылка)
"Вы почему-то, рассматривая семантику, хотите сделать вид"
А вы тоже хотите сделать вид.
Но противоположный - я пытаюсь упростить ситуацию и собрать наиболее очевидное и при этом достаточно точное объяснение наблюдаемого феномена.
А для этого все избыточные вещи надо убрать.

Ссылки есть. Но самостоятельными сущностями они не являются. С ними ничего нельзя сделать, кроме разыменования.

"Ересь какая-то, извините. Упаковал я ссылку в массив, передал в метод - и там могу невозбранно менять ее значение."
Понимаете, в чем дело.
Во-первых, если вы упаковали ссылку в массив, то вы обнаружите, что в массиве у вас банальный указатель уже валяется и воняет.
"Никакой принадлежности ссылок нет"
Во-вторых, он указывает на область стека какой-то из функций! Опредленной функции! Вот этой функции он и принадлежит.

""внешне он не отличался бы от обычной, человеческой ссылкой" - это как? С точки зрения хотя бы синтаксиса будет отличаться."
В том и проблема.
Говнодотнетовские in/out параметры синтаксисом не отличаются, а семантика у них такая, что дыбом волосы встают, куда там похапе.

И это всё ради того, чтобы не делать destructuring bind!

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
(Анонимно)
2009-04-11 17:50 (ссылка)
>Ссылки есть. Но самостоятельными сущностями они не являются.
Почему не являются?

>С ними ничего нельзя сделать, кроме разыменования.
Можно еще, например, упаковать в массив :) или сравнить с другой ссылкой. Или создавать копии.

>Во-вторых, он указывает на область стека какой-то из функций!
Он указывает на объект на куче. С ним никакой магии, после упаковки в массив, не произошло. Фактически, ссылка в Java - это и есть указатель, просто не на область в памяти, на объект в куче.

>Но противоположный - я пытаюсь упростить ситуацию и собрать наиболее очевидное и при этом достаточно точное объяснение наблюдаемого феномена.

Не получится у Вас упростить. Потому, что ссылка есть, как сущность. Не как элемент синтаксиса, а именно как сущность, которая хранится в памяти и все такое. Именно ей, а не объекту, в коде присваивается имя. Более того, одна и та же ссылка может иметь несколько имен в различных методах (заметьте, не ссылка на один и тот же объект, а одна и та же ссылка!) Ссылку я могу хранить в массиве, передавать в массиве куда-то, сравнивать с другой ссылкой. Если я считаю, что ссылка есть как самостоятельная сущность, у меня не возникает проблем класса "я не понимаю семантики этого". Наоборот, язык становится простым, логичным и единообразным.

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

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]alamar
2009-04-11 18:13 (ссылка)
"Почему не являются?"
Потому что иначе это указатель.
Впрочем, можно устраивать дебаты по этому поводу - ссылки ли в жаве, или указатели.

"Он указывает на объект на куче. С ним никакой магии, после упаковки в массив, не произошло. Фактически, ссылка в Java - это и есть указатель, просто не на область в памяти, на объект в куче."
А, нет, я не это имел в виду.
Я думал, что вы собираетесь "упаковывать в массив" (такого термина я ещё не встречал) ту самую ссылку-на-ссылку.

Теперь я вас понял, вы имеете в виду обычные массивы объектов.
Так вот, никакого чуда не происходит, когда ссылка оказывается в массиве: фактически, она копируется туда, а потом поверх нее на то же место можно записать и другую ссылку. Но одноэлементный массив - это вовсе не магическая "ссылка на ссылку" - просто она теперь расположена не в стеке метода, а в объекте, а все ссылки в объектах видимы и изменяемы глобально. Я не об этом говорил совсем.

Я говорил, что не понимаю, какой тип имеет "out Object foo".

И мне не нравится, что при вызове таких методов происходит шевеление под ковром, которое мы не контролируем и не можем заметить: создание "массива" одного элемента, копирование туда ссылки, вызов метода с параметром - этим массивом, копирование ссылки из "массива" в изначальную.

Это ломает всю семантику ссылок (рядом две неотличимые ссылки с принципиально разным поведением), и всё ради того, чтобы не сделать правильно.

"Более того, одна и та же ссылка может иметь несколько имен в различных методах (заметьте, не ссылка на один и тот же объект, а одна и та же ссылка!)"
Это, простите, как?
CLR не берем.

"Ссылку я могу хранить в массиве"
Не можете.
В массиве есть своя ссылка (или несколько) а ссылку вы всего лишь можете скопировать туда и скопировать оттуда.
Хранить вы ее там не можете - в массиве хранится своя ссылка, от вашей отдельная.

Если я считаю, что ссылка есть как самостоятельная сущность, у меня не возникает проблем класса "я не понимаю семантики этого".
У ссылок очень ограниченная семантика, фактически, ссылка имеет три операции всего: сравние с другой ссылкой, перезапись из другой ссылки, передача в метод.
Самостоятельной сущностью она является в том смысле, что она или принадлежит объекту, или принадлежит методу; и ее нельзя никуда отдать, только скопировать.
Вот процесс ее копирования и обеспечивает call-by-sharing.

"Есть объекты на куче, есть примитивы и ссылки. Примитивам и ссылкам мы можем давать имена, и передавать их в качестве параметров - по значению."
Ещё раз, в десятый раз.
Ссылку нельзя передать никак, кроме как по значению.
Поэтому давайте не разводить тавтологии и не говорить "передавать ссылку по значению" более никогда.
"Передавать ссылку".

Да, ссылку можно передать. А можно передать массив, у которого внутри одна ссылка. Но второе никак не может считаться "передачей по ссылки по ссылке". Отличие - там будут две операции копирования и нетривиальный механизм за сценой.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
(Анонимно)
2009-04-11 19:05 (ссылка)
>Ссылку нельзя передать никак, кроме как по значению.

В жабе - нельзя. Но мы могли бы создать другой язык, Java', где ссылка не копировалась бы в метод, а именно передавалась бы туда. Лично я не вижу для этого никаких фундаментальных ограничений.

И для этого языка было бы справедливо утверждение "в метод передается не копия ссылки, но сама ссылка".

>У ссылок очень ограниченная семантика, фактически, ссылка имеет три операции всего: сравние с другой ссылкой, перезапись из другой ссылки, передача в метод.

Ну и что?! Почему вы на этом основании отказываете ей в том, чтобы считаться самостоятельной сущностью? Тогда и примитиву boolean откажите, чего уж. Там тоже только 3 операции: сравнение, копирование, передача в метод :)

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]alamar
2009-04-11 20:28 (ссылка)
"Но мы могли бы создать другой язык, Java', где ссылка не копировалась бы в метод, а именно передавалась бы туда."
Мы могли бы.
Вы понимаете, что каждая ссылка принадлежит либо функции, либо объекту в качестве поля.
Какой тип имела бы "ссылка из другого метода"?
Какие проблемы при сборке мусора она создавала бы? Ведь можно так передать не только локальную переменную, но ведь и поле!

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

"Тогда и примитиву boolean откажите, чего уж."
У примитивов действительно нет ничего, кроме их значения, и на них тоже нельзя взять ссылку.
Но у них хоть значение есть своё, а у ссылки в качестве значения выступает другая сущность.

(Ответить) (Уровень выше)

Re: Вот суть.
(Анонимно)
2009-04-11 19:10 (ссылка)
Мы могли бы даже, в этом языке Java', предусмотреть обе возможности. И разделить их синтаксически. Типа, если перед именем ссылки в вызове метода стоит некая закорючка - передается копия, не стоит - сама ссылка. А вы говорите "Ссылку нельзя передать никак, кроме как по значению" так, как будто из самой сущности того, чем является ссылка, следует полная невозможность такого.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]alamar
2009-04-11 20:38 (ссылка)
Да.
Ссылку нельзя передать по ссылке по определению:
Ссылка ссылается на объект в куче (либо null).
При этом сама ссылка не является объектом и не обязательно располагается в куче.
Соответственно, ссылка не может ссылаться на другую ссылку.

Придётся вводить новый тип! Какой?

(Ответить) (Уровень выше)

Re: Вот суть.
(Анонимно)
2009-04-11 19:16 (ссылка)
Я говорил, что не понимаю, какой тип имеет "out Object foo".

И мне не нравится, что при вызове таких методов происходит шевеление под ковром, которое мы не контролируем и не можем заметить: создание "массива" одного элемента, копирование туда ссылки, вызов метода с параметром - этим массивом, копирование ссылки из "массива" в изначальную.


Очевидно, тип - "ссылка на объект класса Object". "out" относится не к типу, а к способу обработки ссылки методом. Копируется она, или используется та же, т.е. "расшаривается", если хотите.

Это где это происходит такое "шевеление"? Нигде такого не происходит. В жабе приходится так делать руками, так как есть только один способ передачи ссылок. В языках, в которых их два - ну, просто два способа, да. И когда передается сама ссылка, а не копируется - то просто метод и вызвавшие его код под разными именами подразумевают одни и те же байты памяти, где хранится ссылка. И операции над ссылкой в методе меняют, конечно, ссылку у вызвавшего - потому что это одна и та же ссылка.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Вот суть.
[info]alamar
2009-04-11 20:37 (ссылка)
Очевидно, тип - "ссылка на объект класса Object". "out" относится не к типу, а к способу обработки ссылки методом. Копируется она, или используется та же, т.е. "расшаривается", если хотите.
Вы определитесь, пожалуйста.
Каким образом у вас расшаривается ссылка:
- используется та же (то есть, в метод на самом деле приходит указатель на место в стеке, где находится расшариваемая ссылка).
- или же создаётся массив из одного элемента (или аналогичный объект), до вызова расшариваемая ссылка копируется в него, после возврата расшариваемая ссылка из него присваивается.
Из предыдущего вашего комментария создавалось первое впечатление, из текущего - второе.
Это важно - у каждого из вариантов свой набор грабель, через которые придётся скакать, поэтому ответ хорошо бы знать пользователю-программисту, а не только разработчику инструментов.

Хочу отметить, что если вы задумались над ответом более пяти секунд, это косвенно подтверждает, что семантика передачи ссылки "не по значению" неочевидна и вызовет проблемы с пониманием.

"Это где это происходит такое "шевеление"? Нигде такого не происходит. В жабе приходится так делать руками, так как есть только один способ передачи ссылок."
Если это будет делаться автоматически, поймите, проблема усугубится.
Я написал чуть выше про набор грабель; есть у двух способов и общие грабли.

"И когда передается сама ссылка, а не копируется - то просто метод и вызвавшие его код под разными именами подразумевают одни и те же байты памяти, где хранится ссылка. И операции над ссылкой в методе меняют, конечно, ссылку у вызвавшего - потому что это одна и та же ссылка."
Как вы относитесь к языку C++?

(Ответить) (Уровень выше)


[info]ppkk
2009-04-09 19:14 (ссылка)
Меня очень раздражает, что иногда для того, чтобы поменять два объекта в списке местами, приходится создавать их создавать их копии (создаётся три полновесных объекта). Ясно, что этому могут быть разумные причины в сложных структурах, но меня, естественно, раздражает, когда этих разумных причин не видно, а метод "поменять местами" не написали.

(Ответить)