Найти в Дзене

Сильная и строгая типизация: отличия

🧐Даже опытные разработчики, зачастую, употребляют понятия "строгая" и "сильная" типизация как синонимы. Однако между ними все же есть разница. 🔹Сильная типизация — про запрет неявных преобразований типов. Если попытаться сложить число и строку, программа выдаст ошибку.
Пример: Python. Если написать 1 + "2", будет ошибка. 🔹Слабая типизация — язык пытается быть «удобным» и сам негласно превращает один тип в другой (приведение типов).
Пример: JavaScript. Если написать 1 + "2", он просто сделает из числа строку и выдаст "12". 🔹Строгая типизация (часто синоним статической типизации):
— типы проверяются жёстко и последовательно
— ошибки выявляются рано (часто на этапе компиляции)
— нужно заранее сказать, что переменная x — это целое число.
Примеры: Java, C++, Rust, TypeScript. 🔹Нестрогая типизация (часто синоним динамической типизации):
— типы проверяются только во время выполнения
— ошибок на этапе написания кода почти не ловит
— переменная может сначала хранить число, а через секунду
Оглавление

🧐Даже опытные разработчики, зачастую, употребляют понятия "строгая" и "сильная" типизация как синонимы. Однако между ними все же есть разница.

🔹Сильная типизация — про запрет неявных преобразований типов. Если попытаться сложить число и строку, программа выдаст ошибку.
Пример: Python. Если написать 1 + "2", будет ошибка.

🔹Слабая типизация — язык пытается быть «удобным» и сам негласно превращает один тип в другой (приведение типов).
Пример:
JavaScript. Если написать 1 + "2", он просто сделает из числа строку и выдаст "12".

🔹Строгая типизация (часто синоним статической типизации):
— типы проверяются жёстко и последовательно
— ошибки выявляются рано (часто на этапе компиляции)
— нужно заранее сказать, что переменная x — это целое число.
Примеры: Java, C++, Rust, TypeScript.

🔹Нестрогая типизация (часто синоним динамической типизации):
— типы проверяются только во время выполнения
— ошибок на этапе написания кода почти не ловит
— переменная может сначала хранить число, а через секунду — массив
Примеры: Python, JavaScript, PHP.

Почему возникает путаница?

Чаще всего разработчики называют «строгой» именно статическую типизацию. Им кажется, что если нужно везде прописывать типы (int x = 5), то это и есть «строгость».

Но посмотрим на Python:
1. Он
динамический (не надо заранее объявлять типы).
2. Но он
сильный (строгий) (он не даст сложить строку и число просто так).

А теперь посмотрим на C:
1. Он
статический (типы объявляются заранее).
2. Но он
слабый (он позволит обращаться с символом как с числом и наоборот, даже если вы этого не планировали).

Вывод

Итак, сильная ≠ строгая типизация.
Сильная / слабая — это про неявные преобразования типов.
Строгая / нестрогая (почти всегда синоним статическая / динамическая) — это про момент проверки типов: на этапе компиляции или уже в runtime.

Прим. поводом для данной статьи послужил комментарий к статье про
REST и SOAP. Спасибо, что оставляете комментарии.