КаталогИндекс раздела
ОглавлениеВперед


ОБЩИЕ УКАЗАНИЯ
к выполнению лабораторных работ по курсу
"Системное программирование"

1. Цель лабораторного практикума

Лабораторный практикум выполняется при изучении курса "Системное программирование и операционные системы" и имеет целью выработку у студентов навыков в трех направлениях:

  1. применение языка программирования С как инструмента для системного программирования;
  2. программное управление аппаратными средствами ПЭВМ на низком уровне;
  3. использование внутренних структур данных операционной системы MS DOS для получение информации и оперативной настройки системы.

В соответствии с указанными целями практикум разбивается на три части:

  1. лабораторные работы 1 - 4;
  2. лабораторные работы 5 - 9;
  3. лабораторные работы 10 - 16.

В "Общие указания" вынесены некоторые общие для выполнения всех или почтимайже всех лабораторных работ требования и правила.

2. Язык С как инструмент системного программирования.

Полное рассмотрение вопросов, связанных со второй и третьей частями лабораторного практикума есть [1], поэтому в этих методических указаниях мы ограничиваемся только небольшим объемом общей информации в указаниях к каждой конкретной работе. Там также приведены сведения о тех средствах языка С, которые обеспечивают низкоуровневый доступ. Однако, ощущается некоторый недостаток литературы, которая рассматривает те общие свойства языка, которые делают его наиболее приспособленным именно для целей системного программирования. Здесь мы коротко останавливаемся на этих вопросах с учетом того, что как работы 1 - 4, так и все последующие, предполагают использование именно этих свойств языка.

В [1] приведено описание тех функций языка, которые обеспечивают программный доступ к регистрам, к физической памяти, к портам ввода-вывода и к системе прерываний. Эти функции являются инструментом необходимым, но не достаточным для целей системного программирования, поскольку аналогичные средства можно найти и в других языках программирования (Basиc, Turbo-Pascal).

Главным качеством языка C, которое делает его именно языком системного программиста, является то, что "C - это язык относительно "низкого уровня"... Это означает, что C имеет дело с объектами того же вида, что и большинство ЭВМ, а именно, с символами, числами и адресами. Они могут объединяться и пересылаться посредством обычных арифметических и логических операций, осуществляемых реальными ЭВМ." [2]. Система программирования C при представлении данных не вносит никаких дополнительных структур памяти, которые не были бы "видны" программисту. Так, например, внутреннее представление массивов в языке C полностью совпадает с внешним: массив - это только последовательность слотов в памяти. Отсутствие специального дескриптора массива, с одной стороны, делает невозможным контроль выхода индексов за допустимое границы, но с другой, уменьшает объем памяти программы и увеличивает ее быстродействие за счет отсутствия в памяти дескриптора и команд проверки индекса при каждом обращении к элементу массива. Это общий принцип C-программ: программист имеет максимальные возможности для разработки эффективных программ, но вся ответственность за их правильность ложится на него самого. Поэтому отладка программ на языке C - непростой процесс, C-программи чаще "зависают" и выдают результаты, которые не всегда воспроизводятся и которые труднее объяснить, чем программы на других языках.

Чрезвычайно важным свойством языка C, которого нет в других языках, является адресная арифметика. Над данными типа "указатель" возможны арифметические операции, причем в них могут учитываться размеры тех объектов, которые адресуются указателем. Другое свойство указателей - их явная связь с конструкциями интеграции данных (массивы, структуры, объединения) и возможность подмены операций индексации и квалификации операциями адресной арифметики. За счет указателей программист имеет возможность удобным для себя способом структурировать адресное пространство программы и гибко изменять это структурирование.

Свойством, которое вытекает из общих принципов построения языка C, является слабая защита типов. В языках с сильной защитой типов (Pascal) для каждого типа данных определен набор доступных операций и компилятор запрещает применение к типу непредусмотренных для него операций и смешивание в выражениях данных разных типов. В C определен богатый набор правил преобразования типов по умолчанию, поэтому почти любая операция может быть применена к почти любому типу данных и выражения могут включать данные самых разных типов.

Еще некоторые средства языка не ориентированы непосредственно на низкоуровневое системное программирование, но могут бути очень полезны при разработке системных программ:

Важное качество языка C - высокая эффективность объектных кодов C-программы как по быстродействию, так и по объему памяти. Хотя это качество обеспечивается не столько свойствами самого языка, сколько свойствами системы программирования, традиция построения систем программирования C именно такова, что они обеспечивают большую, эффективность, чем, например, Pascal. Это связано еще и с "родословной" языков. Pascal возник как алгоритмический язык, предназначенный в своей первой версии не для написания программ, а для описания алгоритмов. Отсюда Pascal-трансляторы строились и строятся как синтаксически-ориентированные трансляторы характерно компилирующего типа: транслятор выполняет синтаксический анализ программы в соответствии с формально представленными правилами, а объектные коды формируются в основном в виде обращений к библиотечным процедурам, которые реализуют элементарные функции. Язык C ведет свое происхождение от языка BCPL, который был языком Макроассемблера. Отсюда и объектный код C-программы строится як последовательность машинных команд, которая оптимизируется для каждого конкретного выполнения данной функции.

В лабораторных работах 1 - 4 предлагается обратить внимание именно на эти свойства языка и далее применять их во всех последующих работах.

3. Порядок выполнения работы

Для выполнения всех лабораторных работ предлагается единый порядок, предусматривающий следующие шаги.

3.1. Ознакомиться с постановкой задачи и исходными данными. Определить вариант индивидуального задания.

3.2. Сконструировать структуру программы.

3.3. Составить текст программы и утвердить его у преподавателя.

3.4. Пункты 3.1 - 3.3. должны быть выполнены предварительно, до проведения данной лабораторной работы. Утверждение преподавателем текстов программ является допуском к лабораторной работе.

3.5. Набрать текст программы.

3.6. Выполнить компиляцию программы.

3.7. Провести анализ и исправление обнаруженных синтаксических ошибок в тексте программы и повторить пункты 3.6 и 3.7. При устранении всех синтаксических ошибок перейти к выполнению пункта 3.8.

3.8. Получить решение (изображение) и, в случае обнаружения логических ошибок, определить и устранить их. Продемонстрировать преподавателю окончательный вариант программы и ее работу.

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

4. Содержание отчета

Отчет оформляется по каждой лабораторной работе и состоит из следующих разделов.

4.1. Тема лабораторной работы.

4.2. Цель работы.

4.3. Индивидуальное задание.

4.4. Описание структур данных и алгоритмов

4.5. Результаты работы программы.

4.6. Интерпретация результатов.


КаталогИндекс раздела
ОглавлениеВперед