Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> closure - замыкание, сокрытие, приближение? как корректнее перевести 
:(
    Опции темы
rene
Дата 17.11.2006, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Всё-таки у меня есть сомнения насчёт того, что "closure" следует переводить как "замыкание".

Сначала мне думалось, что "closure" это сокрытие(от "close" - закрывать), так как оно скрывает, заключает в себя  
свой локальный контекст плюс ссылки на переменные внешней функции. Но потом меня начал
терзать сомнения.

Статья на Wikipedia Closure
отсылает нас к модели актёра, в которой говориться, что "если актёр имеет адрес одного из других актёров, то они состоят в знакомстве.

"Closure" имеет ссылки на переменные внешней функции, т.е. некая внутренняя анонимная функция знакома с внешней функцией. А "close" - это переводится, в том числе, как "близкий". Может "closure" корректней переводить как "приближение" или "близость"?





Это сообщение отредактировал(а) rene - 18.11.2006, 21:51
PM MAIL ICQ   Вверх
AKS
Дата 17.11.2006, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



rene, действительно, замыкание нельзя назвать "дословным" переводом. Однако на "знакомство" англоязычные авторы этого понятия наверняка также не намекали. 

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

Вообще ведь очень многие вещи дословно не переводятся, и их остается только интерпретировать (ха, все к одному - javascript и все, что с ним связано, должно интерпретироваться  ;)  ).
PM MAIL   Вверх
Nicholas_S
Дата 18.11.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 19



В принципе, можно так и называть - клаузы. Есть такое компьютерное понятие (словарное). Понятие "клаузы" используется, в основном, в понятии предложений, например, в языке Prolog. Я думаю, тут можно тоже так же обозначать эти самые clauses.


--------------------
...все в мире относительно
PM   Вверх
SelenIT
Дата 18.11.2006, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Nicholas_S, clauses != closures ;)


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Nicholas_S
Дата 18.11.2006, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 19



Посмотри в словаре, слова имеют равноправные значения, за исключением того, то у closure их чуть больше  smile
Хотя написать мне стоило, конечно же, closure, а не clauses. 


--------------------
...все в мире относительно
PM   Вверх
SelenIT
Дата 18.11.2006, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



 smile (заранее прошу прощения у модераторов)
Nicholas_S, в каком словаре такое можно увидеть?
Смотрю в lingvo.yandex: clause, closure. Где хоть одно общее значение?



--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Zeroglif
Дата 18.11.2006, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(rene @  17.11.2006,  22:57 Найти цитируемый пост)
Всё-таки у меня есть сомнения насчёт того, что "closure" следует переводить как "замыкание".

Вполне привычный перевод в математике...

В функции могут обитать связанные идентификаторы (коренное население) и могут быть свободные (мигранты). Вызов функции формирует контекст исполнения, с которым связаны первые (строго - вары, формальные параметры, имена вложенных функций), и по определению не могут быть связаны вторые. Мигранты мешают функции "закрыться" в себе (типа я в домике, тут только свои). Чтобы она закрылась нужно найти, откуда приехали чужие, с кем они связаны (где зарегистрированы). Для этого в ECMAScript реализован механизм поиска по окружению (милицейская проверка "scope chain"), где-то там в окружении функции регистрация должна быть найдена, а значит функция "замкнётся". Замыкание.

SelenIT
Русская "клауза", но не "clause"... 
http://www.multitran.ru/c/m.exe?t=1034517_2_1

Это сообщение отредактировал(а) Zeroglif - 18.11.2006, 03:18
PM MAIL WWW   Вверх
rene
  Дата 18.11.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Цитата(Zeroglif @ 18.11.2006,  03:12)
 Для этого в ECMAScript реализован механизм поиска по окружению (милицейская проверка "scope chain"), где-то там в окружении функции регистрация должна быть найдена, а значит функция "замкнётся". Замыкание.

Нет, всё-таки не понимаю почему "замкнётся"? smile  Если она найдётся, то значит они знакомы.
И "модель актера" на это наводит.

Это сообщение отредактировал(а) rene - 18.11.2006, 21:50
PM MAIL ICQ   Вверх
Zeroglif
Дата 19.11.2006, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(rene @  18.11.2006,  21:49 Найти цитируемый пост)
Нет, всё-таки не понимаю почему "замкнётся"?

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

PM MAIL WWW   Вверх
AKS
Дата 19.11.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Не особо разбираясь в программерских терминах ("модель актера" и т.д.), хотел бы дополнить картину, вернувшись к "простому" переводу слова closure. 
Одно из значений глагола close - это замыкать ток. Т.е., сунул два пальца в розетку - получил "два контекста" и короткое замыкание. 
С функциями процесс похож, только замыкание не короткое, а такое, что пока есть ссылки на inner-function - два контекста в памяти браузера, висят, как шаровая молния, сохраняя "напряжение", замкнувшись меж собой... 

 ;) Вот такие у меня "электрические" ассоциации (в силу отсутствия математических и программерских)...

