Re[2]: Снова о типизации :)
От: _vovin http://www.pragmatic-architect.com
Дата: 06.10.05 10:56
Оценка: 2 (2)
Здравствуйте, 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 программы создаются не как набор исходных текстов с дальнейшей их трансляцией, а посредством манипулирования объектами-классами с прозрачным внесением изменений во все созданные объекты-экземпляры].

Теперь если задать вопрос, какой язык можно назвать бестиповым?
Думаю таких языков не существует. Любой язык состоит из операций, которые работают с данными определенного типа.
Тот же ассемблер, где типы различаются по размерности, знаковости, целое/плавающее число и т.д.
А вот то, что любые данные могут быть интерпретированы как данные другого типа — это в точности слабая типизация.
Другой пример слабой типизации — сложение строк с числами, использование строк как числовых значений (например как индекс в массиве), и т.д.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.