2017-01-12 14 views
2

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

ответ

6

Динамически типизированные языки должны выполнять проверку типов , в то время как код работает. Хотя их иногда можно скомпилировать, они должны сократить множество углов для разумной производительности. Один большой недостаток проверки во время выполнения заключается в том, что если тип недействителен, интерпретатор может выполнять только исключения или прекратить выполнение.

Поэтому они часто пытаются принуждать типы к предотвращению исключений, даже если это может быть нежелательным. В python нередко обнаруживается, что простое деление целыми целыми означает, что мой пользовательский вывод внезапно заполнен «2.0», потому что я не возвращал явно int.

Рациональность в области информатики - это то, что проверка типов является чрезвычайно тяжелым алгоритмом. Для каждой функции, которую вы вызываете, все используемые типы должны быть проверены (или принудительно, что может быть другим вызовом функции), и информация о типе должна быть обновлена ​​впоследствии. Во время выполнения вы можете позволить себе только простой тип системы и очень небольшую оптимизацию. Компилятор по сравнению может использовать даже систему слабых типов для оптимизации ваших неэффективных алгоритмов.


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

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

Естественно, что также имеются случаи, когда требуется слабая типизация. Динамические языки часто выполняют роль сценариев; они быстро кодируются, легко интерпретируются и могут быть перенесены на новые платформы быстрее, чем компилятор! Это делает их неоценимыми для склеивания очень разных систем вместе. Один скрипт может взаимодействовать с операционной системой и многими программами, чтобы запланировать ежедневную загрузку всех последних видео кошек с вашего любимого веб-сайта.

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

+0

Это всеобъемлющий и продуманный ответ. Спасибо, что положили это вместе, оцените! – user3325789