Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Религиозные войны > Динамическая типизация


Автор: Vasay 14.5.2010, 12:21
Добрый день.


На данный момент существует много языков с динамической типизацией: Python, Ruby, Groovy, PHP, Perl....

Но вот я никак не могу понять - а какие плюсы дает динамическая типизация. Лично я вижу одни только минусы.

Например, сейчас использую web фрэймворк grails заточенный под использование Groovy. 

Так вот - для нормальной работы GORM (orm фрэймворк на базе Hibernate) и работы scaffolding-а в Entity классах все равно нужно явно указывать тип.

Из за динамической типизации механизм подсказок IDE сильно урезан (в сравнении с Java), так же как и проверки кода на стадии написания. 

Да и ИМХО лучше ловить ошибки на стадии компиляции (а при хорошей IDE - на стадии написания), чем во время работы программы. 




Может я чего-то не понимаю?  Покажите пожалуйста, где зарыты плюсы динамической типизации?

Автор: GoldFinch 14.5.2010, 13:12
она удобная.

Автор: Vasay 14.5.2010, 13:16
GoldFinch, 

Цитата

она удобная. 


А более развернуто можно - чем удобная? Я пока вижу только  неудобства  smile


Автор: GoldFinch 14.5.2010, 13:21
я не юзаю grails, GORM и т.п.
хз что там насчет подсказок ИДЕ, они могут быть привязаны не только к типу
динамическая типизация сама по себе не приводит к ошибкам, надо просто понимать код который ты пишешь

удобство в том, что не надо писать лишний код.

Добавлено через 1 минуту и 21 секунду
сам я юзаю python+IDLE и javascript+msvs+VisualAssistX

Автор: kemiisto 14.5.2010, 13:46
Vasay, определённые преимущества всё-таки есть. Ленно как-то сильно расписывать. Коротенечько.

Основное, пожалуй, что нет необходимости в наличие строгих многоуровневых иерархий типов данных. Что значительно повышает т.н. скорость прототипирования. Собственно, если при работе со статически типизированным ЯП очень много времени тратится на проектирование интерфейсов, абстрактных классов, глубоковложенных иерархий и т.п., то с динамическим ЯП можно проще. Посмотри, хотя бы на те же знаменитые GoF Design Patterns. Собственно, большая часть из них - шаблонные решения по преодолению сложностей статической типизации. Эдакие проверенные временем иерархии типов данных и т.п.

В дипамичсеки типизированных ЯП практически всегда работает т.н. позднее связывание (late binding). Точнее, тут "рулит" динамический поиск и вызов метода, называемый ещё динамической диспетчеризаций сообщений (dynamic method invocation, dynamic message dispatch). Динамическая диспетчеризация сообщений лаконично вписывается в языки с динамической типизацией. Это суть т.н. утиной типизации.
Цитата
"when I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck."

Т.е. наличие некого метода у некой переменной (ссылки на объект) не проверяется на этапе трансляции. Мы не знаем, объект какого типа окажется по этой ссылке в конкретный момент времени. Но даже если б и знали, проверять наличие метода не стали бы. А во время исполнения всё просто: если у объекта по ссылке есть нужный метод (объект понимает посылаемое сообщение) - вызываем метод, нет - объект может "проглатывать" сообщения (такое тоже бывает smile ), но чаще кидаем исключение. 

Такой подход значительно упрощает и обобщённое программирование. Ну, надеюсь, понятно.

Следует отметить, что чистая прибыль от такого преимущества будет почти нулевая. Тут работает знаменитое strong static typing vs strong unit testing. То есть городить сложных иерархий не надо, а вот на unit-тестирование придётся поднажать. Где-то теряем, где-то находим. Ну и тут банально - всё зависит от задачи.

Бла-бла-бла...

Автор: Vasay 14.5.2010, 14:32
Цитата(GoldFinch @  14.5.2010,  13:21 Найти цитируемый пост)
хз что там насчет подсказок ИДЕ, они могут быть привязаны не только к типу
динамическая типизация сама по себе не приводит к ошибкам, надо просто понимать код который ты пишешь