Насчет "знакомства" - трудно судить, кто там с кем именно знаком. Inner-function, по идее, не знает об outer-function ничего, она знает лишь об идентификаторах внешней функции, и то только о тех, которые ее мы "заставляем" использовать. Так что "актеры" вроде бы не знают адресов друг друга...
PM MAIL   Вверх
12345c
Дата 19.11.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Zeroglif, если в 2 словах, то замыкания внутренних функций происходят в момент высвобождения памяти внешней функцией при окончании её; и существуют, если только были присвоены внешним переменным? Больше никаких принципиальных моментов в замыканиях нет?

(А пока сушествует внешняя, то внутренние функции ведут себя как простые, имеющие ссылки на временные переменные внешней функции, равно как и ссылки на глобальные переменные.)

Кстати, а что произойдёт, если сделаем delete var1; для глобальной переменной, используемой в некоторой функции? Замыкание или ошибочная ссылка?

Добавлено @ 13:06 
AKS, по терминам электротехники, пальцами "короткое" замыкание не сделаешь. сопротивление тела - десятки килоом. Короткое - когда низкоомное с эффектом сгорания проводов или предохранителей. smile

Добавлено @ 13:13 
Цитата(12345c @  19.11.2006,  13:03 Найти цитируемый пост)
и существуют, если только были присвоены внешним переменным?
уточню: замыкания-функции существуют, если определения внутренних функций были присвоены внешним, например, глобальным переменным:

Код
var b;
function a(){
var c=1;
b=function (){var x=c+.../*будет замыканием под именем b*/}
}

PM WWW   Вверх
rene
Дата 19.11.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Цитата(AKS @ 19.11.2006,  12:49)
Одно из значений глагола close - это замыкать ток. Т.е., сунул два пальца в розетку - получил "два контекста" и короткое замыкание. 

когда говорят о коротком замыкании в электричестве обычно используют слово "short", например:
short circuit

Добавлено @ 14:43 
Цитата(Zeroglif @ 19.11.2006,  03:33)
Функция, не содержащая свободных идентификаторов, считается замкнутой. Аксиома. Ибо на то она и чёрный ящик, локальность ей дороже денег. В Javascript функции равноправны с другими значениями и могут летать туда-сюда. Во время этих полётов связанным идентификаторам будет всё нипочём, а вот свободным позарез нужно не потерять связь со своим домом, поэтому функция-замыкание берёт с собой в полёт контекст, который держит эту связь. С помощью контекста с точки зрения функционального программирования свободные идентификаторы можно посчитать связанными, а значит функция замыкается...

Извиняюсь за упрямство. smile 

Zeroglif:
Цитата

Функция, не содержащая свободных идентификаторов, считается замкнутой. Аксиома. 

Можно источник аксиомы?

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

Предпологаю, что  перевод "closure" появился
сначала в переводных книгах по Perl, где это слово  было переведено, как "замыкание".
Затем этот преревод перекочевал в другие переводы, где переводили по аналогии.


PM MAIL ICQ   Вверх
AKS
Дата 19.11.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



12345c, 
Цитата

пальцами "короткое" замыкание не сделаешь

А у меня и с электричеством поверхностное знакомство (как со всем остальным). Поэтому стараюсь чаще смайлики вставлять... ;)
Цитата

delete var1;

Переменные нельзя удалить оператором delete.

rene, 
Цитата

обычно используют слово "short", 

Я ведь не знаю об их "обычаях". Все беру из словаря (close - замыкать (ток)).
Цитата

она имеет их адреса, значит она с ней "знакома".

Все же она с ней "не знакома":
Код

(function() {
  return (function() { alert(arguments.callee.caller); });
})()(); // return null;

PM MAIL   Вверх
Zeroglif
Дата 19.11.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата

Извиняюсь за упрямство.

Хорошо. Пусть будет Javascript сам по себе, "closure/замыкание" в функциональном программировании само по себе. Описание замыканий применительно к Javascript - это в некоторой степени притягивание устоявшейся терминологии за уши, с этим можно соглашаться, можно не соглашаться. По факту JS-сообщество (включая шишек-разработчиков) приняло этот термин, его использует, он быстрый, понятный, плюс-минус точно отражает суть. Протестовать против замыкания как термина так же бесполезно, как бороться с хешами, ассоциативными массивами, классами в ECMAScript. Называют и называют. Лично мне не сложно мысленно переложить механизм ECMAScript на рельсы функционального программирования - "замыкание", "свободные переменные", "связанные переменные" и т.п., так проще и самому понять и объяснить другим. Хотя мне же ближе по смыслу и духу терминология, принятая в очень хорошей книжке товарища Абельсона "Структура и интерпретация компьютерных программ" (.pdf), где это дело называется "модель вычислений с окружениями". Замыкание там не рассматривается с привычной нам стороны, ECMAScript-овая scope chain там можно сопоставить, как покадровое разбиение вычислений, где рулят пары, каждая пара - это объект плюс окружение...

Цитата

Можно источник аксиомы?

