Что такое ошибка динамической типизации? - PullRequest
1 голос
/ 11 февраля 2012

Когда дело доходит до программирования, у меня нет четкого мнения о функции х против функции у. Я думаю, что у всех есть соответствующее применение.

И я всегда читаю все, что могу, о как можно большем количестве языков программирования, чтобы я мог извлечь из них лучшие идеи и сравнить их все (от Haskell до Lisp до C до Erlang).

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

Теперь у меня много ошибок при программировании, но у меня никогда не было ошибки из-за чего-то подобного, и я на самом деле с трудом представляю себе пример такой ошибки было бы. Как, может быть, забыл, что вы где-то использовали целое число вместо строки? Это кажется таким надуманным, хотя ...

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

Ответы [ 3 ]

3 голосов
/ 11 февраля 2012

Примером может служить случай, когда вы меняете переменную с одного типа на другой:

setType(String type)

Затем вы решаете изменить тип на более эффективное перечисление:

setType(SomeEnum type)

Когда вы делаете это на строго типизированном языке, вы будете получать ошибки везде, где вызывается setType.Это позволяет быстро их исправить и убедиться, что вы ничего не пропустили.В динамически типизированном языке вы не получите таких ошибок, и вам придется самостоятельно искать эти экземпляры.

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

2 голосов
/ 11 февраля 2012

Многое можно сказать о типах и их значении для программирования.Например, вот недавняя статья в CACM, обсуждающая (среди прочего) анекдотические преимущества усовершенствованной системы типов, найденные в функциональном языке OCaml:

http://cacm.acm.org/magazines/2011/11/138203-ocaml-for-the-masses/

О более принципиальномобратите внимание, что первые несколько страниц в следующей классической статье классифицируют виды программных ошибок и объясняют некоторые основные достоинства систем типов:

http://www.lucacardelli.name/Papers/TypeSystems.pdf

Поскольку последняя статьяотносительно старый, позвольте мне добавить две вещи.

Во-первых, существует разница между типизируемым языком и требованием (явных) объявлений типов.Некоторые современные языки, особенно из функционального лагеря, имеют сложные системы типов, которые еще не требуют, чтобы вы записывали один тип большую часть времени.Все типы выводятся компилятором.

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

2 голосов
/ 11 февраля 2012

@ Лоран очень хорошо ответил на ваш вопрос.Я просто хотел бы добавить, что, например, есть инструмент тестирования / динамического поиска ошибок для JavaScript (язык с динамической типизацией), который называется TypedJS .Он предназначен только для предотвращения ошибок, возникающих из-за динамического программирования.

Пример ошибки, которую TypedJS пытается предотвратить, можно увидеть на этом снимке экрана:

TypedJS

...