На мой взгляд, разница между статической и динамической типизацией сводится к стилю кодирования. Хотя в Scala есть структурные типы, в большинстве случаев программист думает о типе объекта, включая такие гаджеты, как trait. С другой стороны, я думаю, что программисты Python / Javascript / Ruby думают с точки зрения прототипа объекта (список методов и свойств), который немного отличается от типов.
Например, предположим, что есть семейство классов под названием Vehicle
, подклассы которого включают Plane
, Train
и Automobile
; и другое семейство классов, называемое Animal
, подклассы которого включают Cat
, Dog
и Horse
. Программист Scala, вероятно, создаст черту с именем Transportation
или что-то с
def ride: SomeResult
def ride(rider: Someone): SomeResult
как член, поэтому она может обращаться как с Train
, так и с Horse
как средство передвижения. Программист Python просто передал бы объект train без дополнительного кода. Во время выполнения язык выясняет, что объект поддерживает ride
.
Тот факт, что вызовы методов разрешаются во время выполнения, позволяет таким языкам, как Python и Ruby, иметь библиотеки, которые переопределяют значение свойств или методов. Хорошим примером этого является сопоставление O / R или привязка данных XML, в котором неопределенное имя свойства интерпретируется как имя поля в типе таблицы / XML. Я думаю, что это то, что люди подразумевают под «гибкостью».
В моем очень ограниченном опыте использования динамических языков, я думаю, что они быстрее кодируют в них, если вы не делаете ошибок. И, вероятно, когда вы или ваши коллеги освоите кодирование на динамическом языке, они будут делать меньше ошибок или начнут писать больше юнит-тестов (удачи). Из моего ограниченного опыта я очень долго находил простые ошибки в динамических языках, которые Scala может поймать за секунду. Кроме того, наличие всех типов во время компиляции облегчает рефакторинг.