Можно. Это из весьма уважаемой книжки товарища Филда "Функциональное программирование" (.djvu), несколько почти цитат (убрал лямбду, сократил текст) надёрганных оттуда (из разных мест, но даю одним блоком):

Цитата

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


p.s. Обязательно кликните по всем трём ссылкам в тексте, это нужно прочитать.
PM MAIL WWW   Вверх
AKS
Дата 19.11.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, 
Цитата

Описание замыканий применительно к Javascript - это в некоторой степени притягивание устоявшейся терминологии за уши...

А почему "за уши"? Вроде бы все сходится:
Цитата

Такая составная структура (функция плюс контекст) называется замыканием...

PM MAIL   Вверх
AKS
Дата 19.11.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, скачал "Функциональное программирование".djvu. А что за расширение и как к нему "подобраться"?
PM MAIL   Вверх
Zeroglif
Дата 19.11.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  19.11.2006,  18:59 Найти цитируемый пост)
djvu. А что за расширение и как к нему "подобраться"?

http://windjview.sourceforge.net/

Цитата(AKS @  19.11.2006,  18:59 Найти цитируемый пост)
Переменные нельзя удалить оператором delete.

Код

eval('var x = 0');
var y = 1;
delete y;
alert(y);
delete x;
alert(x);


Цитата(12345c @  19.11.2006,  13:03 Найти цитируемый пост)
Zeroglif, если в 2 словах, то замыкания внутренних функций происходят в момент высвобождения памяти внешней функцией при окончании её; и существуют, если только были присвоены внешним переменным? Больше никаких принципиальных моментов в замыканиях нет?

Имхо, с одной стороны, нет принципиальной разницы в том, вернули функцию или она просто работает внутри. Всё тот же доступ к scope chain. Но с другой стороны, наибольший (наглядный) смысл "замыкания" приобретают именно после выхода из объемлющей функции, когда вложенная функция продолжает жить (может и не одна, а несколько под каждый вызов с разными значениями), переживая своё лексическое окружение. Поэтому D.Cornford связывает появление замыкания именно с жизнью после смерти:

Цитата

A closure is formed when one of those inner functions is made accessible outside of the function in which it was contained...

PM MAIL WWW   Вверх
SelenIT
Дата 19.11.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, насколько я понимаю, это некий open-source'ный аналог PDF. Вот навскидку нашел 2 читалки: отдельная и плагин для браузера...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 19.11.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



О, скачал WinDjView! Тольк читать страшно - "SECD-машина, ленивая SECD-машина".        ;)

Zeroglif, 
Код

eval('var x = 0');

Очередной трюк. Почему переменная не получает атрибут { DontDelete }?

Добавлено @ 20:00 
Zeroglif, вот это да! Я и не знал, что eval такой "коварный" - можно даже функцию удалить:
Код

eval('function F() { alert("F"); }');
delete F; 
alert(F); // а нету F


Это сообщение отредактировал(а) AKS - 19.11.2006, 20:01
PM MAIL   Вверх
AKS
Дата 19.11.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, с этим eval (evil as D.Crockford sad) надо бы разобраться:
Код

//IE only
var x = 1;
(function() {
    eval.call(window, 'var x = 2;'); // nothing happened
})();
alert(x);                            // it's still 1
(function() {
    eval.call(window, 'x = 2;');     // new value is copied into x
})();
alert(x);                            // return 2

PM MAIL   Вверх
12345c
Дата 19.11.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Цитата(Zeroglif @  19.11.2006,  19:22 Найти цитируемый пост)
eval('var x = 0');
var y = 1;
delete y;
alert(y);
delete x;
alert(x);
А странно. Почему "var y=1;" удалить нельзя, а просто "y=1;" - можно? Это замысел или своеволие? И то же к сути примера, почему "eval var x" удаляется?

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

PM WWW   Вверх
Zeroglif
Дата 20.11.2006, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  19.11.2006,  23:23 Найти цитируемый пост)
Почему "var y=1;" удалить нельзя, а просто "y=1;" - можно?

Потому что в первом случае переменная, а во втором - свободный идентификатор, который позже станет свойством global object, т.к. никому не принадлежит изначально. Все переменные в процессе конкретизации становятся свойствами определённого variable object с аттрибутом DontDelete (ECMAScript 10.2).

Цитата(12345c @  19.11.2006,  23:23 Найти цитируемый пост)
И то же к сути примера, почему "eval var x" удаляется?

Для кода eval при конкретизации переменных аттрибут DontDelete не задаётся (ECMAScript 10.2.2).

Цитата(12345c @  19.11.2006,  23:23 Найти цитируемый пост)
Это замысел или своеволие?

Чей-то своевольный замысел... smile

PM MAIL WWW   Вверх
12345c
Дата 20.11.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Цитата(Zeroglif @  19.11.2006,  19:22 Найти цитируемый пост)
Имхо, с одной стороны, нет принципиальной разницы в том, вернули функцию или она просто работает внутри. 
Пример, показывающий, что "зомби" при жизни окружения ведут себя как простые функции smile

