Скачиваний:
387
Добавлен:
01.05.2014
Размер:
1.33 Mб
Скачать

Лекция 3. Уровень программ. Интеллектуальное содержание программы.

1. Уровень программы

Понятие уровня программы известно с тех пор как первые «языки высокого уровня» получили свое название Однако, прежде чем это понятие сможет применяться в науке оно должно быть выражено количественно или приведено к измеримому виду так как в противном случае невозможно определить изменения уровня разных выражений какого либо алгоритма

Прежде, чем вводить метрическую характеристику уровня программы необходимо заметить что уровень языка и уровень программы являются разными понятиями хотя и тесно связанными Функциональное соотношение между ними и способы измерения уровня языка будут рассмотрены позднее Сейчас ограничимся измерением уровня отдельных программ Ранее выведенные выражения для определения объема V программы и потенциального объема V* подсказывают простой метод количественного выражения данного понятия Если записать уровень L программы являющейся реализацией какого либо алгоритма как

(3.1)

то лишь наиболее сжатое выражение  какое только возможно для алгоритма будет иметь уровень равный единице

Более объемные реализации будут иметь меньшие значения уровня так что L1

Перестроив выражение (3.1) и выделив независящий от реализации член получим

V* = LV (3.2)

при увеличении объема уровень программы уменьшается и наоборот

Обычно легче написать вызов процедуры чем саму процедуру С этой точки зрения проще всего было бы использовать потенциальный язык (L = 1). Однако из самого определения потенциального языка следует что любая процедура которая когда либо могла бы понадобиться в нем уже присутствует Так как число таких процедур бесконечно процесс простого ознакомления с их списком тоже бесконечен Поэтому реализация и использование потенциальных языков невозможны для выполнения реальных заданий

Однако уровень программы играет двойственную роль в определении легкости или трудности ее понимания Специалист которому известны все используемые термины сможет уловить идею тем быстрее чем выше уровень ее представления С другой стороны чтобы сообщить подобную идею лицу менее сведущему в данной конкретной области требуется больший объем сведений и меньший уровень

2. Вывод уравнения уровня программы

Нередко требуется определить уровень программы непосредственно из ее реализации не зная ее потенциального объема V* и не ссылаясь на возможное обращение к ней в виде вызова процедуры Это можно сделать рассмотрев отдельно влияние операторов и операндов на уровень программы Разумно предположить что чем больше число уникальных операторов используемых в реализации тем ниже ее уровень Но наименьшее возможное число уникальных операторов равно двум и эти два оператора суть символ функции и оператор присваивания или группировки те 1*= 2 С другой стороны увеличение числа уникальных операторов беспредельно поскольку на него нет ограничений ни в каком языке в котором разрешено определение новых вложенных процедур подпрограмм или переходов к помеченным участкам Отсюда получаем следующее соотношение операторов

L  (33)

Операнды же не дают однозначного минимума по всем возможным алгоритмам поэтому к ним требуется иной подход В этом случае достаточно заметить что всякое повторение имени операнда является указанием на более низкий уровень реализации Этот эффект можно измерить взяв отношение числа простых операндов к общему числу операндов

L  (34)

Объединяя уравнения (33) и (34), заметим что коэффициент пропорциональности являющийся константой должен равняться единице, поскольку в случае потенциального языка 1=1* 2=N2 и L=1. Тогда приходим к уравнению уровня программы

(35)

в котором символ ^ указывает на то что уровень определяемый этим выражением служит аппроксимацией уравнения (31) На самом деле его можно было бы взять в качестве альтернативного определения уровня программы

Возвращаясь к примерам программ для алгоритма Евклида, определим их уровень и его оценку для представлений на Паскале и СИ.

Паскаль: L = V* / V =11.6 / 254.4 = 0.0456; = 2*2 /(1* N2) = 2*6/(12*21) =0.0476

СИ: L = V* / V =11.6 / 224.8 = 0.0516; = 2*2 /(1* N2) = 2*6/(11*18) =0.0606 .