Я бы использовал динамический язык в любое время: простота и гибкость важнее, чем производительность и четкость. Статическая типизация дает компилятору много информации, которую можно использовать для написания действительно быстрого кода сборки. Это также делает контракты явными, возможно, делая разделы кода легче рассуждать отдельно. Однако из-за того, что эти контракты настолько явные и имеют волновые эффекты в таком большом количестве кода, их трудно изменить. В системах, которые требуют высокой степени гибкости, это может привести к большой сложности, чтобы обойти жесткость статической типизации.
Лично я не вижу, чтобы отсутствие статической проверки типов было таким уж большим делом. Конечно, сбой во время компиляции - это идеальный быстрый сбой. Тем не менее, динамическая языковая парадигма не так уж плоха. Когда во время выполнения возникает ошибка типа на динамическом языке, все происходит немедленно и с явными сообщениями об ошибках. Вы не просто получаете странное неопределенное поведение и провал в совершенно другом месте.
С другой стороны, я считаю, что хорошая система шаблонов (не C ++) и логический вывод типов могут быть абсолютной находкой. Это позволяет вам иметь лучшее из обоих миров, так как это в основном динамическая типизация времени компиляции. Все еще статически проверяется во время компиляции. Ошибки улавливаются рано, и генерируется эффективный код сборки. Тем не менее, вы сохраняете гибкость в том, что вам не нужно делать контракты явными во время разработки. Насколько я понимаю, Haskell, OCaml и т. Д. Делают это довольно хорошо. Если вам интересен язык с более распространенным интерфейсом, попробуйте D.