Juan-Carlos Gandhi (
juan_gandhi) wrote2008-05-14 12:56 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
dynamic vs static
Я не собираюсь вступать в эту нонешнюю дискуссию. Просто хочу заметить, что речь идёт о "гарвардской архитектуре" супротив "архитектуры фон Неймана".
В первой данные отделены от кода, и задача программиста состоит в том, чтобы состыковать, хоть и через посредников, данные и код, который их обрабатывает; вот и приходится катать всякие конфигурации, эксэмэли, ентити бинзы; всё для того, чтобы уберечь код от данных. Тогда код можно статически проверить и отлить в бронзе. Чтоб не сломался.
Во второй что данные, что код, без разницы; код - это вид данных, а данные могут на определённом уровне интерпретироваться как код, или строить код, который эти данные сынтепретирует (как, помню, была какая-то база, которая строила классы для доступа прямо при открытии таблицы: взял таблицу - вот и классы загрузились; естественно, что динамически.
Ну а так, наверное, стоит почитать, конечно: Егге устраивает разгром в столице статической типизации
В первой данные отделены от кода, и задача программиста состоит в том, чтобы состыковать, хоть и через посредников, данные и код, который их обрабатывает; вот и приходится катать всякие конфигурации, эксэмэли, ентити бинзы; всё для того, чтобы уберечь код от данных. Тогда код можно статически проверить и отлить в бронзе. Чтоб не сломался.
Во второй что данные, что код, без разницы; код - это вид данных, а данные могут на определённом уровне интерпретироваться как код, или строить код, который эти данные сынтепретирует (как, помню, была какая-то база, которая строила классы для доступа прямо при открытии таблицы: взял таблицу - вот и классы загрузились; естественно, что динамически.
Ну а так, наверное, стоит почитать, конечно: Егге устраивает разгром в столице статической типизации
no subject
no subject
Т.е. разрешение имён и разрешение порядка наследования(aka MRO) как происходило в runtime, так и происходит. И любой объект (например, метод объекта или функцию), на которое ссылается заданное имя, всё так же можно переопределить в любой точке исполнения.
Потому гарантировать, что в данной точке программы данное имя разрешается в указанный объект в общем случае становится очень трудно в сравнении со статическими более-менее процедурными языками. (В то время как в чистом fp это, конечно, вообще тривиально.)
no subject
у вас же есть свой модуль, в котором вы можете сделать from fj import *, а потом в какой-то момент вызвать b(). Расскажите пожалуйста, как вы сделаете так, чтобы в результате не напечаталось "а"? Ну, раз всё разрешение имён якобы происходит в рантайме, вы же сможете подсунуть моему b() свою а(), правда?
no subject
Добавим для наглядности вызов некоторой неизвестно где определённой функции foo, которую надо искать "снаружи".
Всё предсказуемо: зовётся a из нашего модуля, а foo не находится.
Ага, foo опять не находится!
Это потому, что scope-ов много, по одному на code block. В частности, у модуля свой scope, имена в импортированном модуле разрешаются только в нём, а "выше", на уровень импортирующего, не заходят. Импортирующий же код не портит нечаянно имена в импортированном.
Но это не значит, что scope модуля нельзя поменять :)
Теперь, когда мы имеем удобное имя для модуля, мы лезем в его scope и вписываем туда имя своей функции. И всё срабатывает.
Сстановится вдруг понятно, почему, если 10 импортированных нами модулей вызывают в своём коде функцию a(), они получают каждый свою. И ясно, как подсунуть другую a().
Вот как-то так, мне кажется.
Мои извинения хозяину журнала, которому всё это приходит на почту %) 御免なさい!
no subject
По поводу импорта -- да, видимо так всё и работает. Я хотел сказать, что происходящее в процессе тоже не вполне укладывается в представление о питоне как о чисто скриптовом, с одной стороны импорт вроде бы просто исполняет модуль и добавляет его имя в локальный scope, с другой -- имеем это вот ровно двухкратное исполнение.
no subject
Да, если нужен ещё более "чисто скриптовый" — это, наверное, ruby в его исходной реализации, там напрямую по дереву ходят при исполнении (естетственно, это тормозит). В rubinius вроде сделали фазу компиляции во что-то (но не напрямую в байткод jvm).