- •1.1. Надежность
- •Конец примера
- •1.2. Удобочитаемость
- •1.3.Гибкость
- •1.4. Простота
- •1.5. Мобильность
- •1.6. Эффективность
- •2. Механизмы типизации
- •2.3. Типы данных, определенные пользователем
- •2.3.1. Производные типы
- •2.3.1.1. Эквивалентность типов
- •2.3.1.2. Наследование атрибутов
- •2.3.1.3. Ограничения
- •2.3.2. Подтипы
1.3.Гибкость
Гибкость проявляется в том, что язык должен предоставлять программисту достаточно различных возможностей для выражения всех операций,
ЯП 2-4
которые требуются в программе, не заставляя его прибегать к вставкам ассемблерного кода или различным ухищрениям
Требование гибкости конфликтует с требованием надежности.
Как правило, при разработке языка обеспечивается достаточная гибкость, соответствующая выбранной области применения, и не больше.
1.4. Простота
Простота уменьшает затраты на обучение программистов и уменьшает вероятность совершения ошибок, возникающих в результате неправильной интерпретации программистом языковых конструкций.
Для достижения простоты не обязательно избегать сложных языковых механизмов, а следует стараться не накладывать случайные ограничения на их использование.
Например, при реализации механизма массивов следует дать возможность программисту объявлять массивы любого типа данных, допускаемого языком. Если же, наоборот, в языке запретить использовать массивы некоторого типа, то в результате язык окажется скорее более сложным, чем простым, так как основные правила изучения языка изучить и запомнить проще, чем запомнить связанные с ними списки условий и ограничений на их применение.
1.5. Мобильность
Язык, независимый от базового машинного оборудования , дает возможность переносить программное обеспечение с одной платформы на другую с относительной легкостью. Это позволяет высокую стоимость программного обеспечения распределить на ряд платформ.
На практике мобильность достичь довольно трудно, особенно в системах реального времени, где одна из задач состоит в извлечении максимальных
ЯП 2-5
выгод из базового машинного оборудования. Особенно трудно поддаются решению проблемы, связанные с различающимися длинами слов памяти.
1.6. Эффективность
Критерий эффективности играет большую роль для систем реального времени. Системы реального времени должны обеспечивать высокую пропускную способность, чтобы не нарушать ограничений, накладываемых управляемым производственным или технологическим процессом или внешним оборудованием. Поскольку необходимо гарантировать определенное время реакции системы, следует избегать языковых конструкций, ведущих к непредсказуемым издержкам времени выполнения программ (например, сборки мусора в схеме динамического распределения памяти).
Для обычных приложений все снижающаяся стоимость машинного оборудования и все возрастающая стоимость программного обеспечения позволяет считать, что необходимость эффективности не является критичной.
2. Механизмы типизации
Ключевым фактором при обеспечении надежности языка программирования является механизм типизации, реализованный в языке программирования.
Различают языки программирования:
со слабой типизацией;
с сильной типизацией.
2.1. Слабая типизация
В языках программирования со слабой типизацией информация о типе данных используется только для обеспечения корректности на машинном уровне.
Недостатки слабой типизации:
ЯП 2-6
Операция, которая может восприниматься машиной как корректная, может быть некорректной на абстрактном уровне программы.
Пример
Пусть имеется фрагмент программы на языке С:
char c;
с=4;
Конец примера
Данный оператор присваивания корректен, так как на машинном уровне символы представлены целыми числами от 0 до 255.
Если программист на абстрактном уровне программы допустил ошибку, собираясь написать
c = '4';
то при слабой типизации такого рода ошибки не отслеживаются.
2) При работе с разными типами слабо типизированный язык предусматривает выполнение операций преобразования типа.
Пример
Рассмотрим фрагмент программы на языке С:
int i;
float x;
i = x;
Конец примера
Фрагмент является корректным, но требует преобразования вещественной переменной x из ее внутреннего представления с плавающей запятой в целое представление. Если при этом значение x выходит за пределы реализуемой области целых чисел, то на этапе выполнения программы будет иметь место ошибка.
Если переменные i и k - целого типа, а x - вещественное, то для выяснения, в какой последовательности будут выполняться операции преобразования типа для оператора
k = x - i;
ЯП 2-7
необходимо знать, какой порядок преобразования типов определен в компиляторе.
Возможные варианты:
x преобразуется к целому типу;
i преобразуется к вещественному типу, а затем x-i - к целому.
3) Слабая типизация позволяет определить для некоторых типов некорректные операции.
Пример
Язык С позволяет использовать для целых операндов логические операции. Например, если длина слова равна 16 битам, оператор
i = (k<< 12) || 1
упаковывает значение k в четырех левых разрядах i и засылает 1 в крайний правый разряд.
Конец примера
Вывод
Увеличение гибкости, обеспечиваемое слабой типизацией, приводит к уменьшению ясности программы и необходимости дополнительного контроля во время выполнения программы.
2.2. Сильная типизация
В сильно типизированном языке:
каждый объект обладает уникальным типом
каждый тип определяет множество значений и множество операций;
в каждой операции присваивания тип присваиваемого значения и тип объекта, которому присваивается значение, должны быть эквивалентны.
каждая примененная к объекту операция должна принадлежать множеству операций, определяемому типом объекта;
преобразования типа должно задаваться явно, например, i = (int)x;
ЯП 2-8