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