Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 01.11.2009, 22:48
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от Dmitry A. Soshnikov
ES называет by-value, Java называет by-value
вот... оно самое ;-)
Ответить с цитированием
  #12 (permalink)  
Старый 01.11.2009, 22:57
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Kolyaj
Т.е. ссылки отличаются от указателей только тем, что операция разыменования не нужна?
Пример был псевдо-кодом, не касаемо конкретной реализации и терминологии из C/С++ с её указателями и ссылками.

Сообщение от Zeroglif
вот... оно самое ;-)
Ага, только ES я имею в виду не ECMA-262-3, а разъяснения программеров. В любом случае, я буду в дальнейшем объяснять так: "название из общей теории - by-sharing (и ссылка), но в ES - принято название - by-value (и, возможно, ссылки на объяснения B.Eich-a)", т.к. это наиболее полно.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #13 (permalink)  
Старый 01.11.2009, 23:15
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

В javascript было принято говорить by-val в отношении примитивов, и by-ref в отношении объектов. Это даже в доках было. Eсли ты видел на vingrad-e на меня с моим by-value смотрели как на марсианина. Потом постепенно начали исправлять по аналогии с java в онлайн-доках mdc, уточняя ситуацию с помощью разъяснений dev-ов.

By-value мне кажется очевидней, наиболее точным по отношению к стандарту, где есть только значения, где есть внутренние методы [[Get]], GetValue, промежуточный внутренний тип Reference Type, конкретизация переменных, где значения всегда копируются. И потом этот проще для понимания по сравнению с двойным случаем и уж тем более по сравнению с не используемым в быту by-sharing... Можете включать голосовалку, я за by-value... ;-)
Ответить с цитированием
  #14 (permalink)  
Старый 01.11.2009, 23:38
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Zeroglif
Можете включать голосовалку, я за by-value... ;-)
Не-а, я не участвую ;-) Единственное, на что могу согласиться, это поменять местами приоритеты - сначала говорить, что в ES используют терминологию by-value, но вообще, не касаемо реализаций и языков, это называется by-sharing (даже если! даже, если - by-sharing и не часто используется в быту; меня всегда больше теория интересует).

Сообщение от Zeroglif
by-ref в отношении объектов. Это даже в доках было. Eсли ты видел на vingrad-e на меня с моим by-value смотрели как на марсианина
Ну by-reference не верно, в любом случае, так что, на vingrad-e ты был прав.

Сообщение от Zeroglif
конкретизация переменных
Это, в смысле, ты имеешь в виду [[Get]]? Или, наоборот, только разрешение имени?

С другой стороны, технически, тогда обычное присвоение тоже создаёт копию ссылки и ничем не отличает от передачи в качестве параметра функции:

var a = {x: 10};
var b = a;

aRef = {baseObject: Global, propertyName: "a"}; // address: 0xFF
bRef = {baseObject: Global, propertyName: "b"}; // address: 0xFF (скопировался)

var a = {x: 20};
aRef = {baseObject: Global, propertyName: "a"}; // address: 0xFА (новый)
bRef = {baseObject: Global, propertyName: "b"}; // address: 0xFF (старый)


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

Но, теоретическая evaluation strategy - остаётся by-sharing, как специально выделенная и обособленная от by-value и by-reference и именно по этому критерию.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 01.11.2009 в 23:41.
Ответить с цитированием
  #15 (permalink)  
Старый 01.11.2009, 23:53
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Ты просто на объекте замкнулся, представь, что объект не меняет свойств, почему сразу свойства дёргать внутри функции. Речь ведь о переменной и изменении её значения, а не о свойствах объекта. Если значением переменной не является объект, а только URL до объекта, то почему изменение свойств объекта (отражаемое везде) является аргументом в пользу by-sharing, и тем более by-ref. Меняем ведь не значение переменной. Это ж очевидно.
Ответить с цитированием
  #16 (permalink)  
Старый 02.11.2009, 00:33
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Zeroglif, на самом деле, мы говорим об одном и том же. Даже в статье об evaluation strategy из Википедии в подразделе by-value говорится о нашем случае:

