dynamic vs static
May. 14th, 2008 12:56 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я не собираюсь вступать в эту нонешнюю дискуссию. Просто хочу заметить, что речь идёт о "гарвардской архитектуре" супротив "архитектуры фон Неймана".
В первой данные отделены от кода, и задача программиста состоит в том, чтобы состыковать, хоть и через посредников, данные и код, который их обрабатывает; вот и приходится катать всякие конфигурации, эксэмэли, ентити бинзы; всё для того, чтобы уберечь код от данных. Тогда код можно статически проверить и отлить в бронзе. Чтоб не сломался.
Во второй что данные, что код, без разницы; код - это вид данных, а данные могут на определённом уровне интерпретироваться как код, или строить код, который эти данные сынтепретирует (как, помню, была какая-то база, которая строила классы для доступа прямо при открытии таблицы: взял таблицу - вот и классы загрузились; естественно, что динамически.
Ну а так, наверное, стоит почитать, конечно: Егге устраивает разгром в столице статической типизации
В первой данные отделены от кода, и задача программиста состоит в том, чтобы состыковать, хоть и через посредников, данные и код, который их обрабатывает; вот и приходится катать всякие конфигурации, эксэмэли, ентити бинзы; всё для того, чтобы уберечь код от данных. Тогда код можно статически проверить и отлить в бронзе. Чтоб не сломался.
Во второй что данные, что код, без разницы; код - это вид данных, а данные могут на определённом уровне интерпретироваться как код, или строить код, который эти данные сынтепретирует (как, помню, была какая-то база, которая строила классы для доступа прямо при открытии таблицы: взял таблицу - вот и классы загрузились; естественно, что динамически.
Ну а так, наверное, стоит почитать, конечно: Егге устраивает разгром в столице статической типизации
no subject
Date: 2008-05-14 08:28 pm (UTC)no subject
Date: 2008-05-14 09:48 pm (UTC)no subject
Date: 2008-05-14 09:56 pm (UTC)PS: а что такое правильный доступ к переменным?
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-05-15 12:44 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-05-14 08:53 pm (UTC)Решил, что я -- neat freak и код на Python получается сравнительно messy, а Java enforces some discipline. Perl -- еще хуже.
А, вот еще как можно сравнивать языки: качество стандартных библиотек. С Питоном все время нарываешься на то, что нажал чуть посильнее и оно ползет по швам. Java терпит куда больше abuse. Все время лезет в голову сравнение велосипеда с грузовиком.
no subject
Date: 2008-05-14 09:50 pm (UTC)no subject
Date: 2008-05-14 11:46 pm (UTC)(А приходится: сопрягаю то и другое.)
no subject
Date: 2008-05-14 11:55 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-05-15 12:01 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-05-15 05:16 am (UTC)(no subject)
From:А вот и не жаль
From:Re: А вот и не жаль
From:Re: А вот и не жаль
From:Re: А вот и не жаль
From:no subject
Date: 2008-05-14 09:06 pm (UTC)Я сейчас к одной своей проге простенький скриптовый язык приделываю и у меня всякие полуоформленные мысли в связи с этим появляются. Например: существует заговор: тайное общество поклонников динамически типизированных языков называет "dynamic scope" "lexical scope"-ом, чтобы никто не задумался случайно. Ведь когда пишешь интерпретируемый язык, он натурально получается динамически типизированным и с динамическим scope, это baseline, а чтобы получить lexical (static!) scope нужно приложить неслабые усилия, причём централизованно. Но необходимо, и в том же питоне, кстати говоря, все вызовы обычных функций можно отрезолвить в адреса на этапе компиляции (да они наверное и резолвятся), удивительно если подумать, не правда ли?
Вот эта параллель меня как-то настораживает. Не обязательно же ведь требовать строгой типизации, достаточно уметь её вычислять, и это умение вроде бы должно быть таким же импрувментом, как и умение делать static scope, ну, если оставлены удобные эскейпы.
no subject
Date: 2008-05-14 09:51 pm (UTC)no subject
Date: 2008-05-14 11:52 pm (UTC)Вынужден вас разочаровать. Нету там никакого этапа компиляции. Все операторы (в т.ч. class и def) исполняются в runtime. Можно на ходу добавить к классу или конкретному объекту какие угодно новые методы, а старые нагло удалить. Поэтому резолвится всё в момент вызова.
Такая же точно картина в javascript и smalltalk.
Потому с этими штуками так удобно играться интерактивно и так трудно писать к ним осмысленны
no subject
Date: 2008-05-14 11:52 pm (UTC)no subject
Date: 2008-05-15 08:35 am (UTC)Where is your God now?
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-05-15 08:38 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-05-15 08:40 am (UTC)не везде, насколько я знаю.
из спецификации соответствующих языков ничего подобного точно не следует.
no subject
Date: 2008-05-15 07:45 am (UTC)ну вот давайте я задумаюсь.
подумал, подумал.
нет, всё правильно.
что такое "интерпретируемый язык"? каким образом динамический скоп легче лексического? какие такие страшные "централизованные усилия"?
(зачем придумывать ещё один недоязык?)
one cannot, в натуре, rightly comprehend the kind of confusion etc.
no subject
Date: 2008-05-15 09:12 am (UTC)Под компиляцией я понимаю обработку кода без его исполнения.
Понятно, что совсем без компиляции обойтись тяжело, то же определение функции присваивает её тело куда-нибудь без исполнения, плюс conditional operators явным образом должны читать но не исполнять код в неисполняемой ветке, в этом как бы их смысл, но вопрос в том, насколько много вещей делается в процессе компиляции (которая, конечно, не обязана быть выделена в отдельный этап).
Так вот, dynamic scope получается совершенно естественно: у нас есть один словарь, в котором хранятся значения символов. Определение функции создаёт там символ [имя функции] и запихивает в него тело функции (про параметры пока не думаем), "i = 1" создаёт (или использует текущий) символ i, в котором оказывается объект инт, равный 1, и так далее.
Но при этом (я буду использовать питоновский синтаксис) такой код:
должен печатать 2. Потому что словарь один на всех. Более того, если всё действительно так просто, то а() может изменить i, которую нам бы хотелось считать локальной переменной b(), определение функции с тем же именем как у определённой в каком-нибудь чужом модуле приводит к удивительным результатам и так далее. Dynamic scope плохой!
А дальше начинаются "страшные централизованные усилия". Можно сделать shadowing, но он всех проблем не решает (тот код по-прежнему будет печатать 2, лямбды работать не будут вообще, потому что не будут лексическими замыканиями) и добавляет свои. Следовательно, нужно делать нормальный static scope: для каждой штуки, обладающей лексическим контекстом (функции, например) либо этот контекст сохранять явно и восстанавливать при вызове, прям весь словарь, либо находить все символы, которые при использовании будут обращаться к контексту и честно компилировать их, то есть заменять на fully qualified обращения, можно сразу по адресам. Как-то так, я этого ещё не делал.
(зачем придумывать ещё один недоязык?) -- вот именно за этим, чтобы увидеть, как некоторые привычные вещи оказываются весьма нетривиальными.
(no subject)
From:(no subject)
From:(no subject)
From:Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:Re: Lisp rules, all other programming languages sucks
From:no subject
Date: 2008-05-15 12:24 am (UTC)no subject
Date: 2008-05-15 05:39 pm (UTC)no subject
Date: 2008-05-16 07:04 am (UTC)(no subject)
From:no subject
Date: 2008-05-16 07:03 am (UTC), и в этом проявляется диалектический материализм..а егге с каждым разом все более мне жириновского напоминает, только не такой агрессивный.
no subject
Date: 2008-05-16 07:27 am (UTC)А то пропадает человек.
no subject
Date: 2008-05-16 07:37 am (UTC)Были классы -- чистые value objects. Просто структуры данных с конструкторами и аксесорами. Были классы -- чистые команды. Просто функции.
Но это внутри.
А сверху в качестве API выдавались обычные классы, совмещающие state и behavior.
Я спросил у тех мужиков:
- Вы с "Си" что ли портировали ?
- Нет, - говорят. С нуля так писали. Просто ООП мы тут не любим, но раз народу нравится -- сделали.