Поскольку скомпилированные языки должны учитывать объем используемой памяти при компиляции.
Когда вы видите что-то вроде:
int a
в C ++, компилятор выплевывает код, который резервирует четыре байта памяти, а затем назначает локальный символ «a» для указания на эту память. Если у вас был типизированный язык сценариев, такой как javascript, интерпретатор за кадром выделяет требуемую память. Вы можете сделать:
var a = 10; // a is probably a four byte int here
a = "hello world"; // now a is a 12 byte char array
Между этими двумя строками происходит много всего. Интерпретатор удаляет память в a, выделяет новый буфер для символов, а затем назначает переменную var для указания на эту новую память. В строго типизированном языке нет интерпретатора, который бы управлял этим для вас, и поэтому компилятор должен написать инструкции, учитывающие тип.
int a = 10; // we now have four bytes on the stack.
a = "hello world"; // wtf? we cant push 12 bytes into a four byte variable! Throw an error!
Таким образом, компилятор останавливает компиляцию этого кода, чтобы процессор не слепо записывал 12 байтов в четырехбайтовый буфер и вызывал несчастные случаи.
Дополнительные накладные расходы на компилятор, пишущий дополнительные инструкции для заботы о типе, значительно замедляют язык и лишают преимущества таких языков, как C ++.
:)
-nelson
РЕДАКТИРОВАТЬ в ответ на комментарий
Я мало что знаю о Python, поэтому не могу много говорить об этом. Но свободная типизация значительно замедляет время выполнения. Каждая инструкция, которую вызывает интерпретатор (VM), должна вычисляться и, если необходимо, приводить переменную к ожидаемому типу. Если у вас есть:
mov a, 10
mov b, "34"
div a, b
Тогда интерпретатор должен удостовериться, что a является переменной и числом, затем он должен привести b к числу перед обработкой инструкции. Добавьте эти накладные расходы для каждой инструкции, которую выполняет виртуальная машина, и у вас будет беспорядок:)