[Оглавление] | [<< страница] | [>>страница] |
В математике принято классифицировать переменные в соответствии с некоторыми важными характеристиками. Мы различаем вещественные, комплексные и логические переменные, переменные, представляющие собой отдельные значения, множества значений или множества множеств; функции мы отличаем от функционалов или множеств функций и т. д. В обработке данных понятие классификации играет такую же, если не большую роль. Мы будем придерживаться того принципа, что любая константа, переменная, выражение или функция относится к некотором типу. Фактически тип характеризует множество значений, к которым относится константа, которые может принимать некоторая переменная или выражение и которые может формировать функция.
В математическом тексте тип переменной обычно определяется по шрифту, для этого нет нужды обращаться к контексту. Такой способ в программировании не подходит, поскольку, обычно на машинах имеется оборудование лишь с одним шрифтом (например, латинскими буквами). Поэтому широко используете правило, по которому тип явно указывается в описании константы, переменной или любой функции. Это правило особенно важно потому, что транслятор должен выбирать представление данного объекта в памяти машины. Ясно, что память, отводимая под значение переменной, должна выбираться в соответствии с диапазоном значений, которые может принимать переменная. Если у транслятора есть такая информация, то можно обойтись без тaк называемого динамического распределения памяти. Часто это очень важно для эффективной реализации алгоритма. Основные принципы концепции типа, которым мы будем следовать на протяжении всего текста и которые включены в язык программирования:
В результате транслятор может использовать информацию о типах для проверки допустимости различных конструкций в программе. Например, неверное присваивание логического значения арифметической переменной можно выявить без выполнения программы. Такая избыточность текста программы крайне полезна и помогает при создании программ; она считается основным преимуществом хороших языков высокого уровня по сравнению с языком машины или ассемблера. Конечно, в конце концов данные будут представлены в виде огромного количества двоичных цифр независимо от того, была ли программа написана на языке высокого уровня с использованием концепции типа или на языке ассемблера, где всякие типы отсутствуют. Для вычислительной машины память — это однородная масса разрядов, не имеющая какой-либо структуры. И только абстрактная структура позволяет программисту разобраться в этом однообразном пейзаже памяти машины.
В большинстве случаев новые типы данных определяются с помощью ранее определенных типов данных. Значения такого нового типа обычно представляют собой совокупности значений компонент, относящихся к определенным ранее составляющим типам, такие значения называются составными. Если имеется только один составляющий тип, т. е. все компоненты относятся к одному типу, то он называется базовым. Число различных значений, входящих в тип Т, называется мощностью Т. Мощность задает размер памяти, необходимой для размещения переменной х типа Т. Принадлежность к типу обозначается х: Т.
Поскольку составляющие типы также могут быть составными, то можно построить целую иерархию структур, но конечные компоненты любой структуры, разумеется, должны быть атомарными. Следовательно, система понятий должна допускать введение и простых, элементарных типов. Самый прямолинейный метод описания простого типа — перечисление всех значений, относящихся к этому типу. Например, в программе, имеющей дело с плоскими геометрическими фигурами, можно описать простой тип с именем фигура, значения которого обозначаются идентификаторами: прямоугольник, квадрат, эллипс, круг. Но кроме типов, задаваемых программистом, нужно иметь некоторые стандартные, предопределенные типы. Сюда обычно входят числа и логические значения. Если для значений некоторого типа существует отношение порядка, то такой тип называется упорядоченным или скалярным.
С помощью этих правил можно определять простые типы и строить из них составные типы любой степени сложности. Однако на практике недостаточно иметь только один универсальный метод объединения составляющих типов в составной. С учетом практических нужд представления и использования универсальный язык должен располагать несколькими методами объединения. Они могут быть эквивалентными в математическом смысле и различаться операциями для выбора компонент построенных значений. Основные рассматриваемые здесь методы позволяют строить следующие объекты: массивы, записи, множества и последовательности. Более сложные объединения обычно не описываются как "статиче-ские типы", а "динамически" создаются во время выполнения программы, причем их размер и вид могут изменяться. Переменные и типы данных вводятся в про-грамму для того чтобы их использовать в каких-либо вычислениях. Следователь-но, нужно иметь еще и множество некоторых операций. Для каждого из стандарт-ных типов в языках программирования предусмотрено некоторое множество при-митивных, стандартных операций, а для различных методов объединения — опе-рации селектирования компонент и соответствующая нотация. Сутью искусства программирования обычно считается умение составлять операций. Однако мы увидим, что не менее важно умение составлять данные.
Важнейшие основные операции — сравнение и присваивание, т. е. проверка отношения равенства (и порядка в случае упорядоченных типов) и действие по "установке равенства". Принципиальное различие этих двух операций выражается и четким различием их обозначений в тексте.
Проверка равенства: х == у (выражение, дающее значение TRUE или FALSE). Присваивание: х=у (оператор, делающий х равным у). Эти основные действия определены для большинства типов данных, но следует заметить, что для данных, имеющих большой объем и сложную структуру, выполнение этих операций может сопровождаться довольно сложными вычислениями.
Для стандартных простых типов данных мы кроме присваивания и сравнения предусматриваем некоторое множество операций, создающих (вычисляющих) новые значения. Так, для числовых типов вводятся стандартные арифметические операции, а для логических значений — элементарные операции логики высказываний.
[Оглавление] | [<<страница] | [>>страница] | [В начало ] |