- •Часть I. Традиционные Языки Программирования
- •Глава 1. Управляющие структуры. Процедурные абстракции.
- •Базисные свойства языков программирования
- •Процедурные абстракции
- •Передача управления
- •Передача данных
- •Глава II. Основные понятия и проблемы, связанные с типами данных
- •Глава III. Базисные типы данных
- •3.1 Простые типы данных
- •3.1.2. Другие базисные типы данных.
- •Определение новых типов данных
- •Конструкторы.
- •Конструктор умолчания.
- •Конструктор копирования.
- •Конструктор преобразования.
- •Операторы преобразования.
- •Деструкторы
- •Глава 5. Инкапсуляция. Абстрактные типы данных (атд).
- •Модула–2.
- •Оберон.
- •Инициализация статических членов в Java (отступление)
- •Глава 5. Инкапсуляция. Абстрактные типы данных (атд) (продолжение).
- •Язык Java.
- •Глава 6. Раздельная трансляция.
- •Раздельная независимая трансляция
- •Именование
- •Include-файлы
- •Раздельная зависимая трансляция
- •Глава 7. Статическая параметризация.
- •Язык Ада.
- •Глава 7. Исключительные ситуации в языках программирования.
- •1. Объявление исключений.
- •2. Определение исключения.
- •3. Возникновение.
- •4. Распространение и обработка.
- •Часть II. Объектно-ориентированные яп.
- •Глава I. Наследование в яп.
- •1. Каждый объект данных имеет ровно один тип.
- •2. Типы эквивалентны тогда и только тогда, когда их имена совпадают.
- •3. Каждый тип данных характеризуется набором данных и множеством операций.
- •4. Различные типы не совместимы по присваиванию и передаче параметров.
- •Множественное наследование.
- •Глава 2. Динамическое связывание методов.
- •Динамическое связывание методов
- •Снятие механизма виртуального вызова
- •Абстрактные методы. Абстрактные классы.
- •Динамическая идентификация типа.
- •3. Полиморфизм.
Базисные свойства языков программирования
Базисная программа на любом традиционном ЯП состоит из операторов присваивания и управляющих операторов, изменяющих нормальный ход выполнения (нормальный ход выполнения - последовательной выполнение каких-либо операций).
Конечно, кроме операции присваивания, среди основных есть еще и операции ввода-вывода. Что интересно - в первых ЯП, таких как Fortran, Алгол и др., средства ввода-вывода были встроены, а уже язык C отказался от этого принципа - он был первым языков, в котором ввод-вывод был вынесен из базиса. В середине 70х это был резкий шаг вперед в отношении вопроса: что должно быть, а что не должно быть в ЯП.
В языке С была использована процедурная абстракция. Вообще говоря, это очень мощный механизм, который позволяет выкидывать из языка большие «куски» (средства общения с ОС, ввод-вывод и другие) и реализовать их посредством процедурных и других абстракций.
В результате, становится интересным размышление на тему «А что должно вообще остаться в базисе ЯП?». Что необходимо, чтобы можно было развивать этот ЯП? Не в том плане, чтобы добавлять новые конструкции. Это было модно в 60-70х годах на изменяемых ЯП, которые позволяли изменять сами себя - не только формировать программу, но и расширять набор своих конструкций - в настоящее время это направление практически заглохло. В чем были проблемы расширяемых языков? Очевидно, что одно дело - добавление новых процедур, другое дело - добавление языковых конструкций. В последнем случае следует, как минимум изменить алгоритм синтаксического анализатора, а точнее говоря, сделать механизм синтаксического анализатора настолько изощренным, чтобы он мог воспринимать различные конструкции, в том числе и новые. Программы же, написанные на таком языке были более криптографические и сложные в понимании.
Так какой же минимум должен давать ЯП, чтобы он продолжал жить полнокровной жизнью, т.е. люди на нем писали. Если с это точки зрения посмотреть на ЯП, то минимальными (критическими) пунктами будут всего три:
процедурная абстракция;
раздельная компиляция (менее жесткое требование):
межмодульная коммуникация (по данным).
Все эти три пункта присутствуют, например, в языке Fortran. Даже в самой первой версии уже были подпрограммы. Неизвестно из каких соображений автор ввел в язык это понятие, но понятно, что при вычислении сложных математических формул очень удобно распределить вычисления по функциям.
Кроме этого, в Фортране была раздельная компиляция, т.е. каждая процедура и функция транслировалась отдельно.
Также в Фортране имелись зачаточные средства межмодульной коммуникации - а именно, понятие общего блока памяти. В этом блоке каждый модуль мог создавать свои переменные, причем, эти переменные накладывались друг на друга. В результате, можно было объявлять глобальные переменные, но возникали проблемы, если эти переменные были объявлены в модулях различными типами. Таких общих блоков могло быть несколько, они могли именоваться.
С точки зрения структуры, это, конечно, была явно недоделанная система. Но зато в Фортране впервые возникло понятие именованной области памяти, к которой могли иметь доступ разные блоки.
И, оказывается, что всего этого вполне достаточно, чтобы можно было развивать программирование на языке. Конечно, чем лучше развиты эти три параметра в каждом конкретном языке, тем больший успех язык может получить.
