В литературе не ясно об этом. Я думаю, что строгий тип - это не да / нет, есть разные степени строгого набора.
Язык программирования имеет спецификацию того, как он выполняет программы. Иногда не ясно, как выполнить с определенными программами. Например, программы, которые пытаются вычесть строку из числа. Или программы, которые делятся на ноль. Есть несколько способов справиться с этими условиями. В некоторых языках есть правила для устранения этих ошибок (например, они выдают исключение). Другие языки просто не имеют правил для решения этих ситуаций. Эти языки, как правило, имеют системы типов для предотвращения компиляции программ, которые ведут к неопределенному поведению. Кроме того, существуют языки с неопределенным поведением и отсутствием системы типов для предотвращения этих ошибок во время компиляции (если вы напишите программу, которая обнаружит неопределенное поведение, она может запустить ракеты).
Итак:
Языки, которые определяют, что происходит во время выполнения в каждом случае (например, добавление числа в строку), называются динамически типизированными.
Языки, которые препятствуют выполнению программ с ошибками во время компиляции, статически типизированы.
Языки, которые не определяют, что происходит, а также не имеют системы типов для предотвращения ошибок, называются слабо типизированными.
Значит, Java статически типизирована? Да, потому что его система типов запрещает вычитать строку из числа. Нет, потому что это позволяет делить на ноль. Вы можете предотвратить деление на ноль во время компиляции с помощью системы типов. Например, создавая числовой тип, который не может быть нулевым (например, NonZeroInt), и позволяет делить только на числа, имеющие этот тип.
Значит, C строго типизирован или слабо типизирован? C строго типизирован, потому что система типов запрещает некоторые ошибки типов. Но он слабо типизирован в других случаях, когда не определено, что происходит (а система типов не защищает вас).