LINUX.ORG.RU

Why static languages sucks?

 


0

2

Возьмем банальный пример из динамического языка

<html>
<head>
</head>
<body>

<div class="bar">div</div>
<div class="foo">div</div>
<div class="bar">div</div>
<div class="foo">div</div>
<div class="bar">div</div>
<div class="foo">div</div>
<div class="bar">div</div>
<div class="foo">div</div>
<script>

chngColor=function(){this.style.background="red"}
var wantedDivs = document.querySelectorAll('.foo');
for (var i = 0; i < wantedDivs.length; i++) {
    wantedDivs[i].addEventListener('click', chngColor);
}
</script>
</body>
</html>

Динамическое связывание, в данном случае, дает нам сразу 2 профита. Во-первых, мы экономим память, так как навешиваем на все требуемые элементы один и тот же обработчик. Во-вторых, это значительно повышает выразительность нашего языка, поскольку нам не надо доставать каждый элемент в отдельности и прописывать ему метод. Кода гораздо меньше, память экономим, выразительность повышается. Статика, соответственно сосет в сторонке. Как-то так.

UPD тему закрываю, поскольку, похоже, никто даже не понял (кроме йогурта, конечно), на текущий момент, о чем тут речь идет. Феерично!



Последнее исправление: J-yes-sir (всего исправлений: 2)

Ответ на: комментарий от J-yes-sir

переменные с this связываются динамически

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

o.call({a: 1})

f.call({a: 1}), call (в котором [native code]) связывает this с o, да.

проблемы ++ меня не волнуют.

Проблемы? Речь про то что там всё так же

int A::f() const { return this->a; }
std::mem_fun_ref(&A::f).operator()({1});
std::mem_fun_ref(&A::f).operator()({2});
motto
()
Ответ на: комментарий от motto

Я там ошибся, имелось в виду

f=function(){return this.a}
f.call({a: 1}) // 1
а это примерно то же, что в лиспе c динамич. связыванием
(define (f arg) (let (a 1) (arg)))
(define (inner) (write a))
(f inner) // 1
Разница в том, что конструкция (let (a 1)) в лиспе каждый раз заново вычисляется, а в JS {a: 1} может быть статично. Но никто не мешает ее получать динамично, черех new, например, и тогда идентичность будет 100%. И, в любом случае, к связыванию, непосредственно, это не имеет отношения И нет никакой разницы, native или нет. Во всех языках есть синтаксис и нативные ф-ции, это ничего не меняет.

J-yes-sir
() автор топика
Ответ на: комментарий от J-yes-sir

А кто сказал, что я их не беру.

В статике рефлексию берут в крайнем случае, надо учитывать, если ты хочешь именно этого, то нет, спасибо — задачи у тебя всё равно нет.

миксинами синглтонами и прочим непотребным дерьмом

прототипы делегирование и экстремально позднее связывание. Медитируй.

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

где написано, что он лексический, ткни пальцем.

Там предлог «и» — LexicalEnvironment _и_ ThisBinding (_и_ VariableEnvironment), http://www.ecma-international.org/ecma-262/5.1/#sec-10.3.

Да? А как же они объясняют

http://www.ecma-international.org/ecma-262/5.1/#sec-10.4.2

motto
()
Ответ на: комментарий от motto

Там предлог «и»

Вот именно, что и, читай: лексическое окружение и динамическое связывание.

The value associated with the this keyword within ECMAScript code associated with this execution context.

текущий контекст выполнения. Тебе поменьше доков надо читать, они плохо влияют на тебя.

нет нужды определять тотальный порядок на множестве языков.

Нет нужды. Мыи и не определяем порядок. Мы просто констатируем факт: статические языки — есть слабые языки, динамические, соответственно — сильные.

Первый шаг к ослаблению языка — запретить динамическое связывание. Второй шаг — запретить присваивание. Мы получаем в итоге экстремально слабый и экстремально «безопасный» язык. Основная часть языков болтается между этими крайностями.

J-yes-sir
() автор топика
Ответ на: комментарий от J-yes-sir

читай: лексическое окружение и динамическое связывание.

Нет там такого.

http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lexical-environments-co...

http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lexical-environments-co...

http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-2-lexical-environments-ec...

http://dmitrysoshnikov.com/ecmascript/chapter-3-this

Не вижу ничего кроме лексического implicit значения.

Первый шаг к ослаблению языка — запретить динамическое связывание.

Это что?

http://en.wikipedia.org/wiki/Scope_(computer_science)

http://en.wikipedia.org/wiki/Late_binding

Динамическое окружение делается где угодно. Нет распространённых языков общего назначения где бы оно использовалось по умолчанию.

Второй шаг — запретить присваивание.

Но нет распространённых языков общего назначения в которых было бы запрещено присваивание, есть языки в которых есть контроль за ним (C++, D, Rust, Haskell, какие-то другие в меньшей степени).