Код не всегда пишешь только ты.  Если IDE не знает тип объекта, она не может тебе выдать ни ****Doc, ни списка методов. 

А такие подсказки заметно ускоряют процесс написания кода. 


Цитата

удобство в том, что не надо писать лишний код.


очень спорное утверждение.  В случае динамической типизации,  как минимум придется писать более развернутые комментарии и ***doc-и



kemiisto, 

Спасибо за ответ. Честно сказать, по первой части, понял Вас не до конца. Разве не может быть многоуровневой иерархии типов данных у языка с динамической типизацией?

Автор: kemiisto 14.5.2010, 14:38
Цитата(Vasay @  14.5.2010,  15:32 Найти цитируемый пост)
Разве не может быть многоуровневой иерархии типов данных у языка с динамической типизацией?

Может, конечно. Но там не принято огородгородить.

Автор: Vasay 14.5.2010, 15:28
Цитата

Может, конечно. Но там не принято огородгородить. 



А как Вы себе представляете, скажем, Java со всеми ее библиотеками без сложной иерархии? Мне кажется, тут вид типизации совсем не причем, а скорее размер и универсальность  платформы. 


Автор: kemiisto 14.5.2010, 15:56
Цитата(Vasay @  14.5.2010,  16:28 Найти цитируемый пост)
А как Вы себе представляете, скажем, Java со всеми ее библиотеками без сложной иерархии?

Вот это и есть плюшка динамической диспетчеризаций сообщений. Polymorphism without inheritance. Ещё можно встретить термин ad-hoc polymorphism. Иногда с добавочкой for late bound languages. Потому как есть и ad-hoc polymorphism for early bound languages, но там несколько другой ad-hoc...

Короче, это всё очень запутанная штука. smile Так в 2-х словах и не рассказать. Но вернёмся к нашим баранам.

Для примеру возьмём классы Class Vector<E> и Class ArrayList<E> из java.util. Иерархия наследования там не такая простая. Множественно наследование через интерфейсы по сути. Но что можно видеть, так это что оба класса реализуют методы интерфейса Interface List<E>. Всякие там add(), size(), clear(),...

Задумаемся, почему так? Зачем нам такая сложная иерархия с наследованием от интерфейса? Всё правильно - нам нужны эти методы и в стеке, и в списке. Мы так решили на этапе проектирования. Мы выносим эти общие методы в интерфейс, а в каждом из классов этот интерфейс реализуем. Компилятор контролирует нас на предмет реализации этих методов и далее на предмет вызова этих методов только у классов, реализующих наш интерфейс Interface List<E>.

Куда важнее, что оба класса - наследники абстрактного класса Class AbstractList<E>. Объявив в программе переменную этого типа данных, мы можем хранить там хоть Vector<E>, хоть ArrayList<E>. И вызываемые методы, хоть и с одинаковым названием, будут разные. И именно те, что нужны. Короче, полиморфизм, знаете, что такое. Такой тип полиморфизма называют inclusion polymorphism, так как переменная одного типа данных (более абстрактного) может хранить (включать) экземпляр и унаследованного типа данных. 

В языке с динамической диспетчеризаций сообщений не надо городить этот огород. Создаём класс вектор и пишем нужные методы, создаём класс список и пишем нужные методы. Переменная (динамически типизированная) будет хранить что-то. Мы будем вызывать у этого чего-то метод, скажем, add(). Проверка в ран-тайм: есть такой метод - вызываем, нет - исключение, получите, распишитесь.

Что там будет в этой переменной одному богу известно. Там может оказаться и что-то отличное от экземпляров наших классов вектор и список. У этого отличного может и окзаться метод add()... Поэтому нужно тестировать...

Посмотрите хоть Python что-ли... А лучше Smalltalk.

Автор: Vasay 14.5.2010, 16:29
kemiisto, 

