Типы и типовый контроль

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

Именно введение типов устанавливает взаимно однозначное соответствие между объектом и его изображением в информационной системе.

В этом случае, несмотря даже на числовое совпадение, треугольник отличается от параллелепипеда тем, что вместе с тремя числами, описывающими стороны треугольника, содержится информация, свидетельствующая о том, что это и есть треугольник. Если теперь на входе каждой процедуры проверять тип объекта, то в случае ошибки, описанной выше, возникнет диагностическое сообщение («Вы пытаетесь применить теорему Пифагора к параллелепипеду»), вполне адекватное допущенной ошибке. Это полностью избавит программистов от необходимости «копаться» в хорошо отлаженных процедурах более низкого уровня в поисках ошибки, допущенной на более высоком уровне. Это, по существу, и есть повышение уровня программирования. Если комплекс процедур структурирован более сложным образом, чем представленная выше простая иерархия уровней, то наличие типов и типового контроля приводит к высокое модульности программирования.

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

Обычно защита памяти нарушается в двух случаях:

  • либо тогда, когда по ошибке программист обрабатывает адресную информацию операциями, не предусмотренными для работы с адресами (логические операции, сложение вместо операции индексации, когда проверяется диапазон массива, и т.д.);
  • либо тогда, когда в качестве адресов используется не адресная информация.

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

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

Заметим, что во многих языках высокого уровня (ПЛ/1, АДА) для повышения эффективности введена возможность неконтролируемой работы с адресной информацией. Именно эта возможность обычно воспринимается как черта ассемблера в языках высокого уровня. Другим примером является язык Си. В нем, хотя и существуют типы, практически отсутствует типовый контроль. По существу, следует признать этот язык вариантом ассемблера, что подтверждается практикой его использования.