При доступе к атрибутам / методам в статически типизированных языках поиск обычно может быть сведен к статическому адресу функции. Даже в случае виртуальных методов, которые работают медленнее, поиск просто считывает смещение из виртуальной таблицы.
В динамических языках имена основаны на строках. Хотите посмотреть foo.bar
? Найдите foo
в хеш-таблице локальной переменной, затем найдите bar
в хеш-таблице foo
. В некоторых динамических языках, таких как Python и Ruby, могут быть дополнительные запросы / вызовы методов для реализации динамически генерируемых атрибутов.
Все эти поиски очень трудно сделать быстро. Python имеет одну из самых хорошо отлаженных реализаций хеш-таблиц в мире, и JavaScript потратил миллионы долларов на исследования, чтобы сделать это быстро. Эти тактики работают - сравните JavaScript в Chrome с IE 5, чтобы увидеть, сколько всего, - но они намного, намного сложнее, чем просто статически генерирующие вызовы функций.
Я должен упомянуть, что «динамический» язык может варьироваться. У Python есть несколько различных способов взаимодействия с поиском переменных, что хорошо в некоторых обстоятельствах, но очень усложняет оптимизацию. Другие динамические языки, такие как Common Lisp и Smalltalk, могут во многих случаях равномерно конкурировать со статическими языками, поскольку динамический поиск / модификации более управляемы.