Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>>Господа, такой вопрос:
ЗХ>>1. корректно ли сказать, что динамическая типизация по сравнению со статической — это замена отношения "is-a" отношением "can"?
ЗХ>>Т.е., очень обобщенно говоря, два значения вступают между собой в некоторые отношения, скажем:
ЗХ>>ЗХ>>a.function(b);
ЗХ>>
ЗХ>>Для статической типизации — нужно отношение is-a:
ЗХ>>Для динамической — нужно отношение can:
ЗХ>>ЗХ>>class A
ЗХ>> def function(b) //чтобы установить отношения a.function(b), не должно выполняться никаких соотношений, но...
ЗХ>> b.foo; //...вот здесь потребуется соотношение b can foo
ЗХ>>
MN>Как мне кажется, тут ты привёл пример не динамической типизации, а отсутствия типизации как таковой... То есть отношение can — это скорее для языков без типизации, нежели для языков с динамической типизацией... Разница между ними очень тонкая. Пример ОО языка с динамической типизацией: Smalltalk. Пример ОО языка без типизации: Self. Отличия: у объектов языка с динамической типизацией тип всё же есть, он определяется в ран-тайме, но он есть. По идее проверку типа можно выполнить уже при передаче объекта, а не при вызове метода и точно знать пройдут все последующие вызовы или нет, то есть имеем всё таки is-a. А вот для языков без типизации характерно именно отсуствие какого либо типа у объектов. На практике это выражается тем, что один и тот же объект может менять свой "интерфейс" динамически — добавлять и удалять методы и поля (слоты в терминалогии Self) во время выполнения. То есть в разные моменты времени для такого объекта вызов foo может как отклониться, так и пройти и проверить это при передаче объекта невозможно. То есть в данном случае как раз отношение can.
Я возражу. По моему мнению Self настолько же строго типизирован, как и Smalltalk.
Поясню мысль.
Динамическая типизация — контроль типов осуществляется во время выполнения.
Сильная типизация — правила типизации выполняются всегда.
Что такого различного в Smalltalk и Self, что может повлиять на типизацию?
Как уже было сказано — это возможность Self динамически менять поведение объектов модифицируя таким образом "типы", к которым он относится.
Но если присмотреться, такая возможность отлично ложится под определение динамической типизации (которая ортогональна сильной-слабой типизации). Ведь динамический контроль типов и состоит в том, чтобы контроль осуществлять *в момент вызова*. А то, что объект модифицирует свое поведение за время своей жизни, является лишь еще одним измерением динамичности системы.
Smalltalk отличается лишь тем, что типы его объектов фиксированы на момент создания/загрузки приложения. Но в определении сильной типизации про неизменность типов ничего не сказано. Сказано лишь, что объект одного типа не может быть интерпретирован как объект другого типа. Т.е. этот инвариант действует *только лишь в момент* выполнения операции с объектом.
Если уж на то пошло, Smalltalk обладает точно такими же средствами модификации структуры/поведения во время выполнения. Просто они не выставлены так явно как в Self. Иначе на Smalltalk невозможно было бы реализовать собственные средства разработки. [Напоминаю, что в Smalltalk программы создаются не как набор исходных текстов с дальнейшей их трансляцией, а посредством манипулирования объектами-классами с прозрачным внесением изменений во все созданные объекты-экземпляры].
Теперь если задать вопрос, какой язык можно назвать бестиповым?
Думаю таких языков не существует. Любой язык состоит из операций, которые работают с данными определенного типа.
Тот же ассемблер, где типы различаются по размерности, знаковости, целое/плавающее число и т.д.
А вот то, что любые данные могут быть интерпретированы как данные другого типа — это в точности слабая типизация.
Другой пример слабой типизации — сложение строк с числами, использование строк как числовых значений (например как индекс в массиве), и т.д.