Почему языки с динамической типизацией работают медленно? - PullRequest
16 голосов
/ 17 апреля 2009

Что затрудняет ускорение динамически типизированных языков по сравнению со статически типизированными языками. Другими словами, что является неотъемлемым свойством статически типизированных языков, которые позволяют легко оптимизировать скорость выполнения?

Ответы [ 6 ]

25 голосов
/ 17 апреля 2009

При доступе к атрибутам / методам в статически типизированных языках поиск обычно может быть сведен к статическому адресу функции. Даже в случае виртуальных методов, которые работают медленнее, поиск просто считывает смещение из виртуальной таблицы.

В динамических языках имена основаны на строках. Хотите посмотреть foo.bar? Найдите foo в хеш-таблице локальной переменной, затем найдите bar в хеш-таблице foo. В некоторых динамических языках, таких как Python и Ruby, могут быть дополнительные запросы / вызовы методов для реализации динамически генерируемых атрибутов.

Все эти поиски очень трудно сделать быстро. Python имеет одну из самых хорошо отлаженных реализаций хеш-таблиц в мире, и JavaScript потратил миллионы долларов на исследования, чтобы сделать это быстро. Эти тактики работают - сравните JavaScript в Chrome с IE 5, чтобы увидеть, сколько всего, - но они намного, намного сложнее, чем просто статически генерирующие вызовы функций.


Я должен упомянуть, что «динамический» язык может варьироваться. У Python есть несколько различных способов взаимодействия с поиском переменных, что хорошо в некоторых обстоятельствах, но очень усложняет оптимизацию. Другие динамические языки, такие как Common Lisp и Smalltalk, могут во многих случаях равномерно конкурировать со статическими языками, поскольку динамический поиск / модификации более управляемы.

12 голосов
/ 17 апреля 2009

Посмотрите на этот пример Python:

def fact(n):
    if n==0:
        return n
    return n*fact(n-1)

Что такое п? Это число? Это строка? Это класс, который вы определили ранее? У компилятора нет возможности узнать, какой ввод он получит. Вам нужно много проверять во время выполнения, а это значит, что вы выполняете неявную работу для простых операций.

10 голосов
/ 17 апреля 2009

Определенные типы оптимизаций времени компиляции могут быть выполнены, только если известен точный тип переменной.

В динамически типизированных языках также часто добавляется логика для определения типа и обеспечения правильности значения для типа.

5 голосов
/ 17 апреля 2009

Динамически типизированные языки должны выполнять все свои проверки во время выполнения, поскольку тип может измениться в ходе выполнения.

Языки со статической типизацией разрешают все типы во время компиляции, поэтому стоимость расходуется сразу, один раз.

Это основная причина того, почему динамически типизированные языки обычно работают медленнее. Но есть и другие вещи, о которых нужно подумать. Многое зависит от компилятора или интерпретатора, реализации GC, макета таблицы диспетчеризации и алгоритмов поиска, а также других оптимизаций.

Все зависит от реализации: динамический типизированный язык может работать быстрее, чем скомпилированный, для этого требуется больше работы.

1 голос
/ 17 апреля 2009

Ваш вопрос немного устарел, поскольку динамически типизированные языки на самом деле не медленные. Многие примеры могут быть на практике, но другие бывают быстрыми (где быстрое означает «разумно сопоставимый с с» или что-то в этом роде, ср. Общий шут).

Многие динамические языки работают на ВМ или даже интерпретируются, что может вызывать замедления, которых можно избежать. На определенном уровне существуют оптимизации, доступные статическим языковым компиляторам (или динамическим, которые дали правильные обещания не проявлять динамичность в отношении чего-либо), которые невозможны в полностью динамической ситуации.

Однако, если вы думаете о различиях между, скажем, python и c ++, например, проблема не в динамическом, а в статическом.

0 голосов
/ 17 апреля 2009

Это потому, что статически типизированные языки часто компилируются в машинный код, а динамически типизированные языки в большинстве случаев управляются интерпретатором.

...