Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Топ:
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Интересное:
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Дисциплины:
2021-01-31 | 76 |
5.00
из
|
Заказать работу |
|
|
Исходной состояние | Результат |
s e (NOP. c) d m | s e c d m |
s e (RETURN. c) d m | s e c d m |
(f v. s) e (PUT i. c) d m | s e c d (m | m[f,i] = v) |
(f. s) e (GET i. c) d m | (m[f,i]. s) e c d m |
((a1 a2... aK) f.s) e (INVOKE sig. c) d m | s ((a1 a2... aK). e) (f[sig]. c) d m |
(Obj. s) e (CHECK type. c) d m | (t. s) e c d m |
Главный путь к снижению трудоемкости программирования связан с упро- щением процесса отладки, который зависит от искусства декомпозиции поста- новок задач и программ их решения на такие комплекты компонентов, часть ко- торых можно найти в библиотеках готовых модулей, а часть можно при про- граммировании довести до уровня многократно используемых компонентов.
|
Более реальна перспектива снижения трудоемкости и повышения надеж- ности практического программирования повышением кратности использова- ния библиотечных модулей в рамках многоязыкового программирования на базе систем программирования, создаваемых из общего, а потому более от- лаженного конструктива.
7.3. Особенности С++
|
|
– компилируемая программа на С++ представляет собой иерархию обла- стей видимости определений элементов классов, доступ к которым регламен- тирован;
– компиляция методов, конструкторов, функций и перегруженных опера- ций управляется форматом списка фактических параметров, что привело к более жестким правилам объявления типов данных и ограничивает свободу конкретизации списка параметров при вызове функций;
– возникают рекомендательные средства повышать эффективность коди- рования вызовов функций указанием на inline-включение;
–
|
Программа | Пояснение |
//HELLO.CPP | Комментарий с именем файла программы |
#include <iostream.h> | Препроцессор с вызовом библиотеки |
void main () | Головная функция |
{ cont << ”\nHello, World!\n”; | Вывод приветствия на стандартное устройство |
} |
Пример 54. Программа на языке С++
Практический выигрыш от ООП можно сразу показать на технике при- менения средств вывода данных.
Фрагмент | Пояснение |
printf (“x = %d, y = % s”, x, y); | Вывод целого и строки. «x» должен быть целым, а «y» – строкой |
|
|
Программист должен знать, что первый параметр задает формат вывода и отследить согласование его с числом и типами выводимых данных и обо- значениями форматов для функции printf.
Фрагмент | Пояснение |
cout << “x = ” << x << “, y = ” << y; | Поток вывода управляется фактиче- ским типом данных |
Пример 56. Язык С++: Вывод по библиотеке классов iostream.h
Программисту достаточно перечислить элементы вывода в естественном порядке. Библиотека классов iostream.h содержит перегрузку операции «<<» для всех основных типов данных, что позволяет компилятору выбрать нуж- ный шаблон кода программы, и программист освобожден от необходимости представлять в программе сведения о формате выводимых данных.
Учитывая примеры описания и определения классов, можно сделать вы- вод, что внешние изменения в тексте программы на С++ в сравнении с тек- стом на Си выглядят как появление ряда новых спецификаторов, с помощью которых как бы задается разметка программы, на области видимости, свя- занные с иерархией классов и дисциплиной доступа к элементам структури- рованных объектов класса. В результате вместо анализа последовательно- стей изменения состояний памяти по всей программе достаточно проанали- зировать изменения в пределах синтаксически выделенных путей по иерархии наследования методов объектов.
|
зуют исключительно ради автоматизации осовобождения памяти.
Производный класс наследует базовый класс, он больше своего базового класса в том смысле, что в нем содержится больше данных, и определено
|
|
С помощью виртуальных функций можно иметь разные версии в разных производных классах, а выбор нужной версии при вызове – это задача транс- лятора. Тип функции указывается в базовом классе и не может быть пере- определен в производном классе. Класс, в котором есть виртуальные функ- ции, называется абстрактным. Абстрактный класс можно использовать только в качестве базового для другого класса.
Фрагмент | Пояснение |
class complex { double re, im; public: complex(double r, double i) { re=r; im=i; } friend complex operator+(complex, complex); friend complex operator*(complex, complex); }; | Объявление класса объек- тов с закрытыми полями и общедоступными конструкторами и перегрузкой операций |
Пример 57. Перегрузка арифметических операций для их использования в выражениях над комплексными числами25
Члены класса создаются в порядке их описания, а уничтожаются они в обратном порядке. Член класса может быть частным (private), защищенным (protected) или общим (public).
Фрагмент | Пояснение |
void f() { complex a = complex(1,3.1); complex b = complex(1.2,2); complex c = b; | Объявление функции, выполняющей процедуру, |
конструирования 3-х комплексных чисел и их инициирования, | |
a = b+c; |
и обработка чисел с помощью пере- груженных операций |
b = b+c*a; | |
c = a*b+complex(1,2); | |
} |
|
25 Страуструп Б. Язык программирования C++ для профессионалов [Электронный ресурс]. Режим доступа: http://www.intuit.ru/department/pl/cpp2/.
26 Там же.
Если b и c имеют тип complex, то b + c означает (по определению) opera- tor + (b, c). Сохраняются обычные приоритеты операций, поэтому второе вы- ражение выполняется как b = b + (c*a), а не как b = (b + c)*a. При перегрузке операций нельзя изменить их приоритеты, равно как и синтаксические пра- вила для выражений.
|
Для операций преобразования ТД выбран подход, при котором проверка соответствия ТД является строго восходящим процессом, когда в каждый момент рассматривается только одна операция с операндами, типы которых уже прошли проверку.
|
|
Фрагмент | Пояснение |
template<class T> | Объявление параметризованного шаблона |
class stack { T* v; T* p; int sz; | для создания классов стеков в зависимости от задаваемого типа хранимых элементов при известном объеме стека. |
public: Stack (int s) { v = p = new T[sz=s]; } ~stack () { delete[] v; } | Общедоступны: конструкторы стека и деструкторы стека, |
void push(T a) { *p++ = a; } T pop() { return *--p; } | функции работы со стеком |
int size() const { return p-v; } }; |
Пример 59. Шаблон типа для класса.
Стек, содержащий элементы произвольного типа27
Префикс template<class T> указывает, что описывается шаблон типа с па- раметром T, обозначающим тип, и что это обозначение будет использоваться
27 Страуструп Б. Язык программирования C++ для профессионалов [Электронный ресурс]. Режим доступа: http://www.intuit.ru/department/pl/cpp2/.
в последующем описании. После того, как идентификатор T указан в пре- фиксе, его можно использовать как любое другое имя типа.
|
Имя шаблонного класса, за которым следует тип, заключенный в угловые скобки <>, является именем класса (определяемым шаблоном типа), и его можно использовать как все имена класса.
Поскольку все функции-члены класса stack являются подстановками, то и в этом примере транслятор создает вызовы функций только для размещения в свободной памяти и освобождения.
Функции в шаблоне типа могут и не быть подстановками.
В программе может быть только одно определение функции-члена класса и только одно определение шаблона типа для функции-члена шаблонного класса. Если требуется определение функции-члена шаблонного класса для конкретного типа, то задача системы программирования найти шаблон типа для этой функции-члена и создать нужную версию функции. В общем случае система программирования может рассчитывать на указания от програм- миста, которые помогут найти нужный шаблон типа. Возможна передача операций как параметров функций.
|
|
При организации наследования в отличие от обобщенных функций рабо- тает модель обмена сообщениями:
– объекты обладают свойствами;
– посылают сообщения;
– наследуют свойства и методы от предков.
При переходе от обычного стандартного программирования с ООП свя- зывают радикальное изменение способа организации программ. Это измене- ние произошло под давлением роста мощности оборудования. ООП взламы- вает традиционное программирование по многим направлениям. Вместо со- здания отдельной программы, оперирующей массой данных, приходится
|
Функциональные модели ООП
Чтобы сравнить дистанцию ООП с ФП П. Грем (Paul Graham) в описании стандарта языка Common Lisp предлагает рассмотреть модель встроенного в Lisp объектно-ориентированного языка (ОО-язык), обеспечивающего ос- новы ООП [23]. Встраивание ОО-языка показывает силу ФП при его харак- терном применении – моделировании разных стилей программирования (начиная со стандартного программирования в виде prog-формы, предложен- ной Дж. Маккарти). В языке Lisp, точнее в СП для поддержки языка Lisp, есть разные способы размещать коллекции свойств. Один из них – представлять объекты как хэш-таблицы и размещать свойства как входы в нее. П. Грем приводит пример (8 строк) реализации ООП на базе хэш-таблиц. Фактически наследование обеспечивает единственное средство реализации языка Lisp: все это работает благодаря реализации рекурсивной версии GETHASH, рас- ширяющей ядро языка. Впрочем, Lisp по своей природе изначально был ОО-языком. Определение методов может достичь предельной гибкости бла- годаря возможности генерировать определения функциональных объектов с помощью DEFMACRO или функцией категории FSUBR.
|
Более прозрачная модель ООП на базе обычных списков, иллюстрирую- щая глубинное родство ФП и ООП, реализована в системе CLOS. Показан- ный ниже пример 60 работает по первому аргументу (выбор подходящего ме- тода рассчитан на то, что достаточно разобраться с одним аргументом), CLOS делает это на всех аргументах, причем с рядом вспомогательных средств, обеспечивающих гибкий перебор методов и анализ классов объектов. Рас- смотрим примеры использования классов и экземпляров объектов:
(defclass ob () (f1 f2 …)); объявление класса
|
(SETF с (make-instance 'ob)); создание экземпляра объекта
Чтобы задать значение поля, используем специальную функцию slot- value, записывающую значение объекта:
(SETF (slot-value c) 1223)
До этого значения полей объекта были не определены.
Простейшее определение слота – это его имя. Но в общем случае слот может содержать список свойств. Внешне свойства слота специфицируются как ключевые параметры функции. Это позволяет задавать начальные значе- ния. Можно объявить слот совместно используемым:
:allocation:class
Изменение такого слота будет доступно всем экземплярам объектов класса. Можно задать тип элементов, заполняющих слот, и сопроводить их строками, выполняющими роль документации. Нет необходимости все новые слоты создавать в каждом классе, поскольку можно наследовать их из суперклассов.
Рассмотрим технику ООП на примере организации Lisp-вычислений – популярный пробный камень демонстрации возможностей новых ЯП.
Определение | Пояснение |
(defclass expr () ((type:accessor td) (sd:accessor ft)) (:documentation "C-expression")) | Суперкласс для всех структур Lisp-выражений. Заданы ключи доступа к общим полям объектов: тип и операнд |
(defclass un (expr) ((type:accessor td) (sd:accessor ft)) (:documentation "quote car *other *adr")) | Класс для унарных форм. Доступ можно унаследо- вать от суперкласса, а здесь не дублировать |
(defclass bin (expr) ((type:accessor td) (sd:accessor ft) (sdd:accessor sd)) (:documentation "cons + lambda let")) | Класс бинарных форм. Третье поле для второго операнда |
|
|
Определение | Пояснение |
(defclass trio (expr) ((type:accessor td) (sd:accessor ft) (sdd:accessor sd) (sddd:accessor td)) (:documentation "if label")) | Если взять суперкласс (bin), то можно не объяв- лять первые 3 поля. Четвертое поля для треть- его операнда |
(defmethod texrp ((x expr) (nt atom)) (SETF (slot-value x 'type) nt) (SETF (td x) nt);;--;; variant (:documentation "объявляем тип выражения")) | Метод представления вы- ражений для компиляции |
(defmethod spread ((hd (eql 'QUOTE)) (tl expr)) (let ((x (make-instance 'un))) (SETF (ft x) (car tl)) (SETF (td x) hd) ) (:documentation "распаковка выражения")) | Метод разбора констант и выражений с унарными операциями |
(defmethod compl ((hd (eql 'QUOTE)) (tl expr)) (list 'LDC tl) (:documentation "сборка кода")) | Метод компиляции констант |
(defmethod compl ((hd (eql 'CAR)) (tl expr) N) (append (compl(ft tl) N) '(CAR)) (:documentation "сборка кода")) | Метод компиляции выражений с унарными операциями |
(defmethod spread ((hd (eql 'CONS)) (tl expr)) (let ((x (make-instance 'bin))) (SETF (ft x) (CAR tl)) (SETF (sd x) (cadr tl)) (SETF (td x) hd) ) (:documentation "распаковка выражения")) | Метод разбора выраже- ний с бинарными опера- циями |
(defmethod compl ((hd (eql 'CONS)) (tl bin) N ) (append (compl(sd tl) N) (compl(ft tl) N) '(CONS)) (:documentation "сборка кода")) | Метод компиляции выра- жений с бинарными опе- рациями с прямым поряд- ком компиляции операн- дов |
(defmethod compl ((hd (eql '+)) (tl bin) N) (append (compl(ft tl) N) (compl(sd tl) N) '(ADD)) (:documentation "сборка кода")) | Метод компиляции выра- жений с бинарными опе- рациями с обратным по- рядком компиляции опе- рандов |
|
|
Определение | Пояснение |
(defmethod spread ((hd (eql 'IF)) (tl expr)) (let ((x (make-instance 'trio))) (SETF (ft x) (CAR tl)) (SETF (sd x) (cadr tl)) (SETF (td x) (caddr tl)) (SETF (td x) hd) ) (:documentation "распаковка выражения")) | Метод разбора выраже- ний с триадными опера- циями |
(defmethod compl ((hd (eql 'IF)) (tl expr) N) (let ((then (list (compl(sd tl)N) '(JOIN))) (else (list (compl(td tl)N) '(JOIN)))) (append (compl(ft tl)N) (list 'SEL then else) ) )(:documentation "сборка кода")) | Метод компиляции выра- жений с триадными опе- рациями |
(defmethod parh ((x expt)) (let (ftx (ft x)) (COND ((ATOM ftx) (spread 'ADR ftx)) ((member (CAR ftx) '(QUOTE CAR CONS + IF LAMBDA LABEL LET)) (spread (CAR ftx) (CDR ftx)) (T (spread 'OTHER ftx))) )(:documentation "шаг разбора")) | Метод разбора произволь- ных выражений |
Пример 60 (окончание). ОО-определение Lisp-компилятора
|
Более интересный вопрос, что же еще может дать функциональный стиль и традиция реализации функциональных систем программирования?
Похоже, что это средства освоения новых архитектур и технологий и во- обще исследование новых задач применения ИТ в любой области знаний.
|
Другая модель ООП, полученная на базе обычных списков свойств (атри- бутов), также иллюстрирует глубинное родство ФП и ООП [10]. Нужно лишь уточнить определение Lisp-интерпретатора, чтобы методы рассматривались как особая категория функций, обрабатываемая специальным образом.
Спецификация
Таблица 36
|
Параметр | Конкретика |
Эксплуатаци- онная праг- матика ЯП | Практичное программирование, нацеленное на разумный компро- мисс в пространстве противоречивых критериев с приоритетом критериям сферы приложения программ |
Регистры аб- страктной машины | S E C D M S – стек промежуточных результатов. E – стек локальных переменных. C – текущая программа. D – дамп для восстановления контекста при рекурсии. M – общая память хранимых объектов. Результат рассредоточен по именованным состояниям памяти |
Категории команд абстрактной машины | Загрузка в стек. Сохранение значений. Манипулирование стеком. Арифметические и логические операции. Передачи управления. Выбор определения метода, функции, операции. Вызов метода. Возврат из метода. Обработка исключений. Работа под монитором (параллелизм) |
Реализаци- онная праг- мати | Сочетание статического представления методов с динамикой раз- мещения объектов, включая автоматизацию повторного использо- вания памяти. Представление сигнатуры для динамического выбора конкретного метода обработки объект |
Парадиг- мальная специфика | Процесс программирования сводится к последовательности расши- ряемых по мере целесообразности программ. Использование предметной типизации классов объектов как веду- щего параметра выбора конкретной техники обработки данных |
ЯЗЫКИ СВЕРХВЫСОКОГО УРОВНЯ
|
– высокий уровень абстрагирования программируемых решений;
– решаются задачи, зависящие от непредсказуемых внешних факторов;
– базовые средства и/или алгоритмы вычислений используют паралле- лизм;
– актуальны прагматические требования к темпу и производительности вычислений;
– эксплуатируются динамически реконфигурируемые многопроцессор- ные комплексы.
Обычно создатели нового ЯСВУ используют в качестве исходного мате- риала один или несколько базовых ЯВУ и встраивают в них изобретаемые средства и методы. От базовых ЯВУ наследуются парадигмы удовлетвори- тельного решения сопутствующих задач. В таких случаях парадигмальная ха- рактеристика ЯСВУ может формулироваться относительно базовых ЯВУ, хотя внешнее синтаксическое сходство языковых конструкций скрывает со- всем другую семантику.
|
Наиболее очевидно, что можно как бы «просачивать» определения функ- ций над простыми данными, распределять их по структурам данных и тем самым распространять простые функции на сложные данные подобно мат- ричной арифметике. Похожие построения предложены в языке APL, ориен- тированном на обработку матриц, и Бэкусом в его программной статье о функциональном стиле программирования, проиллюстрированном на языке FP.
|
|
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!