lekcii2 (522346), страница 8
Текст из файла (страница 8)
Интерпретация этих внутримашинных изображений р осуществляется неявно через алгоритмы выполнения операций и вычисления отношений, связанных с соответствующим типом данных. Например, операция +, являющаяся атрибутом целого типа, по двум заданным изображениям операндов получает слово, являющееся изображением целого числа, представляющего их сумму.
Если же изобра,жения обьектов подлежат ручной обработке человеком, опи могут быть записаны на бумаге и в таком осязаемом органами чувств виде непосредственно обработаны им. Множество изображений, <:оставляющих тип данных, может быть задано несколькими способами. 1. Непосредсгпоеннь<л«1<еуечисленг«м изобрао<еспи<<. Когда их немного, удобно задать список слов, как, например, в Паскале и в Си для типа «Светофор»: Суре Тгайс1 1д1ТСв -- (ге<1, У<'ПО%', ~~ГЕСП); епшп Тгайс11фСэ Сгес1, уе11о«, аге<еп); Персчислимые типы в конечном счете сводятся к начальному отрезку натурального ряда и„следовательно, имен<т эффсктивнун> машинную реализацикь Поэтому в языках системного программирования нет псрсчислимого типа: без лишних условностей В этОм ка~<ествс используется цс:1ый или ад1»есный типы. Пср<"1ислимый тип не мО- жет быть первичным, поскольку он «паразитирует» на целом типе; непосредственная аппаратная реализация перечислимого типа физически непроста и нецелесообразна в связи с эффективной компиляцией на любую аппаратную платформу матпины фон Неймана.
2. заданием харит<еристическо<< <11ункиг<и 1(и<) <предиката), определенной на некотором множестве изображ<*,ний 1. С И', которая принимает значение Исти»<а, если изображение относится к данному типу. Нередко такие функции позволяют весьма эффективно устанавливать прина,члсжность конкретного изображения множеству допустимых слов Ь. Например, легко проверить принадлежность значения отрезку (диапазону). Этот тип также не может быть первичным т. к. он базируется на некотором надмножестве И', которое должно иметь аппаратную или приравненную к ней низкоуровневую программную или микропрограммную поддержку. 3.
С помощью системы аксиом, определяющих изооражения через их свойства. Этот математически красивый спосоо позволяет легко задать потенциально бесконечное множество значений. Однако он неконструктивен, не позволяет в явном виде порождать значения типа или работать с ними. Создание аппаратуры или программного обеспечения. конструктивно реализующих удовлетворяющие аксиоматике атрибуты такого типа, дает возможность создания первичного тгша,не основанного ни на каком другом.
Тьюринговская модель вычислений в качестве такого элементарного базового аппаратно поддерживаемого типа использует набор литер рабочего алфавита, над которым создаются надстройки, позволяющие работать со словами, числами и т, д. 136 Задание типа данных первыми двумя способами предполагает, что уже имеется множество изображений, из которых выделяется этот тип. Следовательно, в языке программирования обязательно должен быть хотя бы один тип, задаваемый способом 3.
Отсутствие аппаратной реализации базового типа г<репятствует автоматическому выполнению программ, использующих как этот тип, так и все надстройки над ним. Тип, который задается аксиоматически и имеет физическую реализацию, называется базовь<л«11<ива,»<. Атрибуты базовых типов машины фон Неймана, реализуются управляющим устройством этой машины и процессорами типов данных. Итак, в языке программирования должен быть определен по крайней мере один базовый тип.
Даже при наличии только одного типа данных можно описывать любыс алгоритмы. Однако на, языке, в котором имеется только один тип данных, удобно описывать алгоритмы, связанные только с этим типом данных. Что касается остальных алгоритъ<ов, ф1пс1п<1е<солпр1ех> ~О С вЂ”:-'! Суре солпр1ех — гесог<1 В.е, 1<п: геа1 епд; эС<1 х сошр1ех с1, с2, сЗ, с4; сЗ -- с1, с2; с4 -- СЗ: ъаг с1, с2, сЗ, с4: сошр1ех: 1' Поко.лллюнентное сложение с ирисеаиеаниелл 2' с3.1Се: -= с!.Ве — с2.Ке; сЗ. 1<п: — с1.1пл — ' с2.1гп; 137 то при их описании на рассматриваемом языке мы фактически находимся в условиях, близких к МТ. Например, в первой <печествеллной ЭВМ БЭСМ был реализован двоичный процессор целого типа.
Поэтому при <.оставлении программ, реализующих вычисления с вещественными числаъли на языке этой машины., возникали дополнительные и весьма, серьезныс трудности, связанные с необходимостью реализовывать процессор вещественного типа программным путем. Такис же проблемы возникали при реализации первых бортовых ЭВМ. В языке программировашля удобно иметь н<х:колько базовых типов данных. Несмотря на избыточность такого решения с точки зрения абсолютной вычислимости, практическая <эф<рективная) вычислимость, как правило, осуществляется с помощью нескольких типов данных. Основными базовыми типами языков программирования являются логический (В001 ЕАЯ), целый (1ХТЕСЕВ.), вещественный 1ВЕАБ) и литерный (СНАК).
Они позволяют описать алгоритмы решения широкого класса задач автоматической обработки данных, поскольку имеют либо пряълую аппаратную поддержку, либо эффективно компилируются. Полный набор типов данных, при наличии которых в языке программирования существенно упрощается процесс написания программ, а сами программы становятся компактными, наглядными, понятными, а потому более надежными, зависит от поставленной задачи. Например, при разработке программы решения задачи, связанной с электрическими цепями, нужны коълплекспые числа. Конечно, можно написать программу на языке, где нет такого типа даш|ых, и использовать вместо каждого комплексного числа массив из двух вещественных чисел, первое из которых представляет действительную часть, а второе мнимую, и заменить все операции над комплексными числами операциями над их действительными и мнимыми частями.
Однако при этом пропадут все преимущества использования комплексных "лисел и прог1эаммы сугцественно усложнятся. П1)и наличии коз<плексного типа достаточно указать., какие переменные и константы (по именам) этого типа используются в программе, и знать, какие оперъщии определены над данными этого типа.
Нагллядность использования комплексных чисел сохранится. Рассмотрим примеры реализации комплексных чисел па, Паскале, Си и С--4 . ,~1у пней 1леализаллией на Паскал< и Си следу<.т с литать запи«.ы Опе1лшпли надо выполнять вручную, покомпонентно. В стандартной библиот<ке языка Сэ 4 есть тип сотр!ех, реализуклций,помимо представления чисел, .также операции и отнопления в стандартной (инфи«спой) записи., приближенной к математической нот:ции. В последнем стандарте языка Си 1БО,<1ЕС 9899:1999 ЦС99~) можно писать сотр!ех г — 5 + Зе1; т Обычное нрисеаиеанне тт с4: сЗ; В некоторых языках программирования [Фортран, Бейсик) нет записей и структур.
Поэтому комплексные числа приходится размещать в двухэлементных массивах. Неудобство также за,ключается в том, что в болыпинстве таких языков присваивание массивов покомпонентно. Здесь Паскаль приятное исклктчение. Суре соптр1ех - — аггау[1..2] оГ геа1; т аг с1, с2, сЗ, с4: сошр1ех; Предыдущая запись плоха тем, что компоненты комплексного числа не поименованы, а пронумерованы. Если в пашем распоряжении имеется перечислимый тип, программа может иметь более ясный вид: Суре рагС вЂ” [Ке, 1ттт]; Суре сошр1ех — аггау(ратС] оГ геа1; епшп ратС СКе — О, 1ш - 11; Сурет1еГ НоаС сошр1ех [2]; ътаг с1, с2, сЗ, с4: соп1р1сх: сотт~р1ех с1, с2, .сЗ, с4; Наконец, можно реализовать комплексное число парой вещественных скалярных переменных,.
представлякпцих вещественнукт и мнимую части. Но из-за ужздельного хранения компонент комплексного числа все операции, отношения, вклкятая присваивание, также придется выполнять вручную, что совсем далеко от математической формы записи. айаг Ке1, Ке2, КеЗ, Ке4: геа1; 1тп1, 1ш2, 1тпЗ, 1ш4: геа1; ЯоаС Ке1, Ке2, КеЗ, Ке4; ЯоаС 1ш1, 1ш2, 1шЗ, 1пт4; Другой пример.
Пусть имеется два массива из вещественных чисел: массив А и массив 138 сЗ[1] -- с1[1] + с2(1]; сЗ[2] =- с1[2] + с2[2]; с4:== сЗ; сЗ (Ке): — с1 [Ке] 8 с2(Ке]: сЗ [1ттт(:-- с1[1тп] 8 с2[1пт]; с4:= сЗ; КеЗ г-- Ке1 —, Ке2; 1тпЗ: 1тп1 + 1ш2: Ке4:== КеЗ; 1пт4: -- 1шЗ; Сурет1еК ЯоаС сотпр1ех [2]; сошр1ех с1, с2, сЗ, с4; сЗ [О] -- с1[0] + с2[0]; сЗ (1] — с1(1( + с2 (1]: с4[0] == сЗ(0]; с4[1] = сЗ[1]; сЗ[Ке( — с![Кс( 1 с2[Ке):, сЗ[1тт1( с1[1пт( 1 с2(!ш]; с4 [Ке) сЗ(Ке); с4(1ш] - сЗ[1пт); КеЗ -- К,е1 + Ке2; 1шЗ 1тп1 + 1тп2; Ке4 == КеЗ; 1тп4 - 1птЗ; 1п~ >., А~100~, В~100); Ког(1 0; 1 < 100; >-1+) Ар) — В[~ ~; л"аг Л, В: аггау~1..100! оГ 1пСепег; А: В; Наличие же в языке Паскаль типа массив дает возможность записать в таком случае один оператор присваивания А: — В.
И это не просто короткая запись. Когда имеется процессор типа массив (пусть и с ограниченным набором операций и отношений (только присваивание и только равенство)), он естественным образом будет проверять выход за границы массива, так как гйюцессор «знает», из скольких элементов состоит каждый массив и не допустит, чтобы один массив непредусмотренным образом наложился на другой. Итак, наличие в языке нужного типа данных упрощает программы и исключает ошибки программирования. Предусмотреть в множестве базовых типов универсального языка программирования все те типы даэп>ь>х, которые могут быть полезными при решении задач из разных предметных областей, невозможно. Поэтому в языке необходимо предусмотреть возможность введения новых типов и дать средства их конструирования на основе базовых типов данных.
Испо»ьзуя эту возможность, программист может существенно улучшить и упростить свои програмлльь Мы уже касались простейших способов введения новых типов, та,ких как перечислимыс типы и типы диапазонов (отрезков). Во многих задачах целые числа используется не в качестве арифметических операндов, а, для нумерации элементов конечных множеств. Нумерация элементов дает удобство их упорядочивания и обработки, но затрудняет смысловую идентификапик> нумерованных значений.
В таких случаях в программе удобно иметь возможность привести список всех возлгожных значений. Наприл>ср, нумерация состояний мап>ины Тьк>ринга удобна, для представления выполнимой Хьюринговской програллмы, но затрудняет составление алгоритма (см. пример первой "Гьюринговской программы): используя ълнемоничные имена состояний мы легко и безошибочно составили таблицу переходов. Итак, в основе перечислимого типа лежит идея явного задания слов изображений значений, как правило, перенумерованных в порядке написания, и несущих некоторую семантическую нагрузку. При определении этого типа данных следует привести изображения всех констант, обозначающих все возможные значения этого типа, а также указать множества операций и отношений, применимых к данным этого типа.