Сообщение от Wikipedia ::Evaluation strategy :: Call by value
The term "call-by-value" is sometimes problematic, as the value implied is not the value of the variable as understood by the ordinary meaning of value, but an implementation-specific reference to the value. The term "call-by-value where the value is a reference" is common (but should not be understood as being call-by-reference). Thus the behaviour of call-by-value Java or Visual Basic and call-by-value C or Pascal are significantly different: in C or Pascal, calling a function with a large structure as an argument will cause the entire structure to be copied, potentially causing serious performance degradation, and mutations to the structure are invisible to the caller. However, in Java or Visual Basic only the reference to the structure is copied, which is fast, and mutations to the structure are visible to the caller. (See also call-by-sharing....)
И далее, в подразделе by-sharing, так же есть рекурсивная ссылка на подраздел by-value:

Сообщение от Wikipedia ::Evaluation strategy :: Call by sharing
The semantics of call-by-sharing differ from call-by-reference in that assignments to function arguments within the function aren't visible to the caller (unlike by-reference semantics). However since the function has access to the same object as the caller (no copy is made ), mutations to those objects within the function are visible to the caller, which differs from call-by-value semantics.

Although this term has widespread usage in the Python community, identical semantics in other languages such as Java and Visual Basic are often described as call-by-value, where the value is implied to be a reference to the object.
Кстати, там же, есть похожая на by-sharing (и by-value в случае ES, Java и т.д.) стратегия - by-copy-restore.

by-value - это правильно (особенно, если учесть, что данную терминологию использует создатель языка). Но обособление by-sharing для этого случая (что означает ровно то же самое - копирование не целиком массивного объекта (как это было бы в Cи в случае by-value), а копирование лёгкой ссылки), мне кажется оправданным - чтобы не путать именно с by-value, когда передался бы объект-бегемот и менялся бы там внутри функции независимо. Хотя, с другой стороны, by-value в Си - это всего лишь одна из реализаций. Но, эта реализация (и её понятие by-value) появилась раньше JS.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 02.11.2009 в 01:16.
Ответить с цитированием
  #17 (permalink)  
Старый 02.11.2009, 00:53
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Хорошие цитаты. Особенно "but should not be understood as being call-by-reference". В общем, я сегодня почти поставил для себя в этом вопросе окончательную точку. Только вот разберусь с этим твоим call-by-sharing основательнее...
Ответить с цитированием
  #18 (permalink)  
Старый 02.11.2009, 11:35
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

А я, пожалуй, найду время и напишу заметку по этому поводу, чтобы, опять же, ссылаться на неё, а не на вырванные из контекста ответы, если возникнет похожий вопрос. Мотивацией будет этот тред. В общем, будет "by-value" (a.lso k.nown a.s "by-sharing").
__________________
Тонкости ECMAScript
Ответить с цитированием
  #19 (permalink)  
Старый 02.11.2009, 13:40
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Dmitry A. Soshnikov,

Пиши, пиши, вот цитаты B.E. со ссылками:

...the property's value is a *reference* to the object, not the object itself.
http://groups.google.com/group/mozil...ff6fa9deb204e1

JS is not C++. There is no deep or shallow copy on assignment. Object is a reference type, so v2 = v just copies the reference in v into v2, making both variables denote the same object.
http://groups.google.com/group/netsc...dd2121f1fb8424

There is no copy of any object data. The only thing that's copied is a *reference* (a safe pointer, if you will) that uniquely addresses the object.
http://groups.google.com/group/netsc...95f5eef93c1734

Just the reference - objects are reference types in JS, as in Java
http://groups.google.com/group/netsc...79c0c9f86a6336

Что-то по JScript на винграде есть... liskov-y я прочитал (manual языка), да, это был бы подходящий термин, если бы прижился, там они чётко описывают, что значением переменной является reference на объект. Но раз не прижился, то пиарить не буду, только в качестве экскурса... меня полностью удовлетворяет то, как компактно и точно звучит первая цитата в твоём предыдущем сообщении.
Ответить с цитированием
  #20 (permalink)  
Старый 02.11.2009, 14:06
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Zeroglif
вот цитаты B.E. со ссылками
Ага, спасибо.
__________________
Тонкости ECMAScript
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое удаление строк таблицы Tankist Events/DOM/Window 16 03.07.2013 16:42
Удаление атрибута в IE - в чем засада? гвоздик Events/DOM/Window 8 14.10.2009 13:23
Добавление и удаление полей в форму anoth3r Events/DOM/Window 1 11.09.2009 15:10
Не работает удаление элементов vvsh Events/DOM/Window 3 10.08.2009 01:27
Копирование блоков страницы(или целиком) Phoenix Общие вопросы Javascript 30 24.03.2008 23:46