Код
<script>d=document;

function fa(){
var c=1;
fb=function (){return c+1;/*будет замыканием под (глобальным) именем fb*/}
    // пока что прообраз замыкания ведёт себя как простая функция:
  d.write(fb()+'<br>'); //первый раз показывает 2
  c++;
  d.write(fb()+'<br>') //теперь выдаёт 3
  c++;
}
fa()
  d.write(fb()+'<br>') //теперь - 4, несмотря на то, что "c" уже нет
</script>
fb "зомбировано" на запоминание удаляемого окружения при окончании внешней функции.
Пример 2 - попытаемся удалить глобальную переменную, чтобы как-то зазомбировать на её значение.

Код
//2-й эксперимент

a=1;
(function(){
  f=function(){return a+1;}
  d.write(f()+'<br>')
  a++;
  //delete a; //ни здесь не удастся искусственно зомбировать функцию на пропавшую "а", ни ниже
})()
delete a;
d.write(f()+'<br>') //даёт ошибку о том, что "a" нет. Не зомбируется.
Итого, конечно, механизм зомбирования в момент окончания функции легко реализовать, а удаление глобальных переменных в произвольных местах - где ловить? Реализация была бы тяжёлой.

Цитата(Zeroglif @  20.11.2006,  00:33 Найти цитируемый пост)
Все переменные в процессе конкретизации становятся свойствами определённого variable object с аттрибутом DontDelete
Можно как-то получить доступ к этому атрибуту?

(Ещё вопрос, никто не знает, чем перловые замыкания отличаются от JS?)

Это сообщение отредактировал(а) 12345c - 20.11.2006, 02:06
PM WWW   Вверх
Zeroglif
Дата 20.11.2006, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  20.11.2006,  01:38 Найти цитируемый пост)
Пример, показывающий, что "зомби" при жизни окружения ведут себя как простые функции

А чем простая функция отличается от "зомби"? Что первая, что вторая не знают есть переменная или нет, они только держат цепочку объектов, которую им нужно обойти, чтобы найти определённый идентификатор.

Цитата(12345c @  20.11.2006,  01:38 Найти цитируемый пост)
несмотря на то, что "c" уже нет

А "с" условно говоря никогда и не было, есть только scope chain, функция деталей (имён, значений) не видит. Например, локальной переменной в момент определений вложенной функции и в момент её вызова изнутри может вообще не существовать.

Код

var f;

(function () {
    // в момент создания функции "x" не существует
    f = function(){
        return typeof x + '<br>';
    }
    // в момент вызова то же самое
    document.write(f());
    // через eval добавим локальную переменную х
    eval('var x = \'var\'');
})();

// только теперь замыкание находит "x"
document.write(f());


PM MAIL WWW   Вверх
Zeroglif
Дата 20.11.2006, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  20.11.2006,  01:38 Найти цитируемый пост)
Пример 2 - попытаемся удалить глобальную переменную, чтобы как-то зазомбировать на её значение.

Богат русский язык на обороты. smile 

Если будет удалена переменная, то замыкание само собой её не найдёт, т.к. не найдёт свойства с таким именем в scope chain, никаких значений оно не запоминает. Нормальное поведение. По сему тут нужно или вставлять в scope chain дополнительный объект или передавать значение переменной во вложенную функцию, или создавать некое свойство в функции и работать уже с ним. В общем без переделки не обойтись. Например, так:

Код

with({a:a}) f=function(){return ++a;}

PM MAIL WWW   Вверх
AKS
Дата 20.11.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, 
Цитата

аттрибут DontDelete не задаётся (ECMAScript 10.2.2).

Ну вот, обломался я. Думал с утра в "следопыты" опять подамся, начну очередное "мини-исследование" с eval. А оказывается все давно "черным по белому"... smile
Вообще, логично все получается - нельзя в момент экзекуции установить какие-либо внутрение атрибуты. 
PM MAIL   Вверх
rene
Дата 21.11.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Попробывал изобразить "closure":

Код

function A()
{
       var hi="Hello"
       return function() { var name="Earl"; alert(hi+" "+name) }
}
var a = A()
a()



Это сообщение отредактировал(а) rene - 21.11.2006, 20:08

Присоединённый файл ( Кол-во скачиваний: 26 )
Присоединённый файл  closure.jpg 23,84 Kb
PM MAIL ICQ   Вверх
Zeroglif
Дата 22.11.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(rene @  21.11.2006,  20:07 Найти цитируемый пост)
Попробывал изобразить "closure"

Наглядно. А в какой программе можно быстро и удобно строить такие схемы как эти:

http://billhails.net/Book/closure-captures-env-n.png
http://billhails.net/Book/closure-extends-env-n.png

кстати, это замыкание, так что не оффтоп smile

PM MAIL WWW   Вверх
SelenIT
Дата 24.11.2006, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Zeroglif, а у меня наверное оффтоп, но очень-очень близкий: как по-русски можно грамотнее всего "обозвать" Scope chains?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 24.11.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, а я тут по-быстрому выскажусь, пока вы все спите ;)...
Цитата

