Языки с динамическими и статическими типами

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

Если с переменной статически (при написании программы) связывается определенный тип данных так, что во время работы программы этой переменной можно присваивать значения только указанного типа, то такие языки, как известно, называются языками со статическими типами. В противном случае, когда с переменной не связывается тип и переменная может содержать величины различных типов, языки называются динамическими.

Возможны, разумеется, и смешанные типы. С точки зрения эффективности реализации на существующих машинах предпочтительнее статические языки, так как для динамических языков необходимо вместе со значением величины хранить тип и обрабатывать его интерпретационно. Именно поэтому подавляющее большинство практически используемых языков высокого уровня являются статическими. Однако статические языки имеют определенные недостатки.

Динамические языки более удобны для программирования, о чем свидетельствует анализ истории развития языков. Почти все языки, которые в прошлом создавались с целью обеспечения удобства программирования практически без учета эффективности, оказывались динамическими. Такими языками являются диалоговые языки, например, АПЛ, РОР-2 и др. Характерно, что ведущий специалист в области языков Н. Вирт начинал свое языкотворчество с разработки динамического языка ЭЙЛЕР, имея целью обеспечение удобства программирования. Однако, убедившись в его крайне низкой эффективности, для всех своих последующих работ избрал направление статических языков. В такой важной, области, какой является система обработки символьной информации и логического вывода, прочное место заняли динамические языки (ЛИСП, ПРОЛОГ). Более того, для языка ПРОЛОГ динамика типов является существенной частью языка (например, семантика операции унификации).

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