Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 157

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 151 152 153 154 155 156 < 157 > 158 159 160 161 162 163 .. 316 >> Следующая

Следует, однако, заметить, что на уровне семантики передачи процедурам алгоритмов в качестве параметров модели вычислений стандартного и Object Pascal почти совпадают. Их различия не касаются назначения и механизмов передачи параметров-процедур, они связан лиь с тем, что в Turbo Pascal и Object Pascal процедурам и функциям пта тся придать смысл значений так называемых процедурных типов. Язык допускает определение переменных таких типов и, следовательно, присваивание им 'алгоритмических' значений: тел процедур и функций, и уже, как следствие, он избавляется от специального определения таких конструкций, как формальный параметр-процедура, спецификация формальнх параметров-процедур и формальнх параметров-функций.
опытка переноса спецификации параметров-процедур и параметров-функций на уровень типовой информации наиболее последовательно проводится в языке Алгол 68, где декларируется, что подпрограмма есть (исполняемое) значение процедурного или функционального типов (видов — в терминологии языка). В развитии Pascal подобное средство, представленное в Turbo Pascal и Delphi, связывается с возможностью использования описаний такого
21 Более того, есть исключительно тонкие теоретические результаты, показывающие, что параметр-процедура, в свою очередь принимающий параметры-процедуры, ведет себя принципиально по-другому, чем привычные программистам объекты низших типов. В частности, структурный переход из тела такой процедуры может привести к неустранимым и исключи -тельно трудно диагностируемым некорректностям.
8.5. ПАРАМЕТРИЗАЦИЯ
443
рода:
type Prt =procedure (X : Integer; Y : Real); Fut = function ( С : Integer) : Real;
определяих аблон :
• процедуры с двумя параметрами указанных типов и
• функции с одним параметром, вырабатывающей вещественное значение
(как и спецификации параметров-процедур стандартного Pascal, такие шаблоны имеют избыточные имена параметров: X, Y и С).
Такие описания вводят имена так называемых процедурных типов (в примере — Prt и Fut). Их можно использовать для определения процедурных и функциональных переменнх:
var p : Prt;
f: Fut;
с которыми допускается естественное оперирование: присваивание 'процедурных' значений (если источник значения имеет тип, соответствующий шаблону процедуры или функции), использование для вызова подпрограмм . Следует заметить, что в качестве литеральных изобра ений значений процедурных типов можно рассматривать описания процедур и функций, но с одной оговоркой: такие литеральне изобра ения значений нельзя использовать в качестве вра ений (т. е. их нельзя присваивать процедурнм и функциональным переменнм, они могут быть только описаниями обычных процедур). Это кажется на первый взгляд чисто технической недоработкой, связанной с тем, что в данной реализации информация о процедуре при присваивании не дублируется. Но на самом деле такое присваивание ввело бы авторов системы в плохо знакомый им мир значений всих типов, который они и в страно усеченной-то форме никогда не могли корректно реализо-
22
вать.22
22 Один из авторов книги, который всегда интересовался проблемой значений высших типов, пытался работать с ними в доступных ему версиях трансляторов. И трансляторы с Алгола 68, и все версии расширений языка Pascal, с которыми ему приходилось иметь дело, содержали в данном месте ошибки реализации.
444
ГЛАВА 8. ПОДПРОГРАММЫ
В реализационном плане процедурне и функциональные переменне в первом приближении представляются как указательные переменные, которые в состоянии хранить в качестве значений адреса процедур и функций.
оэтому не удивительно, что для С/С++ средства такого рода определен естественно, т. е. как описание указателя (примеры см. в программе 10.2.8 в п. 10.2.5, где, в частности, показана одна из возмо ностей использования указателей на процедуры). Но для данного языка также естественно, что контроль использования подобных указателей лежит на программисте.
Синтаксис описания и использования процедурных параметров Object и Turbo Pascal иллстрируется следуим примером:
procedure PP (T : Prt); begin
T (5, 5.5);
end; {PP}
и, соответственно, правомерны операторы PP(RP) и PP(p), если RP удовлетворяет шаблону, определенному в описании Prt, а процедурное значение (некорректное значение с точки зрения вызова PP(p) переменной p присвоено быть не может).
По своей природе реализованные в нынешних общедоступных системах программирования процедурне значения явля тся ссылочными — никакой переписи программного кода при присваивании таких значений не происходит. оэтому параметр-процедура и параметр-функция переда тся как значения, а присваивание соответствующим формальным параметрам этих значений оказывается присваиванием ссылок.
С процедурнми типами расирений Pascal связан ряд технических ограничений, которые стоит признать достаточно разумными, поскольку они по-зволя т до некоторой степени отгородиться от теоретических опасностей, о которых, судя по всему, авторы системы умом даже не подозревали, но которые они нутром чуяли.
ля программирования наиболее суественнми из них явля тся:
Предыдущая << 1 .. 151 152 153 154 155 156 < 157 > 158 159 160 161 162 163 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100