Я думаю, что вы путаете "слабую типизацию" с "динамической типизацией".
Термин «слабая типизация» означает «не строго типизированный», что означает, что значение ячейки памяти может отличаться от того, что указывает ее тип.
C является примером слабо типизированного языка. Это позволяет писать код, подобный этому:
typedef struct
{
int x;
int y;
} FooBar;
FooBar foo;
char * pStr = &foo;
pStr[0] = 'H';
pStr[1] = 'i';
pStr[2] = '\0';
То есть он позволяет обрабатывать экземпляр FooBar, как если бы он был массивом символов.
На строго типизированном языке это недопустимо. Либо будет сгенерирована ошибка компилятора, либо будет сгенерировано исключение времени выполнения, но никогда в любой момент адрес памяти FooBar не будет содержать данные, которые не являются допустимыми FooBar.
C #, Java, Lisp, Java Script и Ruby являются примерами языков, для которых подобные вещи запрещены. Они строго напечатаны.
Некоторые из этих языков «статически типизированы», что означает, что типы переменных назначаются во время компиляции, а некоторые «динамически типизируются», что означает, что типы переменных неизвестны до времени выполнения. «Статический против динамического» и «Слабый против сильного» являются ортогональными вопросами. Например, Лисп - это "сильный динамически типизированный" язык, тогда как "C" - это "слабый статически типизированный язык".
Кроме того, как уже указывали другие, существует различие между «выведенными типами» и типами, указанными программистом. Ключевое слово «var» в C # является примером вывода типа. Однако это все еще статически типизированная конструкция, потому что компилятор определяет тип переменной во время компиляции, а не во время выполнения.
Итак, ваш вопрос на самом деле:
Каковы относительные достоинства и
недостатки статической типизации, динамическая
печатать, слабая печать, стонгирование,
предполагаемые статические типы и пользователь
указанные статические типы.
Я даю ответы на все эти вопросы ниже:
Статическая печать
Статическая типизация имеет 3 основных преимущества:
- Лучшая поддержка инструмента
- A Уменьшена вероятность появления некоторых типов ошибок
- Производительность
Пользовательский опыт и точность таких вещей, как интеллектуальность и рефакторинг, значительно улучшены в языке со статической типизацией благодаря дополнительной информации, которую предоставляют статические типы. Если вы введете «а». в редакторе кода «a» имеет статический тип, тогда компилятор знает все, что может на законных основаниях идти после «.» и, таким образом, может показать вам точный список завершения. Можно поддерживать некоторые сценарии на динамически типизированном языке, но они намного более ограничены.
Кроме того, в программе без ошибок компилятора инструмент рефакторинга может идентифицировать каждое место, где используется конкретный метод, переменная или тип. Это невозможно сделать на динамически типизированном языке.
Второе преимущество несколько спорно. Сторонники статически типизированных языков любят это утверждать. Противники статически типизированных языков, однако, утверждают, что обнаруженные ими ошибки тривиальны и что они все равно будут обнаружены при тестировании. Но вы получаете уведомление о таких вещах, как неправильно написанные переменные или имена методов, что может быть полезно.
Статически типизированные языки также позволяют лучше анализировать поток данных, что в сочетании с такими вещами, как Microsoft SAL (или аналогичными инструментами), может помочь обнаружить потенциальные проблемы безопасности.
Наконец, при статической типизации компиляторы могут выполнять гораздо большую оптимизацию и, следовательно, создавать более быстрый код.
Недостатки:
Основным недостатком статической типизации является то, что она ограничивает возможности, которые вы можете делать. Вы можете писать программы на динамически типизированных языках, которые вы не можете писать на статически типизированных языках. Ruby on Rails является хорошим примером этого.
Динамический набор
Большим преимуществом динамической типизации является то, что она намного мощнее, чем статическая. С ним можно сделать много действительно классных вещей.
Еще одно: требуется меньше печатать. Вам не нужно указывать типы повсюду.
Недостатки:
Динамическая типизация имеет 2 основных недостатка:
- Вы не получаете столько "рук" от компилятора или IDE
- Не подходит для критических сценариев производительности. Например, никто не пишет ядра ОС в Ruby.
Сильный набор:
Самым большим преимуществом строгой типизации является безопасность. Обеспечение строгой типизации обычно требует некоторой поддержки во время выполнения. Если программа может доказать безопасность типов, то многие проблемы безопасности, такие как переполнение буфера, просто исчезнут.
Слабый набор:
Большим недостатком строгой типизации и большим преимуществом слабой типизации является производительность.
Когда вы можете получить доступ к памяти любым удобным вам способом, вы можете написать более быстрый код. Например, база данных может выгружать объекты на диск, просто записывая их необработанные байты и не прибегая к таким вещам, как «ISerializable» интерфейсы. Видеоигра может отбросить все данные, связанные с одним уровнем, просто запустив один свободный в большом буфере, вместо того, чтобы запускать деструкторы для множества мелких объектов.
Для того, чтобы делать такие вещи, требуется слабая печать.
Тип вывода
Вывод типа дает много преимуществ статической типизации, не требуя слишком большого набора.
Пользовательские типы
Некоторым людям просто не нравится вывод типов, потому что им нравится быть явными. Это больше похоже на стиль.