Вы не вошли.
Страницы 1
Чего я не пойму, так это вой и радость от динамической типизации. Т.е. плюсики, конечно, есть, но в существенных проектах (больше скрипта по переименованию фоток) они практически невелируются.
Для примера беру + и - из википедии и добавляю свои комментарии.
ДИНАМИЧЕСКАЯ ТИПИЗАЦИЯ ПО СРАВНЕНИЮ СО СТАТИЧЕСКОЙ
+ ПЛЮСЫ
* Минимум дополнительных строк: переменные надо либо просто объявить без указания типа (JavaScript), либо вообще объявлять не обязательно (PHP).
Но на самом деле, когда тебе приходится делать проверку типов типа if(!intval($x)) ... - то дополнительных строк кода сразу увеличивается))
* Пропадают операции приведения типа:
// Delphi
s := 'Количество ворон: ' + IntToStr(n);// PHP
$s = 'Количество ворон: ' . $n;
Но, простите, в C# (который считается строготпизированным) операции приведения простых типов тоже определены и ты можешь писать
double moloko; int ogurcy;
string opa = "kolbasa" + moloko + ogurcy; //no problemo bambino
А типы для которых правила приведения не заданы дадут ошибку в статически типизированном языке и непредсказуемую хрень в динамически типизируемом языке. Что лучше? В большинстве случаев ошибку, т.к.к все равно ты будешь ее искать.
* Соответственно, упрощается написание простых программ.
очень простых. Но портейдж на питоне или интернет магазин на пхп - это простые программы?
* Повышается гибкость языка. Например, только динамический язык может иметь функцию eval(), вычисляющую значение произвольного выражения.
Не так. Конечно евал - пререготива динамических языков, но опа:
social.msdn.microsoft.com/forums/en-US/ … 1ed786b54/
И вот вам евал в C#
* Ускоряет работу компилятора — а значит, производственный цикл «написать-проверить».
Не понимаю, почему ускоряет. Но, значит, может быть...
* Автоматически даёт языку элементы метапрограммирования и интроспекции.
Но в нормальных, статически типизированных языках с этим тоже все нормально. В C# с этим - все прекрасно. Уверен, что в java, например, тоже.
Даже на С++, через костыли, худо бедно, но метапрограммирование возможно.
Теперь приступим к минусам
МИНУСЫ
* Статическая типизация позволяет уже при компиляции заметить простые ошибки «по недосмотру». Для динамической типизации требуется как минимум выполнить данный участок кода.
o Особенно коварны в динамическом языке программирования опечатки: разработчик может несколько раз просмотреть неработающий код и ничего не увидеть, пока наконец не найдёт набранный с ошибкой идентификатор.
Ога-ога) А когда это пишет другой человек и тебе приходится разбирать весь его код - это ад. Либо используются методы, которые нивелируют краткость динамических языков (т.е. везде проверки типов, названия и т.д.)
* В объектно-ориентированных языках не действует либо действует с ограничениями автодополнение: трудно или невозможно понять, к какому типу относится переменная, и вывести набор её полей и методов.
Ну это брехня. Была бы задача. PHP-есть популярно = есть задача = хорошо парсится, а С++ парсить не сахар.
* Для написания сложного кода нужна особая культура программирования: венгерская нотация, юнит-тестирование и т. д.
Вот-вот, уже несколько раз выше говорил. И когда проект серьезный, большой и развернутый (но не такой большой, как гугл, а хотя бы нормальная CMS cайта) нивелируются плюсы краткости динамических языков.
* Низкая скорость, связанная с динамической проверкой типа. К тому же большинство языков с динамической типизацией интерпретируемые, а не компилируемые.
И кроме потери скорости на автоматическую проверку типизации у тебя еще программистом будут вставленны многочисленные проверки.
З.Ы. Есть некое несоответствие в назваях, тк.к. есть statically typed и strongly-typed - люди часто путают их, особенно в переводе на русский (все называют статичеким). Но тут, думаю, понятно о чем идет речь.
Отредактировано Tiphon (12-08-10 03:08:19)
Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.
Вне форума
Динамическая типизация удобна при строковых операциях.
Куда проще написать: "Результат: " + (x * y / 1000) + "\n", чем "Результат: " + (x * y / 1000).toString() + "\n";
Динамическая типизация хороша в перле, где тип SCALAR является и числом, и строкой и даже ссылкой одновременно:
Например: $s = (20 * 3) . "999"; # $s = 600999
Пустая строка или некорректные данные всегда трактуются как 0.
Или вот еще, нужно узнать, есть ли в результате цифра 7: if ($s=~m/7/)
Поработав пару лет с перлом и вернувшись на язык с четким разделением строк и чисел, я осознал, насколько корява и беспомощна строгая типизация. То, что было просто и легко внезапно потребовало бесконечных приведений от типа к типу. Да что там, в том же flash нельзя даже написать:
textfield.text = 3; // Надо "3", иначе ошибка типизации, хотя 3 + "" прокатывает
А уж мозгодробящее деление на int/double - это вообще за гранью добра и зла.
Итератор цикла ВНЕЗАПНО не может быть double или string.
Вот еще пример из перла:
for my $i (0..10, -0.5, 'specialkey', 'specialkey2', {'data'=>1, 'test'=>4} ) # В этом цикле $i и целое число, и дробное число, и строка и даже ссылка на анонимный ассоциативный массив.
Очень удобны подобные конструкции и в таких полезных преобразователях массивов как sort, map и grep
Вне форума
Кроме специфических IEC-языков программирования контроллеров, в своей работе регулярно использую VBScript. Для написания скриптов в SCADA WinCC. Кроме VBScript в неё встроен ещё один "скриптовой" язык: ANSI C. Круто, правда? На днях пришлось делать скриптик именно на Сях. Простенький такой. В зависимости от значения битового тега он должен манипулировать цветом заднего плана поля и выводить в другое поле текст. VBS использовать было нельзя из-за особенностей работы скады в runtime-режиме. Пока я сочинял этот скриптик из 30 строчек - проклял всё на свете. Потому что пришлось вспомнить, что строка в Си - это, блин, не строка, а массив типа char. И что операции со строками нужно выполнять как с массивами. Неприятным сюрпризом оказалось, что в экшн-скрипте объекта внешний заголовочный файл подключить невозможно. В результате скрипт, который на VBS занимает пару строк (именно так - всего две строки), "распух" до размеров небольшой программы. Когда только изучаешь язык, все эти особенности типизации кажутся прикольными и правильными, но когда начинаешь пользоваться им на практике - понимаешь, какая же это на самом деле жопа. В частности, в ANSI C для чтения значения тега заведен десяток функций - по числу типов. В VBS это один единственный метод.
Что же касается динамической типизации - в VBS абсолютно все переменные имеют тип Variant, но в реальных проектах это никак не мешает. Нужно только всё внимательно делать. На крайний случай есть как функции для проверки типа, так и функции для приведения переменной к конкретному типу. Но в моей практике нужда в них возникает крайне редко. Благодаря динамической типизации резко упрощается взаимодействие между разнотипными переменными, что снижает трудоёмкость при написании программы. В частности, очень сильно упрощается вывод результатов работы на экран.
Отредактировано MOP3E (12-08-10 08:45:29)
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума
А расскажите-ка, что такое типизация? И в чём отличие динамической от статической? В вики не посылать.
Вне форума
И в чём отличие динамической от статической?
Ну если по тупому, динамическая - это когда переменная, строго говоря, непонятно какого типа на этапе набора кода. Это вылезает только в момент исполнения кода с данной переменной, а на этапе набора только если либо программист, либо умный парсер посмотрит в более раннем коде, откуда переменная берется.
Типа как позднее связывание.
"Фу бля, крохобор вонючий" (с) Svart Testare
Вне форума
Кхм. Интересно.
В C# так нельзя, но можно сделать так :
var a = "string";
И система сама поймёт, что нужен string
Добавлено спустя 01 мин 13 с:
Если верить вашему описанию, то непонятно - а в чём толк?
Вне форума
В C# так нельзя, но можно сделать так :
var a = "string";
И система сама поймёт, что нужен string
а если так:
var MyFunction(...)
{...}
...
a = MyFunction(...);
Система-то конечно поймет, но поздно 
"Фу бля, крохобор вонючий" (с) Svart Testare
Вне форума
"Результат: " + (x * y / 1000) + "\n", чем "Результат: " + (x * y / 1000).toString() + "\n";
Ну, в C# и так можно делать.
Или вот еще, нужно узнать, есть ли в результате цифра 7: if ($s=~m/7/)
Ну тут ничего страшного нет и в
if(s.Contains(7)) - тоже очень читабельно и понятно.
я осознал, насколько корява и беспомощна строгая типизация. То, что было просто и легко внезапно потребовало бесконечных приведений от типа к типу.
Вот с перлом я знаком плохо, чтобы выводить его темные стороны, но, например в php такая "игра" типами заканчивает свой красивый полет, когда к проекту подключается несколкьо человек, особенно если это разрозненных несколько человек (опен соурс какой-нибудь) и если есть требования к безопасности (возможность инъекций в бд и т.д.). Тогда отсутсвие "бесконечных приведений типов" оборачивается присутствием "бесконечных проверок типов".
в VBS абсолютно все переменные имеют тип Variant
Вариант это аццкая штука. Пользователь это не видит и не знает, но на самом деле вариант представляет структуру, в которой есть переменные всех элементарных типов и перечисление, которое указывает, какой тип используется в настоящий момент. Т.е. внутри варианта есть и int, и double, и decimal. Понимаете к чему я веду? Что и дабл и децимал мы с вами, господа программисты, используем намного реже, чем инт. Но с любым интом у нас в памяти прорисовывается и дабл, и децимал, и еще пучек остального. Красота)))
Отредактировано Tiphon (12-08-10 11:56:01)
Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.
Вне форума
Если верить вашему описанию, то непонятно - а в чём толк?
Да хз. Я сам от нее не в восторге. Модно. Для веба хорошо, говорят.
Гибкость она конечно дает охренительную, но проблем от нее, ПММ, больше. Думаю, в С# избрали самый верный подход - строгая типизация с кучей автоматических (и не очень) преобразований. Правда, не в курсе, как там дело обстоит с типами функций, интересный вопрос.
"Фу бля, крохобор вонючий" (с) Svart Testare
Вне форума
Кхм. Интересно.
В C# так нельзя, но можно сделать так :
var a = "string";
И система сама поймёт, что нужен stringДобавлено спустя 01 мин 13 с:
Если верить вашему описанию, то непонятно - а в чём толк?
Нет! Словово var - не дает динамической типизации в C#. НЕ ДАЕТ!!!!
var просто просит компилятор самому подумать о том, какой это тип.
Таким образом, да, есть некое приближение СТ языка к тому, что обычно в ДТ. Но типизация остается строгой.
Вот другое дело слово dynamic, которое пришло в .NEt 4.0 ))))
habrahabr.ru/blogs/net/43773/
И вуаля, динамическая типизация в "статически типизируемом язке. Но это к вопросу темы не относится. А скорее к удобству и мощи C#))
Добавлено спустя 19 мин 59 с:
Правда, не в курсе, как там дело обстоит с типами функций, интересный вопрос.
Нормально, раз функции представляются делегатами. Классами такими)
Но более того, я писал выше про евал в C#, по сути там с помощью CodeDom докомпилируется кусочек программы. Это муторновато, хотя это чистый, настоящий и не поддельный eval в статически типизируемом компилируемом языке.
Но еще в C# есть анонимные делегаты
msdn.microsoft.com/en-us/library/0yw3tz … 80%29.aspx
Которые как раз очень просты, без всяких CodeDom и берут на себя функционал большой части того, для чего обычно используется eval.
З.Ы. Помнишь ты как-то дразнил арманкса объектностью функций в питоне. Ну на самом деле я не стал лезть тогда, что если тебе надо использовать функцию, как переменную в С# для этого есть делегаты, которые вполне себе объектны.
Отредактировано Tiphon (12-08-10 12:13:39)
Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.
Вне форума
З.Ы. Помнишь ты как-то дразнил арманкса объектностью функций в питоне. Ну на самом деле я не стал лезть тогда, что если тебе надо использовать функцию, как переменную в С# для этого есть делегаты, которые вполне себе объектны.
Я его дразнил модулями 
Тогда такой вопрос, не холивара ради, а просто из интереса.
В Питоне с его динамической типизацией я могу передать функцию любой сигнатуры.
В делфях в этим куда хуже, я не могу в одну удобную переменную записать функцию, которая возвращает разные типы.
Т.е. у меня может быть тип function: integer и function:double которые друг к другу никак не приводятся. разве что poiner, но это уже хак.
Как с этим делом обстоит в сишарпе? есть там какой-нть общий тип для таких функций?
"Фу бля, крохобор вонючий" (с) Svart Testare
Вне форума
есть там какой-нть общий тип для таких функций?
Ну да, базовый класс Delegate. И передаешь их. Друго дело, когда тебе их дергать надо. Тут есть два варианта: либо через отражения делаешь. Более громоздко, чем в питоне, но глазу понятно. Либо через как раз то самое dynamic. Там тогда получается ровно как в питоне. БОлее того, этот динамик ввели в том числе и для того, чтобы была совместимость с IronPython. Правда, при использовании dynamic падает быстродействие) И может скатываться как раз ближе к питону)
www.codethinked.com/post/2008/10/28/C-4 … -look.aspx
Compile Time Bound: 6 ms
Dynamically Bound with dynamic keyword: 45ms
Dynamically Bound with MethodInfo.Invoke - 10943ms
Dynamically Bound with DynamicMethod - 8ms
Отредактировано Tiphon (12-08-10 13:33:16)
Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.
Вне форума
Ну да, базовый класс Delegate. И передаешь их. Друго дело, когда тебе их дергать надо. Тут есть два варианта: либо через отражения делаешь.
мощно. пасиб 
"Фу бля, крохобор вонючий" (с) Svart Testare
Вне форума
*почитал, задумался, свернул Perl, пошел учить C#*
Чего я не пойму, так это вой и радость от динамической типизации.
Интерпретируемым языка пофиг, там и так налету все парситься и определяется, как и что должно работать.. А как представить бинарную компиляцию с таким бардаком как variant? O.o Писать проги мб иногда такие и удобнее, напр. VB, но их качество и быстродействие сомнительный..
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Вне форума
А как представить бинарную компиляцию с таким бардаком как variant? O.o Писать проги мб иногда такие и удобнее, напр. VB, но их качество и быстродействие сомнительный..
Ну так, по мелочи, в VB используется сборщик мусора. То есть абсолютно для всех переменных память выделяется динамически. Вызвалась функция - память выделилась. Закончила работу - сборщик мусора освободил память. Естественно, это медленнее, чем в языках без менеджера памяти, зато полностью исключает утечку этой самой памяти. А вот про качество программ не гони. Быстродействие и качество программы - абсолютно никак не связанные вещи. Если, конечно, качество работы алгоритма не зависит напрямую от быстродействия языка программирования, на котором он реализуется. Во всех остальных случаях качество программы напрямую зависит от качества головного мозга программиста.
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума
. А как представить бинарную компиляцию с таким бардаком как variant?
Воооот))) Это очень правильный вопрос. Тут-то оно (которое не тонет) и всплывает)
msdn.microsoft.com/en-us/library/ms221673.aspx
Естественно, это медленнее, чем в языках без менеджера памяти, зато полностью исключает утечку этой самой памяти.
Ой ты сейчас накличешь беды. А беда в том, что при разрастании проекта менеджмент памяти ты по-любому (так или иначе) будешь устраивать. А вот что у тебя менеджмент памяти будет безопаснее и быстрее чем от разработчиков джаы или .нет - очень даже оптимистический прогноз.
Поэтому менеджмент памяти не обязательно означает уменьшение быстродействия.
Другое дело, когда идет менеджмент вариантов)))
Отредактировано Tiphon (12-08-10 16:14:49)
Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.
Вне форума
Другое дело, когда идет менеджмент вариантов)))
Да что ты к этому Variant прицепился? В VB есть нормальная типизация. И в VB .Net тоже есть. Это только в VBS её нет, но, извини, ты вообще прочитал, ГДЕ я использую VBS? Или, как это принято у луноходов, пропустил непонятные слова мимо ушей?
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума
Да что ты к этому Variant прицепился?
Да ты не серчай, вариант - к слову пришелся. В вб.нет с типами все то же, что в C# - естественно.
Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.
Вне форума
Странный спор у вас получился.
А вообще я люблю вывод типов)
Анархия-мама сынов своих любит
Вне форума
Страницы 1
[ Сгенерировано за 0.013 сек, 7 запросов выполнено - Использовано памяти: 1.79 Мбайт (Пик: 1.87 Мбайт) ]