Я не утверждаю, что лучше всего использовать статическую типизацию, просто интересуюсь, какие преимущества она имеет на самом деле. Я думал, что они были:
Глядя на мое собственное использование (в Java), я в основном работаю на компилятор. Когда он ловит ошибку типа, это обычно просто ошибка в тип, не ошибка кода — на самом деле, я не могу вспомнить, чтобы она когда-либо улавливала реальную ошибку (хотя, вероятно, она и есть).
Иногда я проходил через код для ужесточения типов — например, может быть набор классов, реализующих некоторый интерфейс I, и поэтому поле, которое может содержать любой из этих классов, имеет тип I. Но это может быть более -broad: иногда есть также некоторые поля, которые могут содержать только подмножество этих классов, поэтому систему типов можно сжать, создав новый интерфейс J, реализуемый только этим подмножеством классов, и этим полям присваивается тип J. «правильнее», невероятно утомительный, и довольно хрупкий, если что-то изменится.
Поэтому я считаю, что более быстрый код является основным преимуществом статической типизации в основных скомпилированных языках (Java, C #, C, C ++, Objective-C), а безопасность типов — это далеко не все, хотя есть и некоторые ниши, где безопасность типов является чрезвычайно полезно, например, языки ml для проверки интегральных схем. Я также слышал, что статическая типизация важна в базах данных.
Но я думаю, что есть еще одно преимущество:
Документация в том, что вы можете посмотреть на метод и узнать, какие допустимые аргументы. А для автоматически генерируемых документов типы аргументов имеют гиперссылки на интерфейс и доступные реализации. Я не думаю, что это убийственное преимущество, но оно реальное.
Очевидно, что python, ruby и т. Д. Прекрасно работают без статической типизации. Мне просто интересно, каковы его преимущества — как вы думаете? Какой у тебя опыт?
Система статических типов Java — невыразительный, устаревший подход к статической типизации, который почти на 40 лет устарел. Современная статическая типизация допускает богатую спецификацию инвариантов, которым должен удовлетворять код, с машиной, способной предоставить доказательства для этих инвариантов. Такие языки, как Haskell, Agda и ADA, иллюстрируют, как можно использовать типы для серьезной проверки программного обеспечения при относительно небольших затратах (по сравнению, например, с тестированием).
Таким образом, помимо очевидного преимущества наличия большего количества информации для компилятора, приводящей к более быстрому коду, чем это возможно без статических типов, факт заключается в том, что современные системы типов являются важными инструментами для автоматизированной проверки программного обеспечения. То, что вы просто не увидите, если единственная система типов, которую вы используете, это Java.
Используя статическую типизацию, вы указываете, какой тип данных следует ожидать в переменной. С нестатическим вы должны проверить тип данных перед выполнением обработки. Например, вы можете ожидать, что в вашем методе будет целое число, но ничто не мешает кому-то передать строку. Это открывает себя в мире боли ИМХО.