Спасибо! Теперь я понял первую часть вашего предыдущего поста. 

Пока, правда, не осознал, плюс это или минус smile 

Автор: kemiisto 14.5.2010, 16:45
Цитата(Vasay @  14.5.2010,  17:29 Найти цитируемый пост)
Пока, правда, не осознал, плюс это или минус

Тут, как я уже говорил, зависит от задачи. Звучит банально, но это так. Посмотрите, большая часть ЯП с динамической типизацией - скриптовые. По большей части они нужны для автоматизации каких-либо рутинных операций. Скажем, хочу я удалённо по ssh логиниться на кластер, запустить сотню-другую задач, "выдрать" что-то нужное из полученных данных, закинуть это дело в табличку, построить график. Вот это самое оно для скриптовых языков. И я не хочу тут особо чего-то проектировать, городить иерархии классов, ... Не стоит оно того.

"Python, он для скриптов, а не для "взрослого" программирования." (с) Lazin

Добавлено @ 16:54
Цитата(Vasay @  14.5.2010,  13:21 Найти цитируемый пост)
Да и ИМХО лучше ловить ошибки на стадии компиляции (а при хорошей IDE - на стадии написания), чем во время работы программы.

Безусловно. Никлаус Вирт http://alenacpp.blogspot.com/2005/09/blog-post_21.html с тобой, %username% smile :
Цитата
Q: Что вы думаете о динамических языках?
A: Типизация должна быть статической. Динамическая медленнее. Ошибки в типизации должны быть пойманы на этапе компиляции."

Автор: Vasay 14.5.2010, 17:39
kemiisto, 

Цитата

Тут, как я уже говорил, зависит от задачи. Звучит банально, но это так. Посмотрите, большая часть ЯП с динамической типизацией - скриптовые. По большей части они нужны для автоматизации каких-либо рутинных операций. Скажем, хочу я удалённо по ssh логиниться на кластер, запустить сотню-другую задач, "выдрать" что-то нужное из полученных данных, закинуть это дело в табличку, построить график. Вот это самое оно для скриптовых языков. И я не хочу тут особо чего-то проектировать, городить иерархии классов, ... Не стоит оно того.

"Python, он для скриптов, а не для "взрослого" программирования." (с) Lazin


Но на языках с динамической типизацией пишутся не только простенькие скрипты, но и вполне серьезные веб приложения. И вот мне кажется - имей эти языки статическую типизацию - это было бы огромным плюсом:

 - выше скорость выполнения
 - проще сделать вспомогательные инструменты в IDE
 - пускай язык скриптовый, и не компилируется, но ошибки могут быть проверены на уровне IDE - следовательно меньше багов в готовом приложении
 - нет проблем со scaffolding-ом активно применяющимся в современных web-фрэймворках. 


Или я чего-то не понимаю, раз языки с динамической типизацией так активно плодятся?

Автор: kemiisto 14.5.2010, 18:08
Цитата(Vasay @  14.5.2010,  18:39 Найти цитируемый пост)
Но на языках с динамической типизацией пишутся не только простенькие скрипты, но и вполне серьезные веб приложения.

Это уже использование не по назначению.

Цитата(Vasay @  14.5.2010,  18:39 Найти цитируемый пост)
И вот мне кажется - имей эти языки статическую типизацию - это было бы огромным плюсом

Ничего тут не кажется, всё очевидно. smile 

Цитата(Vasay @  14.5.2010,  18:39 Найти цитируемый пост)
Или я чего-то не понимаю, раз языки с динамической типизацией так активно плодятся?

