По сути, в нетипизированных языках каждая ссылка указывает на объект, который содержит как тип, так и значение. Например, var a = 3
указывает на экземпляр, который содержит значение 3 и тип int, если вы делаете a = "bla"
, ссылка обновляется на экземпляр, который содержит строку «bla» и строку типа, старый объект отбрасывается и т. Д ...
Это медленно, потому что каждый раз, когда необходимо выполнить операцию (например a + b
) с этим базовым типом, среда выполнения должна сначала разыменовать объекты, проверить совместимость их типа, выполнить операцию, создать новый объект.
Напротив, a + b
в C ++ или Java проверяет во время компиляции, что типы являются допустимыми и совместимыми, тогда a и b сохраняются как непосредственные значения (не ссылки), и сложение является простой операцией процессора над этими значениями.
Конечно, это все очень теоретически. На практике в этом процессе можно провести большую оптимизацию, чтобы избежать большинства накладных расходов, а языки с динамической типизацией могут работать довольно быстро.