Про убогое ООП:

http://wiki.ecmascript.org/doku.php?id=harmony:classes

http://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classes

http://github.com/lukehoban/es6features#classes

http://ng-learn.org/2014/01/AngularJS-2/

http://coffeescript.org/#classes

http://en.wikipedia.org/wiki/TypeScript#Classes

http://en.wikipedia.org/wiki/Dart_(programming_language)#Example

http://docs.google.com/document/d/11YUzC-1d0V1-Q3V0fQ7KSit97HnZoKVygDxpWzEYW0...

motto
()
Ответ на: комментарий от J-yes-sir

Я еще раз, кратко, скажу. переменные с this связываются динамически

Еще раз, для дебилов - это не переменные, а потому они никак не связываются. Вообще.

anonymous
()
Ответ на: комментарий от J-yes-sir

а это примерно то же, что в лиспе c динамич. связыванием

И точно так же как в с++ со статическим.

anonymous
()
Ответ на: комментарий от J-yes-sir

Первый шаг к ослаблению языка — запретить динамическое связывание. Второй шаг — запретить присваивание.

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

anonymous
()
Ответ на: комментарий от anonymous

Ты anonimous или что не так?

Анонiмусу вот ещё пример

// chrome
function g() { console.log(this); }
function f() { console.log(this); g() }
console.log(f.call({a: 1}));
// Object {a: 1}
// Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
// node
"use strict";
function g() { console.log(this); }
function f() { console.log(this); g() }
console.log(f.call({a: 1}));
// { a: 1 }
// undefined

http://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping_vs._dyn...

motto
()
Ответ на: комментарий от motto

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

perl

anonymous
()
Ответ на: комментарий от motto

пример

Что доказывает твой пример? для g контекст исполнения — global, а не тот контекст, который ты указываешь для f.

anonymous
()
Ответ на: комментарий от motto

Вот тебе пример чистого динамического связывания, такого же как в динамических лиспах


aa=1
bb=2
context=function(){this.a=aa; this.b=bb}
f=function(){console.log(this.a, this.b)}

f.call(new context)
aa=10
f.call(new context)
//  1 2
//  10 2

anonymous
()
Ответ на: комментарий от motto

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

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

anonymous
()
Ответ на: комментарий от anonymous

Вот тебе пример чистого динамического связывания, такого же как в динамических лиспах

И где ты тут увидел динамическое связывание? Оно же не работает как в лиспе.

anonymous
()
Ответ на: комментарий от anonymous

Нет, не работает. При динамической связывании если я переопределю this в локальном скопе то ее значение должно изменится. У тебя же оно не поменяется.

anonymous
()
Ответ на: комментарий от anonymous

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

Конечно предусматривает. В случае динамического связывания:


(define this 1)
(define (f) this)

(f) ; 1
(let ([this 10]) (f)) ; 10

anonymous
()
Ответ на: комментарий от anonymous

perl

Таки на выбор, http://perldoc.perl.org/perlfaq7.html#What's-the-difference-between-dynamic-a....

Как в CL, http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/dec_special....

http://en.wikipedia.org/wiki/Scope_(computer_science)#Dynamic_scoping

Some languages, like Perl and Common Lisp, allow the programmer to choose static or dynamic scoping when defining or redefining a variable. Examples of languages that use dynamic scoping include Logo, Emacs lisp, and the shell languages bash, dash, and the MirBSD Korn shell (mksh).

motto
()
Ответ на: комментарий от anonymous

Всё равно что

function f() { console.log(this.a); }
var a = 1;
function make() { return {a: a}; }
f.call(make()); // 1
a = 2;
f.call(make()); // 2

что это демонстрирует — 1) в объекте make ссылка на переменную a, 2) обычное связывание this с переданным объектом.

int main() {
    struct A { int /* & */ a; void f() const { printf("%d\n", a); } };
    auto a = 1;
    auto make = [&a]() { return A{a}; };
    make().f(); // 1
    // ^ std::mem_fun_ref(&A::f).operator()(make());
    a = 2;
    make().f(); // 2
}

никакого отношения к динамическому окружению.

Демонстрировать нужно http://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping_vs._dyn... — g не подбирает контекст f, да, это значит, что ThisBinding это ThisBinding со своими правилами, ассоциации с динамическим окружением не нужны (ты тут не одинок — http://www.amazon.com/Functional-JavaScript-Introducing-Programming-Underscor..., «one area where dynamic scoping rules apply to JavaScript, the this reference» чисто на основании существования call (как бы нужно тогда вещать, что всё ООП это динамическое окружение — методы разделяют локальное окружение класса и есть call с возможностью связать this с чем угодно) и «And thus, Underscore saves us from the perils of dynamic scoping» — всё ради пиара видимо :)).

motto
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.