Тип значения выясняется в момент операции
В динамическом языке переменная обычно не закреплена за одним типом данных: сегодня в ней может храниться число, а позже — текст. Поэтому при написании программы часто можно передать в функцию вычитания любой аргумент. Сам вызов не обязательно будет отклонён заранее: язык проверит значения, когда программа действительно дойдёт до этой операции.
Если оба значения — числа, вычитание выполняется. Если вместо одного из них пришла строка, например текст из формы или ответа сервера, операция может завершиться ошибкой: из такого значения нельзя получить результат обычного числового вычитания. Точное поведение зависит от языка: одни выдадут исключение, другие сначала попробуют преобразовать строку в число.
Ошибка зависит от того, какой путь выполнится
Проверка во время запуска означает, что ошибка может долго оставаться незаметной. Пока функция получает только числа, всё работает; сбой появится лишь при конкретном вводе или в ветке программы, до которой раньше не доходили. Поэтому тесты должны проверять не только обычные значения, но и границы между разными видами входных данных.
Это не означает, что динамические языки вообще не позволяют обнаруживать такие проблемы заранее. Разработчик может проверять типы вручную, использовать аннотации или инструменты анализа. Но без дополнительной проверки решающим становится фактическое значение, пришедшее в момент выполнения. Практическое следствие простое: если функция ожидает числа, надёжнее проверить или преобразовать вход у границы программы, чем ждать, пока неожиданная строка сорвёт вычисление глубоко внутри.