как по-русски можно грамотнее всего "обозвать"

Как грамотнее - незнаю, а вот если "чисто" по-русски "обозвать", то могу вот так попробовать:
Scope chain - ряд необходимых (видимых) объектов для исполняемой процедуры.
PM MAIL   Вверх
Zeroglif
Дата 24.11.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(SelenIT @  24.11.2006,  01:31 Найти цитируемый пост)
Zeroglif, а у меня наверное оффтоп, но очень-очень близкий: как по-русски можно грамотнее всего "обозвать" Scope chains?


Коротко фиг обзовёшь. Вот, например, как совсем не коротко, но зато метко описывается это дело у Харольда Абельсона и Джеральда Джея Сассмана (Структура и интерпретация компьютерных программ):

Цитата

Lexical scoping - лексическая сфера действия переменных, правило лексической сферы говорит, что свободные переменные в процедуре ссылаются на связывания в объемлющих определениях процедур; то есть они ищутся в окружении, в котором процедура определена. Окружение - это последовательность кадров. Каждый кадр есть таблица связываний, которые сопоставляют имена переменных соответствующим значениям. Значение переменной по отношению к данному окружению есть значение, которое находится в связывании для этой переменной в первом кадре окружения, содержащем такое связывание.

В том же русле, но уже на базе родного ECMAScript сжато я бы сказал так:

Цитата

Scope chain - это формируемая при исполнении функции/программы цепь объектов, которые при вычислении идентификатора последовательно опрашиваются на наличие свойства, имя которого совпадает с именем идентификатора.

Если совсем закоротить для удобства:

Цитата

Цепь объектов в лексическом окружении.

Ещё короче не горазд. smile


Это сообщение отредактировал(а) Zeroglif - 24.11.2006, 12:24
PM MAIL WWW   Вверх
SelenIT
Дата 24.11.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, Zeroglif, спасибо! Zeroglif, Ваше второе определение вообще блеск, лучше для понимания, наверное, сформулировать просто невозможно. ++


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
12345c
Дата 25.2.2007, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



А исходное понятие closure лучше перевести (точнее, переназвать) как связывание или функция со связанными переменными.

Или ещё полнее, функция со связанными временными переменными (которые закончили своё существование).


(При этом, если такого связывания нет, логичнее называть function функцией, как все делают, а не озадачивать народ глобальным утверждением, что в JS все функции - closures.)
PM WWW   Вверх
Zeroglif
Дата 26.2.2007, 03:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  25.2.2007,  23:34 Найти цитируемый пост)
как связывание или функция со связанными переменными

Наоборот. Если все переменные в функции (binding form) связаны (bound), то откуда тогда взяться замыканию. A вот ежели переменные не связаны своей функцией (free), то налицо оно самое, то есть, как минимум, функция должна быть со свободными переменными (опустим для простоты причуды с возможной eval-изацией строки в переменную)...

Цитата(12345c @  25.2.2007,  23:34 Найти цитируемый пост)
функция со связанными временными переменными (которые закончили своё существование)

Имхо умирают и заново рождаются только локальные bindings, а те, что ищутся в лексическом окружении, они как бы создаются единожды в момент создания функции (будущего замыкания). Я про имена, не про значения.

Чтобы всё-таки вычленить замыкание из ряда остальных функций, что определённо имеет смысл, я бы сказал, что это функция, которая:

1) пережила контекст исполнения, в котором она была создана;
2) имеет на борту свободные переменные;

Два основных лейбла. Под переменными подразумевается понятно что.


Это сообщение отредактировал(а) Zeroglif - 26.2.2007, 03:25
PM MAIL WWW   Вверх
12345c
Дата 26.2.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Я имел в виду связывание с константой или значением, оставшимся после закрытия переменной. Т.е., в терминах "free", это возможно как раз с free vars. Которые можно описать как определённые вне функции, но временные, не глобальные. Не параметры своей функции и не создавшиеся в ней.

Что считать free variables - локальные и глобальные или только локальные? Как я понимаю, свойства closure проявляются только с локальными free.

Тогда, если термин "связывание" занят под противоположным действием - связыванием с переменными, то как назвать связывание с константой после закрытия (удаления) переменной?
PM WWW   Вверх
AKS
Дата 26.2.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



А может быть под термином closure нужно понимать совсем другое "явление природы"?
Может быть замыкание - это факт существования Activation/Variable объекта outer-функции в св-ве [[Scope]] inner-функции?
А момент, когда на объект inner-функции не останется ссылок и Activation/Variable объект outer-функции станет доступным для удаления из памяти, можно назвать "концом жизни" замыкания.
PM MAIL   Вверх
Zeroglif
Дата 26.2.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  26.2.2007,  12:21 Найти цитируемый пост)
Которые можно описать как определённые вне функции, но временные, не глобальные.

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

