Лекции (984123), страница 4
Текст из файла (страница 4)
В заклн! !ение этого 1еазд('.ла отметя!! что ло! и Е(ская структура, позволяющая реализовать данное функциональное описание, редко бывает единственной. точно так же. как и соответствующее физическое представление. Выбор может осуществляться по нескольким критериям, в частности по критерию общности: деланЕт гак, чтобы одно и то же логическое описание могло обслужи!зать сразу несколько функциональных спецификаций (72~. Рас(мотрим (щс раз исрархик! Описаний на п1ЕЛЕм(р( т. н.
длинной арифмлстики. На абстрактном математическом уровне вся арифметика сколь угодно длинная, никаких количественных ограничений нс накладывается. При отображении на средства языка программирования может не найтись соответствую(пего типа данных, например, .вещественного. В последнем случае его придется моделировать программным путем. Или может быть, что подходящий тип есть, но его точность недостаточна. В таком случае подключается длинная арифметика, которая может быть встроенной (Ру(1!Оп, РЕ,('ВС~Е), ил(л библиотечной (С; + с библиотекой 1»ооа1, дага), или созданной программистом вручную.
На уровне физического представления некоторые длинные типы могут иметь аппаратнуео поддержку, либо эмулироваться микропрограммно и даже, как это было па первых процессорах 1п1е1, иметь чисто программную интерпретацию па традиционном машинном уровне. 203 5 2 Файл Динамические объекты могут размегцаться не только в основной, но и во внешней памяти ;-.>ВХ1 ~43~. Динамические объекты, размещаемые на устройствах внешней памяти (магнитных, оптических, флэш и др.), обычно имеют структуру классического последовательного файла-картотеки (линейное медленное последовательное движение ленточного носителя) или массива (в случае дисковых устройств с высокой скоростью вращения позиционирование головки и сектора, выполняется хоть и тоже последовательно, но очень быстро).
Файл, как и любой другой динамический обьект, может быть пустым; количество составляющих его компонент может меняться в процессе выполнения программьь Однако, в отличие от динамических обьектов в основной памяти, файл должен иметь собственное имя, по которому его можно оонаружить в огй>еделенном месте конкретного внешнего запоминающего устройства. Это является следствием большей долговремеппости файлов как динамических обьектов на внешней памяти: время жизни файла, как правило, превышает время жизни программы, в пределах которого существуют все ес резидентные динамические объектьь Следовательно, имя файла и его характеристики должны быть известны операционной системе до начала выли>лнения программы обработки этого файла, хотя с общей точки зрения безымянные файлы как указатели на фай:к>выс переменные вполне правомерны.
Отметим некоторую несистемати шость динамических объектов Паскаля: создать или уничтожить файл средствами стандартного Паскаля (пе»»', с1!ярояе) нельзя. Файлы играют важнук> роль в любой вычислительной системс )721. При этом операции, которые вычислительная система может выполнять над ними, определяются пр>ии!ипамп, заложенными в конструкции тех устройств памяти, на которых эти файлы хранятся ~бЗ!. Например, для файлов, хранягцихся на МЛ и МД, определены чтс ние, .запись и стирание; для принтера .. только запись, а для СП-КОМ и сканера —. только чтение.
С другой стороны, флэш-память не основана на электромеханическом (линейном или вращательном) движении носителя. Заметим, что понятие файла используется и как абстракция данных, хранящихся на лн>бом из запоминающих устройств, что позволяет единообразно формулировать их общие характеристики, а также определять операции над ними ~20~. Слово «файл» в языке Паскаль угютребляется для динагиических обьектов, состоящих из ьвпледовательности компонент одного типа. Сама последовательность устанавливает естественный порядок компонент,и в любой момент непосредственно доступна (для чтения или для записи) только одна текущая компонента.
Другие компоненты становятся доступными по мере продвижения по файлу. Длина файла (число компонент) не фиксируется: в процессе выполнения программы файл может стать пустым, а люжет быть догюлнен новыми компонентами. Мы уже знакомы с лептой машины Тьюринга последовательностью ячеек со строго последовательным доступом. По отношению к программе файлы люгут быть внртренни>ии и внешниат, Внутренними (локальными) являются файлы, которые описаны в разделе маг Паскаль-программы и имена которых не указаны в заголовке этой программы.
Данные, .находящиеся в таком файле перед завершением работы программы, недоступны для дальнейшего использования, так как память лля файла была выделена с целью времен>юао хранения данных в период работы программы и должна быль освобождена для повторного исгк>льзования другими программами. Файлы, созданные (сгенерированные) до начала выполнения программы, а также сгенерированные в процессе се выполнения и оставленные для дол- 204 говрсмеппого хранения, называют внегпними.
Имена таких файлов необходимо нс только описывать в разделе айаг Паскаль-программы, но и обязательно указывать в заголовке программы. Концепция файлов Си более общая, чем в Паскале, она испытала большое влияние ОС ПМХ. Наряду с традиционными файлами в Си файлами являются стандартные потоки (аГс1ш, эФс1он1, эМегг), конвейеры, физические устройства вроде принтеров или датчиков температуры процессора, виртуальные устройства типа «черной дыры» /с1еч/пи11. В отличие от Паскаля в Си есть функция быстрого подвода, к нужному месту файла,, которая при соответствующей аппаратной поддержке может обеспечивать прямой доступ, моделируя массивы.
Работа с файлами в Си, также как и в Паскале, организована на процедурном уровне. Но соответствующий набора функций библиотеки языка Си существенно более динамичен и прагматичен. Возможно создание, переименование, удаление постоянных и временных файлов, имена которых задаются строковыми константами или переменными. В отличие от Паскаля каждый файл в Си может быть открыт и использован как в текстовом, так и в двоичном режимах. Такая дуалистическая интерпретация файлов естественна для языка системного программирования. 5.2.1 Функциональная спецификация.
Обозначим через Гт файловый тип с компонентами типа Т. Для задания функшюнальной спецификации файлового типа необходимо, во-первых, указать множество значений, множество изображений значений этого типа, правила интерпретации изображений и, вовторых, определить базовое множество атрибутов этого типа (множество операций над значениями этого типа и их свойства, множество отношений и их свойства, выделенные функции и т. п.) ~43~. Значениями типа Рт являются сколь угодно длинные, но конечные последователыюсти компонент типа Т (изображаемые по правилам интерпретации типа компонент Т). Такое бесконечное множество значений можно определить формально с помощью операции конкатенаиии (слияния, склеивания., сцепления) двух файлов, состоящих из компонент одного и того же типа: если ~, = ~то.....,х ) и Ь = (уп ° у4: то Л~~Ь ~ г м ° ° ~ гвсо уп ° ~ 9п~: где !! знак операции конкатенации, Тогда множество значений файлового типа строго определяется следуклцими порождающими правилами ~72~: 1.
11 есть файл типа Р'т (пустая последовательность, пустой файл); 2. если ~ есть файл типа Гг и 1 есть объект типа Т> то 1" ~~ ~Ц есть файл типа Гт, 3. никакие другие значения не являются файлами типа 1'т. Это определение является конструктивным, т. к. позволяет постепенно построить лнь бой файл, начиная с пустого, последовательным дописыванием его компонент в необходимом порядке, как мы это уже делали раньше при нисходящей разработке схем Тьюринга, путем уточнения цели (точки -- пустой схемы).
Базовое множество атрибутов файлового типа: 1. операция конкатенации, определенная выше; ее свойство несимметричность; 205 2, операция присваивания определяется как покомпонентное копирование одного фай- ла в другой с сохранением порядка и количества компонент. 3. отношение равенства: два файла, состоящие из компонент одного и того же типа, равны тогда и только тогда, когда они имеют одинаковую длину, а их соответствутощие компоненты равные значения; отношение равенства симметрично; 4, функции: создание (1юрождение пусто1о файла), доступ (последовательный доступ к каждой компоненте, причем только для чтения значения: чтобы прочитать значение Ь:-той компоненты файла, надо прочитать предварительно Й вЂ” 1 компоненту от начала файла), модификация (дозагп1сь компоненты того же типа в конец файла фактически это конкатенация файла и новой компоненты типа 1 ), уничтожение (стирание) файла.
5.2.2 Логическое описание и физическое представление В 11аскаль-программе может быть использован как именованный, так и неименованный файловый тип )43~. Именованный файловый тип должен быть описан в разделе описания типов: Суре Т вЂ” ...; 1' тав квмпоневтьс файла 1 < имя файлового типа ' — 61е оГ Т; Тогда объект-файл должен быть описан в разделе переменных таким образом: айаг <имя объекта — файла>: <имя файлового тина>: 11ри использовании неименованного файлового типа описание такого же объекта выглядит следующим образом: айаг <имя файловой переменной.: 61е оГ Т; При обраооткс описания обьекта;файла ~ транслятор должен выделить память в генерируемой программе под буфер файла, достаточную для размещения значения одной компоненты этого файла (тем самым порождая буферную переменную типа Т). Обозначается буфер файла таким образом: <имя файловой переменной> 1 Например, если имя файла, Х ~11с, то его буфер Х ~йс ~, то после прочтения трех его компонент возникнет следующая ситуация: ХЯе1: С1 Х Г11е: 206 Е1ЬЕ, < имя объекта — файла>; Создание и модификацию файла можно реализовать в Паскаль-программе, используя стандартную функцию ео1® и процедуры гевеС1 ! ), геътГСеГ ! ).
деС® и рнС®, где ! имя файла (о((Ораторов ввода/вывода пи в Паскале, ни в Си пег, что объясняется большим разнообразием вн(шних устройств). Алгоритмы выполнения этих процедур приведены в (9(. Известные нам процедуры геасГ и ъ((гГСе выра,жаются через низкоуровневьк( средства, ввода (вывода Паскаля ( ледующим образом: х: — !"; й;еС!!); геасГ(Г, х); Е:=х; ъъ(г!Се!1, х); рпСЯ; Процедура гевеС готовит указанный файл для чтения начиная с ллервого элемента. Если файл не >(уст, то в результате геяеС в буфернук> переменную л" ! заносится значение первой компонент(.л файла и функция ео1 получает значение 1а1яе, Вторым параметром процедуры геяеС во многих расширениях Паскале является строка с именем реального файла ОС, сопоставляемого данной фай:лавой переменной Паскаля.