| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Религиозные войны > строгая vs не строгая типизация |
| Автор: Logo 10.2.2010, 10:18 |
| Что лучше? Какие преимущества у одной перед другой? |
| Автор: azesmcar 10.2.2010, 10:20 |
Мое мнение - строгая, преимущества? Уменьшает количество потенциальных ошибок, делает код более понятным..по моему у нестрогой было только одно преимущество, которого после добавления в C# var не стало. |
| Автор: Lazin 10.2.2010, 10:36 |
| строгая |
| Автор: nginx 10.2.2010, 10:54 |
| Logo, строгая, ненавижу, что начал свое знакомство с программирование с PHP он не только динамично-типиз, он в свою очередь еще и слабо-типиз в отличии от Питона лучше начинать с .NET или Java любому начинающему |
| Автор: Logo 10.2.2010, 12:00 | ||
Я вот больше работал с языками с не строгой типизацией - PHP, Perl, JavaScript. Со строгими, вроде C++(относительно строгой), значительно меньше. Ну а начинал с бейсика)
Можно пример подобных ошибок? |
| Автор: azesmcar 10.2.2010, 12:11 | ||
ну например
да, этого можно избежать используя ===, но дело в том, что сравнение разных типов может являться ошибкой и тут нужно внимание программиста а не результат в виде false (или тем более true). В языках со строгой типизацией тут понадобился бы cast, тем самым вы сообщите компилятору/интерпретатору что вы на самом деле хотите сравнить два разных типа. Это нагляднее и для программиста, читающего код. Строгая типизация позволяет уберечься от многих ошибок, совершенных по невнимательности. К примеру в C++ у людей нередко возникают ошибки в связи с неявным приведением int-а к bool. |
| Автор: kemiisto 10.2.2010, 12:19 |
| Logo, прежде чем говорить о типизации, предоставьте определения: что Вы называете строгой и нестрогой типизацией. А пока разговор ниачём. К примеру, если в понятие строгая типизация включать невозможность неявного приведения типов (implicit type conversion), что, кстати говоря, делают часто, то Python нестрого типизированный язык. Иногда строгой считают типизацию, где вообще запрещены любые приведения типов - будь то неавные или явные. Так что - ждём-с определений. |
| Автор: Logo 10.2.2010, 12:36 | ||||
| Это да, операторы сравнения в некоторых языках черезчур перегружены, сравнивая числа и строки. Легко забыть, что имеет приоритет при сравнении разных типов, числовой или строковый. Здесь мне нравится подход Perl, в котором разные операторы сравнения строк и чисел
С учетом этого, могут быть какие-то ошибки? А PHP вообще отдельная история
Но это не значит что это гуд. |
| Автор: Lazin 10.2.2010, 12:37 |
| kemiisto, неявное приведение типов тоже бывает разным, к примеру, в приведении int к double я ничего плохого не вижу, а наоборот лучше только явно, причем функциями floor и ceil |
| Автор: Logo 10.2.2010, 12:38 | ||
А что там не понятного - 0 - false, остальное true, как везде |
| Автор: azesmcar 10.2.2010, 12:43 | ||
я не говорил что непонятно
если не ошибаюсь, джава этого не позволяет. |
| Автор: Logo 10.2.2010, 12:45 | ||||
Да как и все - строгая, когда не производятся не явные приведения типов, не строгая - когда производятся. Динамическая - когда можно менять тип по ходу выполнения программы, и соответственно проверка типов на этапе исполнения - статическая, наоборот, на этапе компиляции. Добавлено через 2 минуты и 31 секунду
... при приведении типов |
| Автор: UniBomb 10.2.2010, 13:36 |
В руби такое не проходит. 0 и nil там всё же разные вещи. Даже оператор === говорит не эквивалентны Раби и тут говорит, что ни о каком равенстве никакой речи и быть не может. Вы таки наверное уже догадались? Мне нравится нестрогая типизация в Ruby, но я в этом ничего не понимаю |
| Автор: MAKCim 10.2.2010, 13:42 | ||
юзайте аннотации и декораторы для проверки типов
ps. код честно взят из одного источника ;) |
| Автор: GrayCardinal 10.2.2010, 13:46 |
| Что значит лучше ? Юзать можно обе. А ошибки из-за невнимательности в любом случае будут... Добавлено через 21 секунду (не голосовал) |
| Автор: Logo 10.2.2010, 23:21 | ||||||
Да, согласен. Ситуация хотя и очень маловероятная, но возможная.
Тоже верно, если с большими числами работать. Хотя с точность чисел с плавающей точкой и так надо держать ухо востро.
Руби проверил, он тут себя ведет тоже не лучшим образом. И ошибку не возвращает, и сравнение не проводит. Питон, кстати, так же работает. |
| Автор: Akella 13.2.2010, 10:44 |
| Да, строгая лучше. Меньше потенциальных ошибок. Хотя иногда приходится и очень удобно применять вариантный тип, который как бы не имеет типа Т.е. можно было бы в опрос добавить ещё пункт: строгая с применением вариантных типов |
| Автор: segrey 13.2.2010, 12:57 | ||
Честно говоря, в php не хватает что - то вроде такого:
чтобы как в С++, в зависимости от того какие аргументы пришли - та функция и вызвалась. Можно конечно условие в конструкторе поставить, но это не кошерно |
| Автор: UniBomb 19.2.2010, 12:01 |
Ну почему же - в ruby есть оператор сравнения <=>, который будет равен nil если сравниваемые величины не подлежат сравнению (как в данном случае). Подмешанный оператор == основан на предыдущем и вероятно выдаёт false всегда, когда не true. По-моему тут всё логично. |
| Автор: mrbrooks 19.2.2010, 12:33 |
| строгая, ибо это не только гламурно, но и кошерно. |
| Автор: Logo 20.2.2010, 12:32 | ||
Но nil и 0 в контексте if одно и тоже ведь. И вообще речь не о том. Он не выдает ошибки при сравнении "1" и 1. Что бы, как Java, избавить от потенциальных ошибок. Вместо этого продолжает выполнять программу. Однако и сравнение он тоже не производит. Что бы, как Perl, что бы не заботится типах. Таким образом совмещая недостатки того и другого |
| Автор: fixxer 20.2.2010, 16:15 | ||||
Таким образом не стоит забывать, что в Ruby все объект и == это метод. Таким образом это можно сравнивать с методом equals в Java, а не с == в Java. |
| Автор: k0rvin 12.3.2010, 21:27 | ||
я надеюсь Вы не про Variant из Делфи (точнее COM/OLE, я таких тонкостей не знаю)? |
| Автор: A5uKa 27.3.2010, 23:10 |
| строгая с возможностью не строгой |
| Автор: Akella 23.4.2010, 14:47 |
| k0rvin, когда я говорил о вариантном типе, то имел ввиду именно Variant. Но есть ещё OleVariant. |
| Автор: k0rvin 23.4.2010, 18:10 | ||
но это же ужасный костыль и имеет отношение не к строгой/нестрогой типизации, а к статической/динамической =) |
| Автор: qweqwe 23.4.2010, 18:17 |
даже не знаю, за что тебя заминусовали, бро сразу видно - форум быдлокодеров, но не гламурных! Добавлено через 37 секунд только строгая, абсолютно всегда и везде |
| Автор: nerezus 23.4.2010, 22:42 |
| При динамической(как правило в нестрогой она, ну за исключением всяких там C) все равно приходится вести xxxdoc теги, в итоге кода больше выходит, а проферок типизации нету. |
| Автор: SneG0K 23.4.2010, 23:29 |
Ага, кошерно как еврейское рождество. В зависимости от задачи. При строгой типизации производительность выше, вроде. |
| Автор: k0rvin 24.4.2010, 00:39 | ||||||
что? переформулируйте мысль на более литературном или техническом языке.
ня? |
| Автор: qweqwe 24.4.2010, 09:52 |
есть, но только в рантайме как вы все ### тыкать сюда эту абсолютную истину вот приведи пример задачи, которая выигрывает от нестрогой типизации товарищ главнокомандующий, вы путаете строгую типизацию и статическую типизацию |
| Автор: JackYF 24.4.2010, 19:00 | ||
Любая задача, выполнение которой занимает меньше времени, чем написание кода для неё. Например, скрипты. |
| Автор: kemiisto 24.4.2010, 19:11 | ||||
Хм... Что-то я сомневаюсь. Итак,
JackYF, я бы ещё понял, если бы речь шла о преимуществах динамической типизации в плане высокой скорости прототипирования. Но нестрогая будет только мешать. Если исходить из вышеупомянутых определений, то, скажем, в Python типизация динамическая строгая, а в PHP - динамическая нестрогая. Бенефиты от динамической типизации получим и там и там, а вот об грабли нестрогой типизации, расставленные в PHP, мы весь лоб расшибём. P.S. В Python типизация не совсем строгая... |
| Автор: k0rvin 24.4.2010, 19:49 | ||||||
пример:
будь типизация сильно строгой, результат assoc необходимо было бы писать "(when (not (null x)) ..." или типа того мелочь, но чем больше кода, тем количество таких мелочей растет в геометрической прогресси => растёт трудность восприятия кода
не совсем, чем строже типизация, тем уверенней компилятор может производить оптимизации, ведь он может однозначно установить тип, а не думать "тут возможны такие типы: ..." |
| Автор: kemiisto 24.4.2010, 20:14 | ||
k0rvin, я смотрю ты Лисп(?) используешь строго по назначению - толстый троллинг.
qweqwe, вот, смотри. И ещё один путает. Речь идёт о том, что со строгой типизацией нужно явно указывать свои намерения при приведении типов. Таким образом транслятор языка со строгой типизацией будет увереннее находить ошибки, которые транслятор языка с нестрогой типизацией будет "проглатывать", предполагая неявное приведение типов. Эти ошибки очень часто являются логическими ошибками. Чем раньше они будут отловлены, тем лучше. Логическую ошибку можно:
|
| Автор: nerezus 24.4.2010, 20:23 | ||||
|
| Автор: kemiisto 24.4.2010, 20:24 |
| k0rvin, кстати говоря, все Лиспы, вроде как, строго типизированные языки. |
| Автор: qweqwe 24.4.2010, 20:44 | ||
нестрогая типизация, это когда компилятор видит, скажем сравнение строки и null, и генирирует такой код, который проверяет, пустая ли строка, и если она пустая - сравнение возвращает true, это крайне весело и остроумно, но к счастью - не ведет к ускорению программ (иначе ПэХаПэ был бы самым быстрым языком на свете) так точно, лиспы не пальцем деланы |
| Автор: k0rvin 24.4.2010, 21:26 | ||||||||
Нет такого языка "лисп". а Common Lisp весьма императивный язык. в том числе.
Добавлено @ 21:27
все слова понятны. по-отдельности. вместе же они у Вас составляют кашу Добавлено @ 21:37
откуда такая уверенность? "диалектов лиспа больше, чем программ, написанных на нём". в Common Lisp типизация не сильно строгая: nil используется и как пустой список, и как "ложь", истиной является значение любого типа, кроме nil. ну и полиморфизм никто не отменял, благо CLOS предоставляет классы для всех встроенных типов, соответственно можно написать свои сколь угодно нестрогие функции =) в Scheme чуть по-строже, есть специальные булевы константы: #t и #f, пустой список '() не является "ложью", однако как и любое другое значение, отличное от #f, является "истиной" ну и конечно же и в том, и в другом списки и массивы гетерогенны однако типизация в CL и Scheme построже Сишной |
| Автор: k0rvin 24.4.2010, 21:43 | ||
я разве писал, что нестрогая типизация приводит к ускорению программы? впрочем Вы правы, для статически типизированных языков разницы в производительности никакой. для динамически типизированных разница есть, ведь проверки типов придётся проводить в рантайме |
| Автор: qweqwe 24.4.2010, 23:13 | ||
проверки типов есть всегда, только в случае строгой типизации - проверка приведет к одному результату, а в случае не строгой - к другому |
| Автор: nerezus 25.4.2010, 16:26 | ||||
Тогда советую перечитывать до тех пор, пока полностью не поймете смысл, но не более 4 часов подряд. Добавлено через 4 минуты и 39 секунд
При динамической типизации(как правило она "в комплекте" с нестрогой типизацией, за исключением языков типа C) все равно приходится вести phpdoc/etc теги для работы автокомплита типов и документации, в итоге кода больше выходит... |
| Автор: qweqwe 25.4.2010, 18:04 | ||
у вас PHP головного мозга, уважаемый нестрогая и динамическая типизация - ортогональные вещи |
| Автор: nerezus 25.4.2010, 20:39 |
| qweqwe, а у вас ПГМ) читаем первую часть моего поста, долго думаем. Специально же РАЗДЕЛИЛ эти понятия в сообщении. |
| Автор: qweqwe 25.4.2010, 20:43 | ||
Православие Головного Мозга? Добавлено через 1 минуту и 57 секунд
зачем? мысль я понял, она не оригинальна, во первых, а во вторых, нестрогими могут быть и статические ЯП, а не только PHP |
| Автор: k0rvin 25.4.2010, 21:13 | ||||
| так значительно лучше -----
что это? Добавлено через 1 минуту и 25 секунд
ну так он и написал "обычно, за исключением всяких С" =) |
| Автор: qweqwe 25.4.2010, 21:19 |
он имел ввиду автокомплит в IDE, в php можно указывать аннотации, по которым IDE разберется что показывать в автокомплите |
| Автор: k0rvin 25.4.2010, 21:57 | ||||
эээ... а типы тут при чём? или имеется в виду для конструкций вида (хз как в пхп, пишу в С-подобном синтаксисе):
? |
| Автор: nerezus 25.4.2010, 23:52 | ||
Именно поэтому для PHP есть нормальные IDE, а для python - нету и не будет. |
| Автор: k0rvin 26.4.2010, 06:58 | ||||
откуда такая уверенность? может гвидо разрешит питонистам что-то типа того же, что есть в пхп для этого. ну и да, что в пхп, что в пейтоне объектная модель -- уг =) |
| Автор: nerezus 26.4.2010, 07:09 | ||||||
PHP копирует джаву. На вскидку нету видимости пакетов, анонимных классов, перегрузки сравнения. Остальное вполне себе скопировано и переделано в динамику с кучей добавлений. |
| Автор: NLspieler 26.4.2010, 07:55 | ||||||
| У php не строгая типизация? В общем то это так, но нельзя забывать, что в php есть несколько операторов сравнения, а именно не только == , != , но и === , !== которые требуют строгое совпадение типа.
Таким образом, при необходимости можно пользоваться любым видом типизации. И при некотором опыте, никаких ошибок от этого больше не возникает. Правда, в php можно производить операции над разными типами данных, например
Возможно это и может привести к ошибках, но в моей практике никогда такого не было. С другой стороны это очень удобно. Можно сразу, без преобразования типов, приступить к вычислениям. Обращаемся к скрипту по get-ссылке test.php?a=10&b=0.5
Не смотря на то, что оба значения представляют собой строки, можно тут же использовать их в математических вычислениях. Удобно. |
| Автор: k0rvin 26.4.2010, 12:27 | ||||||
Это факт, лучшие объектные модели в SmallTalk и CLOS Добавлено @ 12:30
ты не прав, это нифига не строгая типизация, при строгой === должно выбрасывать исключение на этапе компиляции при статической или в рантайме при динамической типизации |
| Автор: neutrino 28.4.2010, 23:57 | ||||
Панацеи нет. Плохо везде использовать нестрогую типизацию. Но иногда она спасает делая код легкочитаемым => легкоподдерживаемым.
|
| Автор: qweqwe 29.4.2010, 05:22 |
| neutrino, вывод типов <> нестрогой типизации |
| Автор: Sentox 30.5.2012, 11:30 | ||
k0rvin,
Это один из способов типизации, да же мануал по этому говорит что проверка происходит на тип. Так же в PHP есть is_... int,string,array и instanceof что позволяет вручную делать проверку на типы. |
| Автор: k0rvin 30.5.2012, 13:53 | ||
Конечно спасибо, капитан, но что ты этим хотел сказать? |
| Автор: Sentox 30.5.2012, 14:11 | ||||||||
Пожалуйста. Сказать хотел что оператор эквивалента проверяет и типы значений, что само по себе говорит о строгости типизации именно этого оператора, потому что кто то говорил
. И почему в обязательном порядке должно быть именно так
Всё остально привёл просто в информативном поле. |
| Автор: Logo 31.5.2012, 01:55 | ||
| Хороший принцип нестрогой типизации есть в perl/perl6(все еще разрабатываемом) Там в для базовых типов используется свой тип оператора. Таким образом происходит приведение типов, и программист всегда явно указывает, что он имел ввиду. Так, операции с числами/строками в perl
в perl5 из коробки вообще нет способов определить, является ли переменная строкой, или числом, да и это в подавляющем большинстве случаев и не нужно, т.к. операция определяется оператором. в perl6 пошли еще дальше, теперь многие операторы, допускающие двойное использование, начинаются с соответствующего символа. + числовой контекст ~ строковый контекст (~ теперь оператор конкатенации) ! логический контекст так, +| побитовое или для чисел, а ~| побитовое или для строк В результате операторов в perl 6 довольно много http://glyphic.s3.amazonaws.com/ozone/mark/periodic/Periodic%20Table%20of%20the%20Operators%20A4%20300dpi.jpg |
| Автор: k0rvin 31.5.2012, 07:52 | ||||
Нет, не говорит. Добавлено через 1 минуту и 19 секунд
Потому что строгая типизация не разрешает неявное приведение типов. |
| Автор: Nikolja 1.7.2012, 12:02 |
| проголосовал за строгую типизацию |
| Автор: Karadul 24.7.2012, 06:16 | ||
В питоне
Написал по привычке из явы. Ошибка выяснилась у клиента, который запустил прогу с другими параметрами. Это только в тройке? Мое имхо: для маленьких программ лучше динамическая типизация (меньше мозги себе паришь), для больших - статическая (поддержка ide на порядки лучше, не начинает мутить от одной мысли сделать какой-то глобальный рефакторинг). Edit: плохо прочитал заголовок темы. Конечно же строгая, перл и неявные преобразования str<->unicode в питоне двойке не нужны. |
| Автор: Karadul 24.7.2012, 06:38 | ||
Разрешил, но никто этим не пользуется. Срач http://python.su/forum/post/87539/. |
| Автор: ТарасАтавин 16.9.2013, 09:03 |
| В процедурной и алгоритмической парадигме лучше строгая явная, так как типы любых величин однозначно вытекают из задачи, а всякие приведения вроде округления действительного и присоединения к целому нулевой дробной части или не нужны вовсе, или чётко прописаны в алгоритме решения конкретной задачи, в объектно-ориентированной - смешанная: не строгая не явная для родственных классов и строгая явная для остальных, так как объект может быть экземпляром нескольких классов одновременно. Например амфибия - это автомобиль, или судно? А гидроплан - катер, или самолёт? А гигантский гидроэкраноплан Каспийский Монстр - самолёт, обычный корабль, или корабль на воздушной подушке? Здесь неясностей столько, что заранее определить классы всех объектов не всегда возможно, а привидения родственных классов предусмотреть не возможно почти ни когда. |