Цитата(12345c @  26.2.2007,  12:21 Найти цитируемый пост)
Что считать free variables - локальные и глобальные или только локальные? Как я понимаю, свойства closure проявляются только с локальными free.

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

Цитата(12345c @  26.2.2007,  12:21 Найти цитируемый пост)
как назвать связывание с константой после закрытия (удаления) переменной

В том и дело, что переменная (имя) не удаляется, если живёт замыкание, то живёт и [[Scope]], живут и все свободные переменные (имена). Технически (не углубляясь в специфику) переменную связывает определённый Variable Object, который создаётся один раз и не умирает, т.к. он сильно нужен замыканию, ибо оно может обращаться к свободным переменным, пытаясь найти связь в одном из Variable Objects.

p.s. вышеописанное - есть смесь чуждых и не чуждых javascript терминов smile

Добавлено @ 13:12 
Цитата(AKS @  26.2.2007,  12:45 Найти цитируемый пост)
А может быть под термином closure нужно понимать совсем другое "явление природы"? Может быть замыкание - это факт существования Activation/Variable объекта outer-функции в св-ве [[Scope]] inner-функции?

Именно так, я уже писал раньше в этой ветке, что функциональная терминология немного притянута за уши (ну, и бог с ней). Важен не только факт существования Activation/Variable объектов, важна и множественность такого существования под каждое замыкание...
PM MAIL WWW   Вверх
12345c
Дата 26.2.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Цитата(Zeroglif @  26.2.2007,  13:07 Найти цитируемый пост)
В том и дело, что переменная (имя) не удаляется, если живёт замыкание, то живёт и [[Scope]], живут и все свободные переменные (имена).
Действительно, небольшой пример это показывает:
Код
<script>
f1=function(){
  var i=1
  f3=function(){return i;} //для "усиления эффекта" ставим опр. f3 выше
  f2=function(){return ++i;} //меняем i, чтобы увидеть связанность его с f3
}
f1(); //делаем f2,f3 с сохранённым i
alert([f2(),f3()]) // даст 2,2 , что оБнаружит общий указатель на бывший i
</script>


Добавлено @ 13:50 
Цитата(Zeroglif @  26.2.2007,  13:07 Найти цитируемый пост)
Понимаешь, в этом смысле что глобальные, что "временные" технически суть одно и то же, если смотреть на них из-под замыкания, которое видит только строгую цепочку объектов в [[Scope]].
Да, но глобальные переменные не вызывают ощущения "чудес", если читатель кодов не знает про особенности функций в JS. Стоит глобальная переменная и стоит, оставаясь такой. Интуитивно предполагается, что глобальная не должна становиться значением в момент определения функции, а локальная должна, потому что известно, что она прекратит существование. Создатели поступили наоборот: живут все как переменные, более того, временные продолжают жить. Ну зомби натуральные.

PM WWW   Вверх
Sardar
Дата 26.2.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Самое интересное, что легко узнать ещё на момент трансляции все переменные, используемые внутри closure. Отсюда действительно можно сделать "оптимизацию", физически разделив представление closure (функция связанная с лексическим контекстом) и функции (свободная функция).


12345c, в примере ты создал функции в переменных f2 и f3, не объявленных ранее, что привело к их автоматическому созданию в "самом верхнем контексте" a.k.a global. Это не очень хороший приём, т.к. засоряет global пространство имён.

Добавлено @ 14:01 
Цитата(12345c @  26.2.2007,  12:41 Найти цитируемый пост)
если читатель кодов не знает про особенности функций в JS

Знакомые с любым декларативным и"полу-декларативным" языком сразу всё поймут smile

Цитата(12345c @  26.2.2007,  12:41 Найти цитируемый пост)
живут все как переменные, более того, временные продолжают жить. Ну зомби натуральные.

Лучше всего понять это разделив переменную на значение и ссылку на значение. Объявляя переменную мы объявляем ссылку, присваивая значение мы изменяем ссылку на новое значение. Когда объект значение не имеет более ни одной ссылки, то он удаляется сборщиком мусора. Closure держит ссылки на все используемые значения, потому последние из памяти не удаляются, до тех пор, пока хоть кто нибудь ссылается на сам closure.

Кстати, раз много-поточности в JS нет, то сборщик мусора реализуется элементарным подсчётом ссылок при каждой операции присвоения.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sardar
Дата 26.2.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Sardar @  26.2.2007,  12:56 Найти цитируемый пост)
Самое интересное, что легко узнать ещё на момент трансляции все переменные

Впрочем тут нужна поправка, в случае настоящего JS полностью отбросить ссылку на родительский контекст нельзя (тем самым освободив ссылки на все не используемые значения, а следовательно возможно освободив и сами значения). А всё потому что eval должен видеть все переменные, как и "обычный код":

Код
function test(c) {
    var a = 90;
    var b = 70;
    function cool(c) {
        alert('In: '+ (a+=5));
        eval("alert('In: ' + (b+="+c+"));");
    }
    cool(c);
    alert('Out: '+a);
    alert('Out: '+b);
}
test(5);


