Языки программирования - концепции и принципы

При контроле соответствия типов ошибка


       При контроле соответствия типов ошибка обнаруживается сразу же, на своем месте, а не после того, как она «затерла» некоторую «постороннюю» память; целый класс серьезных ошибок исчезает из программ. Точнее, такие ошибки становятся ошибками этапа компиляции, а не ошибками этапа выполнения программы.

      Конечно, ничего не дается просто так, и существуют две проблемы конт­роля соответствия типов для массивов. Первая — увеличение времени выпол­нения, которое является ценой проверок (мы обсудим это в одном из следую­щих разделов). Вторая проблема — это противоречие между способом, кото­рым мы работаем с массивами, и способом работы контроля соответствия ти­пов. Рассмотрим следующий пример:





pascal

typeA_Type = array[0..9]of Real;                  (* Типы массивов *)            

type B_Type= array[0..8] of Real;

А: А_Туре:                                                   (* Переменные-массивы *)

В: В_Туре;

procedure Sort(var P: А_Туре);                    (* Параметр-массив *)

sort(A); (* Правильно*) sort(B);                     (* Ошибка! *)

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

       В языке Ada изящно решена эта проблема. Тип массива в Ada определяется исключительно сигнатурой, т. е.

Содержание  Назад  Вперед