С) операции над файлами
· Создание файла, не содержащего данных. Смысл данного вызова - объявить, что файл существует, и присвоить ему ряд атрибутов. При этом выделяется место для файла на диске и вносится запись в каталог.
· Удаление файла и освобождение занимаемого им дискового пространства.
· Открытие файла. Перед использованием файла процесс должен его открыть. Цель данного системного вызова - разрешить системе проанализировать атрибуты файла и проверить права доступа к нему, а также считать в оперативную память список адресов блоков файла для быстрого доступа к его данным. Открытие файла является процедурой создания дескриптора или управляющего блока файла. Дескриптор (описатель) файла хранит всю информацию о нем. Иногда, в соответствии с парадигмой, принятой в языках программирования, под дескриптором понимается альтернативное имя файла или указатель на описание файла в таблице открытых файлов, используемый при последующей работе с файлом. Например, на языке Cи операция открытия файла fd=open(pathname,flags,modes); возвращает дескриптор fd, который может быть задействован при выполнении операций чтения или записи.
· Закрытие файла. Если работа с файлом завершена, его атрибуты и адреса блоков на диске больше не нужны. В этом случае файл нужно закрыть, чтобы освободить место во внутренних таблицах файловой системы.
· Позиционирование. Дает возможность специфицировать место внутри файла, откуда будет производиться считывание (или запись) данных, то есть задать текущую позицию.
· Чтение данных из файла. Обычно это делается с текущей позиции. Пользователь должен задать объем считываемых данных и предоставить для них буфер в оперативной памяти.
· Запись данных в файл с текущей позиции. Если текущая позиция находится в конце файла, его размер увеличивается, в противном случае запись осуществляется на место имеющихся данных, которые, таким образом, теряются.
Вопрос 16
Синтаксис обращения к процедурам
Текст включающий в себя области описаний (констант, типов, процедур и функций) и составной оператор, наз
Имена → значения
Procedure → имя (список формальных параметров).
Блок → тело процедуры (запись, алгоритм вычислений).
Любая функция (процедура) определяется некоторым выражением, но выражение определяет несколько функций. Список формальных параметров состоит из выражений вида: v:t или var v:t, где t – имя типа, v – идентификатор.
V – это не имя переменной (в программистском смысле), она не именует никакую область памяти. С другой стороны, это переменная в математическом смысле, поскольку определена область значений.
Область описаний ← Блок → Составные операторы
Объекты, определённые в соответствие определения процедуры в блоке, называются локальными; определённые вне этого блока – глобальными.
Блоки могут быть вложены друг в друга.
(Рисунок)
Фрагмент блока, начинающийся с описания объекта до конца блока, называется областью действия этого объекта. Именно в этом фрагменте соответствующее определению имя имеет заданные этим определением значения. Вне области действия имя либо имеет другой смысл, либо не имеет никакого смысла.
Здесь встречаемся с проблемой конфликта (коллизии) имён – несколько разных объектов могут носить одно и то же имя. Всегда имеется в виду наиболее локальное описание.
Описание функции
Function – пользовательское имя функции (список формальных параметров) (как в случае процедур).
Тип значений функций (имя типа) (в стандартном Паскале скалярный)
Блок.
Соответствующий составной оператор, тело функции, обязан в любом случае определять значения функции, что семантически выглядит как оператор присваивания имени функции (имя функции:= выражение того же типа).
Чистая ошибка – применение имени функции справа. Справа имя функции может появиться только в специальном случае. В Delphi то же самое может выглядеть так:
Result:= выражение, где result – стандартная переменная соответствующего типа.
Function max(var a: tVector; n: tIndex): tComponent;
Begin
M:=a[1];
For I:=2 to n do
If m<a[i] then m:=a[i]; max:=m;
End.
Обращение к функции
Синтаксис: имя функции: список фактических параметров.
Семантика: выражение соответствующего типа. Может использоваться выражение этого типа.
Формальная семантика: достаточно ограничения случаем
V:= обращение к функции, где V – переменная, подставляемая вместо имени функции.
В свою очередь, этот оператор очевидным образом трактуется как модифицированное тело функции.
Синтаксис использования или обращения к процедурам.
Имя программы (список фактических параметров).
Список фактических параметров, разделённых запятыми, список выражений вида е1,…,еn.
Список фактических параметров, согласованных со списком формальных параметров, согласованных по количеству и типу. Вместо параметров переменных могут стоять переменные, вместо параметров значений можно поставить произвольное выражение того же типа.
Правила построения модифицированного тела:
1) Избавление от коллизии имён. При наличии коллизии заменить имена локальных переменных или других объектов с дублированными именами на новые, ещё не использованные в программе.
M:=a[i];
For i:=1 to n do
If m>a[i] then m:=a[i];
2) Параметры переменные заменяются на имена фактических параметров
3) Параметры значения вычисляются и копируются.
Вопрос 17
Семантика процедур и функций.
Одна из трактовок понятия функции – функция с несколькими входами (аргументами) и несколькими результатами (выходами). Когда число результатов равно 1 получаем понятие многоместной функции. В этом случае Паскаль позволяет вернуться к обычной функциональной нотации.
Семантика обращений - правила построения модифицированного тела процедуры: коллизия имен, семантика параметров.
Семантика
Прямая подразумеваемая математическая семантика почти тривиальна.
Для нас привычно вход и выход процедуры.
Имена переменных входа называются входными, выхода – выходными.
К паскалевским процедурам используется другое деление: изменяемые значения (имени всех выходов, которые могут быть входными) и значения (чистые входы, выходами не являющиеся).
X:=x+y;
Внутри процедуры могут использоваться вспомогательные объекты (локальные объекты). После установления типового соответствия между определениями процедур семантика обращения к процедуре ясна – это вычисление функции в заданной точке.
Это действительно так, если все результаты процедуры объявлены как var-переменные, все оставшиеся коды объявлены как параметры значения, если все остальные используемые в теле процедуры имена локальны.
Мы не обязаны это делать, что чаще всего мотивируется соображениями эффективности.
Пример. Процедура вычисления максимального среди первых элементов массива.
Type tIndex=1..100;
tVector=array [tIndex] of real;
procedure max;
a: tVector;
n: tIndex;
Var m:real;
Begin
M:=a[i];
For i:=2 to n do
If m>a[i] then m:=a[i];
End.
Исключение: файлы мы обязаны объявлять как параметры переменные, даже если по логике задачи это ход, то есть в теле процедуры файл не изменяется.
Как описывать «нестандартную» семантику обращения?
Max(b,10,x);
Понять семантику обращения (то, как оно работает), уметь написать вместо обращения (пользовательского имени) соответствующее ему значение.
Понятно, что этим значением будет тело процедуры, но не в точности оно, поэтому фрагмент программы, эквивалентный обращению, называется модифицированным телом процедуры.
Правила построения модифицированного тела:
1. Избавление от коллизии имён. При наличии коллизии заменить имена локальных переменных или других объектов с дублированными именами на новые, ещё не использованные в программе.
M:=a[i];
For i:=1 to n do
If m>a[i] then m:=a[i];
2) Параметры переменные заменяются на имена фактических параметров
3) Параметры значения вычисляются и копируются.
Правила локализации. Побочные эффекты.
Глобальные значения можно понимать как мат. параметр, именованную константу.
Правило полной локализации: не использовать глобальных объектов (подразумевалось в предыдущей лекции).
Правило частичной локализации: при использовании глобальных объектов документировать и не изменять.
Изменение значений глобальных объектов в поле процедуры называется побочным эффектом.