В примере видим, что для cool необходим только а, а b необходима не явно (отследить транслятором нельзя). Если реализовать функции и контексты эффективно, то мы отбросим контекст test, тогда eval должен вывести NaN (автоматом созданная b в global будет undefined, последующая арифметика в NaN). Но бродилки "правильно" выполняют код, показывая что все родительские контексты реально сохраняются. Впрочем транслятор может быть на столько умён, что бы отслеживать появление eval и сохранять контексты тогда, когда это нужно. Но это не оправдывает излишней свободы eval, препятствующей эффективной по памяти реализации closure/функций.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
12345c
Дата 26.2.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Этот пример ничего не показывает - до выхода из test перем. b сохраняется. Модифицируем:

Код
<script>function test(c) {
    var a = 20;
    var b = 10;
    prnt("Вызвана test("+c+")");
    ff=function(c) {
        prnt("Вызвана ff("+c+")");
        prnt('a++: '+ (a++));
        eval("prnt('b+=\"c\": ' + (b+="+c+"));");
        prnt("Выход из ff("+c+")");
    }
    ff(c);
    prnt('Out_a: '+a);
    prnt('Out_b: '+b);
    prnt("Выход из test("+c+")");
}

onload=function(){
  test(5);
  ff(3);
}
prnt=function(a){document.body.innerHTML+=a+'<br>';}
</script>
Он действительно показывает, что b сохраняется.
Код
Вызвана test(5)
Вызвана ff(5)
a++: 20
b+="c": 15
Выход из ff(5)
Out_a: 21
Out_b: 15
Выход из test(5)
Вызвана ff(3)
a++: 21
b+="c": 18
Выход из ff(3)

Но весь сыр-бор не для этого, а чтобы проверить, как влияет eval на скорость операций. Допишем:
Код
<title>Check scope saving for eval operators in closures</title>
<script>
function test(c,if1,n){
    var a = 20;
    var b = 10;
    ff=function(c){
        a++;
        if(!if1)eval("prnt('b+=\"c\": ' + (b+="+c+"));");
    }
    for(var i=0;i<n;i++)ff(c);
}
function test2(c,if1,n){
    var a2 = 20;
    var b2 = 10;
    ff2=function(c){
        a2++;
        if(!if1)a2+=c;
    }
    for(var i2=0;i2<n;i2++)ff2(c);
}


onload=function(){
tt=new Date().getTime();
  test(5,1,500000);
  ff(3,1,100);
  prnt('eval.time='+(new Date().getTime()-tt));
tt=new Date().getTime();
  test2(5,1,500000);
  ff2(3,1,100);
  prnt('eval.time2='+(new Date().getTime()-tt));
tt=new Date().getTime();
  test(5,1,500000);
  ff(3,1,100);
  prnt('eval.time='+(new Date().getTime()-tt));
tt=new Date().getTime();
  test2(5,1,500000);
  ff2(3,1,100);
  prnt('eval.time2='+(new Date().getTime()-tt));
}
prnt=function(a){document.body.innerHTML+=a+'<br>';}
</script>
<div>Проверим, насколько разумен браузер в забывании неиспользуемого окружения. <br><br>

Он не знает, что будет под eval, поэтому для "корректной" работы должен запомнить всё окружение.
</div>
Посмотрим, что будет быстрее: функция с eval, но не выполняющая его из-за выбора параметра (но транслятор должен учесть, что в теле eval есть). Или функция без eval с тем же объёмом операций.

2 пары - потому что они имеют обыкновение останавливаться и спрашивать: работать ли дальше?
Результаты говорят, что обе функции работают с одинаковой скоростью, наличие eval не усугубляет время выполнения (IE6, FF2).

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

Сделать конструктор временного массива вместо b? (Почти доказано, что в окружении он сохранится.) Устроить утечку памяти и измерять скорость её роста? Второе интересно. Если сделать функцию, отхватывающую по 1-10 К памяти на временные переменные, и создавать такие функции в цикле, то по скорости роста памяти можно сказать, образумливается когда-либо браузер с запоминанием окружения или нет, очищает ли он когда-либо память окружения.

Это сообщение отредактировал(а) 12345c - 27.2.2007, 15:51
PM WWW   Вверх
Sardar
Дата 26.2.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(12345c @  26.2.2007,  21:40 Найти цитируемый пост)
Этот пример ничего не показывает

Цитата(12345c @  26.2.2007,  21:40 Найти цитируемый пост)
Но весь сыр-бор не для этого, а чтобы проверить, как влияет eval на скорость операций.

Нет, пример был что бы показать не возможность "отброса лишнего" при трансляции кода в байткод. Именно потому, что в JS код уже не является константой, а может модифицироваться из-за eval (тело функции другое из-за eval). Следовательно транслятор не способен определить какие ресурсы использует функция до этапа выполнения (изыскания на эту тему в фунегоидных языках). Другими словами реализуя интерпретатор JS я не смогу реализовать сохранение контекстов эффективно (в примере контекст от test будет висеть в памяти, удерживая ещё и b, хотя это не всегда нужно).