Сейчас в ИТ преобладает бизнес-модель: быстро пишем хоть что-то работающие -> срубаем бабло. Языки с динамической типизацией в эту схему укладываются очень неплохо. К тому же, чтоб сурбать бабло нужны громкие лозунги: dynamic web, agile development, TDD, ... А что там за красивыми словами скрывается - http://www.google.com/url?sa=t&source=web&ct=res&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Flurkmore.ru%2F%25D0%2592%25D1%2581%25D0%25B5%25D0%25BC_%25D0%25BF%25D0%25BE%25D1%2585%25D1%2583%25D0%25B9&ei=FmftS6uYENP2OenUtfwH&usg=AFQjCNFnXQxFKytba3brtpZQRjgPlrcaGA&sig2=yFyhhDK1co-DR4MLgEwmHw. В общем, чего тут особо распыляться. Популярность никогда не была критерием качества.

Автор: gcc 14.5.2010, 18:14
Vasay, еще для примера, вот типизация на Си написанная, как дополнение smile  http://search.cpan.org/~rkitover/MooseX-Types-0.21/lib/MooseX/Types.pm

http://search.cpan.org/~flora/Moose-1.03/lib/Moose/Manual/Types.pod

http://search.cpan.org/~flora/Moose-1.03/lib/Moose/Util/TypeConstraints.pm
Цитата
Default Type Constraints

This module also provides a simple hierarchy for Perl 5 types, here is that hierarchy represented visually.

  Any
  Item
      Bool
      Maybe[`a]
      Undef
      Defined
          Value
              Str
                  Num
                      Int
                  ClassName
                  RoleName
          Ref
              ScalarRef[`a]
              ArrayRef[`a]
              HashRef[`a]
              CodeRef
              RegexpRef
              GlobRef
                  FileHandle
              Object


Автор: k0rvin 15.5.2010, 01:09
Цитата(kemiisto @ 14.5.2010,  14:38)
Цитата(Vasay @  14.5.2010,  15:32 Найти цитируемый пост)
Разве не может быть многоуровневой иерархии типов данных у языка с динамической типизацией?

Может, конечно. Но там не принято огородгородить.

man Common Lisp: весьма строгая иерархическая типизация. но при этом динамическая. и никакого огорода.

Добавлено через 2 минуты и 10 секунд
Цитата(Vasay @ 14.5.2010,  15:28)
Цитата

Может, конечно. Но там не принято огородгородить. 



А как Вы себе представляете, скажем, Java со всеми ее библиотеками без сложной иерархии? Мне кажется, тут вид типизации совсем не причем, а скорее размер и универсальность  платформы.

у джавы статическая типизация, товарищь же говорил за непринятость сложной иерархии при динамической типизации

Добавлено через 4 минуты и 9 секунд
ЗЫ. хорошие языки в ИДЕ не нуждаются. точнее они сами себе ИДЕ... =)

Автор: Logo 16.5.2010, 12:13
Цитата(Vasay @ 14.5.2010,  12:21)
Добрый день.


На данный момент существует много языков с динамической типизацией: Python, Ruby, Groovy, PHP, Perl....

Но вот я никак не могу понять - а какие плюсы дает динамическая типизация. Лично я вижу одни только минусы.

Например, сейчас использую web фрэймворк grails заточенный под использование Groovy. 

Так вот - для нормальной работы GORM (orm фрэймворк на базе Hibernate) и работы scaffolding-а в Entity классах все равно нужно явно указывать тип.

Из за динамической типизации механизм подсказок IDE сильно урезан (в сравнении с Java), так же как и проверки кода на стадии написания. 

Да и ИМХО лучше ловить ошибки на стадии компиляции (а при хорошей IDE - на стадии написания), чем во время работы программы. 




Может я чего-то не понимаю?  Покажите пожалуйста, где зарыты плюсы динамической типизации?

Пользуемся поиском, читаем...
http://forum.vingrad.ru/forum/topic-274434.html
http://forum.vingrad.ru/forum/topic-247815.html

Автор: kemiisto 16.5.2010, 12:18
Цитата(Logo @  16.5.2010,  13:13 Найти цитируемый пост)
Пользуемся поиском, читаем...
http://forum.vingrad.ru/forum/topic-274434.html
http://forum.vingrad.ru/forum/topic-247815.html

И что там читать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)