В динамических языках, таких как JavaScript или Python, тип переменной определяется во время выполнения. Это одна из причин, почему они медленнее, чем типизированные языки, такие как Java.
Как выполняется проверка типа? Какова основная причина медленного процесса?
Ответы:
В этом вопросе путаница.
Существует предположение, что проверка типов выполняется медленно, что не всегда так.
Вопрос также , кажется, путают процесс типа отправки с проверкой типов , и это две разные вещи. Один - это процесс, который выполняется во время выполнения, другой - процесс во время компиляции. Я подозреваю, что вопрос действительно касается отправки типа.
Именно диспетчеризация типов может привести к накладным расходам во время выполнения, потому что вычисления тратят время с инструкциями, которые динамически определяют, какое действие предпринять, основываясь на типах значений, которые он видит во время выполнения. например, в динамическом языке, если я применяю «+» к двум вещам, я могу иметь в виду добавление чисел или конкатенацию строк, поэтому мне нужно потратить время на изучение того, что под рукой, чтобы решить, что делать. Существуют стратегии оценки, которые могут снизить стоимость динамической отправки. (например, отслеживание JIT)
Что касается проверки типов в JavaScript, см .: http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/ . Для более общего обзора того, как работают средства проверки типов, стандартные учебники по языку программирования будут охватывать алгоритмы. Например, http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/
источник
По сути, в нетипизированных языках каждая ссылка указывает на объект, который содержит как тип, так и значение. Например,
var a = 3
указывает на экземпляр, который содержит значение 3 и тип int, если вы делаетеa = "bla"
, ссылка обновляется на экземпляр, который содержит строку «bla» и строку типа, старый объект отбрасывается и т. Д ...Это медленно, потому что каждый раз, когда необходимо выполнить операцию (например
a + b
) с этим базовым типом, среда выполнения должна сначала разыменовать объекты, проверить совместимость их типа, выполнить операцию, создать новый объект.Напротив,
a + b
в C ++ или Java проверяет во время компиляции, что типы являются допустимыми и совместимыми, тогда a и b сохраняются как непосредственные значения (не ссылки), и сложение является простой операцией процессора над этими значениями.Конечно, это все очень теоретически. На практике в этом процессе можно провести большую оптимизацию, чтобы избежать большинства накладных расходов, а языки с динамической типизацией могут работать довольно быстро.
источник
Каждое значение хранится вместе с его типом, который необходимо проверить первым. Также преобразования, скажем, из строки в число проходят проверку на лету.
источник