Это к тому, что из-за такой казалось бы малой фичи как полная видимость переменных в eval делает код JS сложно транслируемым в бинарник. Просто мысли, к реальным браузерам не имеет отношения. Твой тест всего лишь показывает, что транслятор бродилки ипосльзоуемой в тесте возможно не так умён, что бы выявить closure без eval (возможно он вообще AST дерево эвалюирует), хотя такая фишка не очень сложна в реализации  smile 


P.S. все мои мысли по поводу реализации JS из-за прошедшей лабы, написал язык Forthy, где объекты и closure реализованы почти как в JS. Eval не реализовывал (возможен парсинг и выполнение в рантайме, но видимы будут только используемые статическим кодом переменные), естественно контексты вышли фиксированными по размеру с линковкой по ссылке на этапе трансляции - читай шустро как в C'ях smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
12345c
Дата 27.2.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



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

Трансляция с eval видится возможной в виде гибрида - известный код транслируется, а в случае eval остаётся окружение с интерпретатором. И привязка машинных объектов к окружению (представление данных будет другим, поэтому надо иметь процедуру чтения машинного представления данных в интерпретаторе и наоборот).

Но, возвращаясь к коду в браузерах, не очень приятное "открытие", что сохраняется весь контекст временных переменных в closure. Осталось выяснить, без eval он также будет сохранять весь контекст?
PM WWW   Вверх
Sardar
Дата 27.2.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(12345c @  27.2.2007,  11:27 Найти цитируемый пост)
А ты свой переделывал в Пай-код? Или делался с расчётом на возможность трансляции до машинного?

Да в байткод (p-код). Его можно развернуть до машинного, но по сути будет масса вызовов функций (или threaded код), опкоды высокоуровневы (стек ориентированны). На следующей лабе попробую реализовать интерпретатор с JIT'ом (за одно попробую регистр-ориентированный p-код, как в parrot)

Цитата(12345c @  27.2.2007,  11:27 Найти цитируемый пост)
поэтому надо иметь процедуру чтения машинного представления данных в интерпретаторе и наоборот

А ничего совершенно не отличается, если только не применять через-чур агрессивные оптимизации, а их не просто реализовать. Контексты функций это фиксированные по размеру массивы (линковка по ссылке), объекты это хеш-таблицы (линковка в рантайме по имени), переменные это вероятней всего tagged ссылки и т.д.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
12345c
Дата 27.2.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Вношу коррективу: вначале я измерял время по последнему скрипту не совсем правильно - вызывал одну и ту же первую функцию с eval по недосмотру. Сейчас исправил код, уменьшил счётчик в 10 раз, чтобы не было остановов в FF, и вот что FF2 выдал:

Код
eval.time=2688
eval.time2=187
eval.time=2625
eval.time2=188
Нечётные времена в мсек - c eval, чётные - без. Разница отлично заметна. Значит, интерпретатор учитывает наличие eval в коде функции и сильно тормозит, несмотря на то, что код eval не исполняется. В IE6 другая картина:
Код
eval.time=156
eval.time2=156
eval.time=141
eval.time2=140
 - ему всё равно, он работает с одинаковой скоростью и всегда немного быстрее.
"Самый быстрый в мире" Opera9.0 работает типично так:
Код
eval.time=266
eval.time2=62
eval.time=266
eval.time2=78
Тоже видна чувствительность к eval, но не столь катастрофичная. Всё это было с параметрами 
Код
  test(5,1,50000);
  ff(3,1,100);
...
  test2(5,1,50000);
  ff2(3,1,100);


Добавлено @ 16:18 
(И при этом в предыдущем эксперименте показано, что b сохраняется в IE в любом случае.)
PM WWW   Вверх
Zeroglif
Дата 27.2.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  27.2.2007,  16:05 Найти цитируемый пост)
Разница отлично заметна. Значит, интерпретатор учитывает наличие eval в коде функции и сильно тормозит, несмотря на то, что код eval не исполняется.

A ты пропиши методу полное имя - window.eval
PM MAIL WWW   Вверх
12345c
Дата 27.2.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Оригинально, но возвратимся к первому коду от Дата 26.2.2007, 22:40, с трассировкой, и получим (с window.eval()) в Опере-9, чтобы проверить, не теряется ли пространство имён:
Код
Вызвана test(5)
Вызвана ff(5)
a++: 20
---Конец документа---, а в ошибках:
name: ReferenceError
message: Statement on line 1: Reference to undefined variable: b
В FF,IE при этом нормально.
PM WWW   Вверх
Zeroglif
Дата 22.6.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



!!!Отличная новость, напрямую связанная с замыканиями в IE.

MS на днях выпустила обновление, устраняющее известные многим утечки памяти. Цитирую, какую именно проблему пофиксили:

Цитата

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


кросспостинг на xpoint-е

Это сообщение отредактировал(а) Zeroglif - 22.6.2007, 21:07
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1079 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.