- •Преимущества
- •Связь: ooa→oop→ood
- •Механизм работы virtual
- •Абстрактный класс
- •Виртуальный деструктор
- •{Основные элементы языка программирования}
- •Основные подходы к семантике:
- •Формальное описание семантики:
- •Среда программирования
- •Объекты данных
- •Атрибуты объекта данных
- •Система типизации данных
- •Реализация типов данных
- •Типизация
- •Система типизации данных
- •Реализация типов данных
- •Связывание переменных
- •Контроль типов
- •Статистический контроль типов
- •Алгоритм статистического контроля типов
- •Динамический контроль типов
- •Параллелизм
- •Полиморфизм
- •Статический полиморфизм
- •Динамический полиморфизм
- •Преобразование типов
- •Связь: ooa→oop→ood
- •Среда программирования
- •Цель технологий параллелизма
- •Схемы параллелизма
- •Проблемы параллельного программирования
- •Показатели эффективности параллельного алгоритма Ускорение
- •Закон Густавсона-Барсиса
- •Масштабируемый алгоритм
- •Схемы параллелизма
- •Подтипы данных
- •Разновидности массивов. Статические
- •Кортежи
- •Разновидности массивов. Статические
- •Динамические
- •Атрибуты объекта данных
- •Операции над целыми числами
- •Вещественные числа
- •Числа с фиксированной точкой
- •Числа с плавающей точкой(float)
- •Ошибки вычислений с вещественными числами
- •Утечки памяти и повисшие указатели
- •Указатели на указатели
- •Типизированные указатели
- •Указатели на функции
- •[Отличия указателей и ссылок]
- •Параметры подпрограмм
- •Преимущества подпрограмм
- •Позиционное сопоставление
- •Сопоставление по имени
- •Методы передачи параметров:
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по значению-результату
- •Параметр по результату
- •Стековые языки
- •Циклы и рекурсия
- •Циклы со счетчиком
- •Операторы циклы без заданного числа повторений (бесконечно)
- •Динамический полиморфизм
- •Родовые (настраиваемые) сегменты и шаблоны
1. Язык программирования. Общие принципы построения и использования языков программирования.
• ЯП - набор правил, описывающих какие последовательности символов составляют программу и какие вычисления производит.
• Программа - последовательность символов определяющих вычисления. Запись программы на ЯП называют исходным кодом.
• Язык программирования – это механизм абстрагирования, который дает возможность описывать вычисления абстрактно. Но в тоже время это описание может быть переведено в понятную форму конкретному исполнителю (процессору).
• Язы́к программи́рования — формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, задающих внешний вид программы и действия, которые выполнит исполнитель (компьютер) под её управлением.
• Одним из важных критериев является читаемость программ, которые написаны на этом языке. Напомним, что машинный код и язык Ассемблер не удовлетворяют этому критерию. Программы, которые легко понять, легче в эксплуатации. Здесь надо обратить внимание, для решения каких задач разрабатывался тот или иной язык. Если язык используется для решения задач, на которые он не был нацелен, то программы могут оказаться трудными для понимания. Очевидно, чем ближе синтаксис языка к естественным, применяемым в реальной жизни конструкциям, тем более понятным становится код программы.
• Простота – важнейший критерий языка. Язык, содержащий много конструкций, изучить сложно. Разные программисты могут пользоваться разными конструкциями, что может привести к взаимному непониманию разработанных программ.
• Ортогональность – возможность с помощью небольшого числа базовых конструкций и ограниченным числом способов выразить структуры данного языка. Ортогональность языка связана с простотой. Отсутствие ортогональности при использовании разных структур приводит к увеличению способов организации элементов программы почти при одинаковых ситуациях. Ортогональность позволяет решить трудную задачу, используя небольшой набор элементарных конструкций.
• Синтаксис языка оказывает влияние на простоту программы и ее читаемость. Для языка важными являются правила формирования имен конструкций, которые используются в языке.
• Язык программирования применятся для составления программ решающих задачи на определенном уровне абстракции. Появление и применение нового языка программирования может быть оправдано только тем, если он позволяет легче составить программу для конкретной области. Абстракция позволяет использовать сложные структуры, не вникая в детализацию формирования этих структур. Поддержка абстракции влияет на легкость использования языка.
• Уровни абстракции:
I. Уровень команд процессора – Ассемблер.
II. Уровень вычислений в предметной области – Паскаль и Си.
III. Уровень операций объектов предметной области – ООП.
IV. Операции над объектами БД- SQL
•Основной принцип: Чем выше уровень абстракции, тем больше деталей скрыто от программиста. Но в то же время снижается детализация реализации.
2. Стандарты языков программирования.
• Язык программирования может быть представлен в виде набора спецификаций, определяющих его синтаксис и семантику.
• Для многих широко распространённых языков программирования созданы международные стандарты. Специальные организации проводят регулярное обновление и публикацию спецификаций и формальных определений соответствующего языка. В рамках таких комитетов продолжается разработка и модернизация языков программирования и решаются вопросы о расширении или поддержке уже существующих и новых языковых конструкций.
Стандарты языков программирования:
1. Частный стандарт
Определяется командой разработчиков ЯП и имеет авторские права.
2. Согласительный стандарт
• Создание специальных организационных документов, основанных на соглашении всех заинтересованных участников. Является основным способом обеспечить единообразие различных форм языка. Основные организации:
• ANSI - объединение американских промышленных и деловых групп, разрабатывающее торговые и коммуникационные стандарты.
• IEEE - международная некоммерческая ассоциация специалистов в области техники, мировой лидер в области разработки стандартов по радиоэлектронике и электротехнике.
3. Лямбда-исчисление. Аппликация, абстракция, редукция, преобразование.
• Это простейший из семейства прототипных языков программирования, чистое λ-исчисление, термы которого, называемые также объектами (обами), или λ-термами, построены исключительно из переменных применением аппликации и абстракции. Изначально наличия каких-либо констант не предполагается.
• В основе лямбда-исчисление лежит понятие функции. Мы можем составлять сложные функции из простейших, а также подставлять в функции аргументы, которые могут быть как константами так и другими функциями. Как только мы составили выражение мы можем передать его вычислителю. Он подставляет аргументы в функции и возвращает такое выражение, в котором невозможно далее проводить подстановки аргументов. Этот процесс проведения подстановок считается вычислением алгоритма.
• Можно считать, что лямбда исчисление это такой маленький язык программирования. В нём есть множество символов, которые считаются переменными, они что-то обозначают и неделимы. В лямбда-исчислении программный код называется термом. Для написания программного кода у нас есть всего три правила:
1. Переменные x , y , z … являются термами.
2. Если M и N – термы, то (MN) – терм.
3. Если x – переменная, а M – терм, то (λx.M) – терм
• В формальном описании добавляют ещё одно правило, оно говорит о том, что других термов нет. Первое правило, говорит о том, что у нас есть алфавит символов, который что-то обозначает, эти символы являются базовыми строительными блоками программы.
• Второе и третье правила говорят о том как из базовых элементов получаются составные. Второе правило – это правило применения функции к аргументу. В нём M обозначает функцию, а N обозначает аргумент. Все функции являются функциями одного аргумента, но они могут принимать и возвращать функции.
• Третье правило говорит о том как создавать функции. Специальный символ лямбда ( λ ) в выражении (λx.M) говорит о том, что мы собираемся определить функцию с аргументом x и телом функции M.
В основе лямбда-исчисления лежит 2 операции:
◘ Аппликация:
Означает применение или вызов функции
по отношению к заданному значению
)
где
-
алгоритм, вычисления по заданному
входному значению
◘ Абстракция: Строит функции по заданным выражениям.
• Если
выражение
свободно содержит х, тогда
означает, что лямбда функция от аргумента
х, которая имеет вид
,
обозначает функцию х->t[x]
.
• На интуитивном уровне процесс абстракции заключается в том, что мы смотрим на несколько частных случаев и видим в них что-то общее. Это общее мы выделяем в функцию, которая параметризована частностями.
◘ Редукция:
Поскольку выражение
обозначает
функцию, ставящую в соответствие каждому
значение
,
то для вычисления выражения
,
в которое входят и аппликация
и абстракция,
необходимо выполнить подстановку
числа 3 в терм
вместо переменной
.
В результате получается
.
Это соображение в общем виде записывается
как
.
(Процесс упрощения путем подстановки аргументов в функции называется редукцией.)
◘ Преобразование: Преобразование выражает ту идею, что две функции являются идентичными тогда и только тогда, когда, будучи применёнными к любому аргументу, дают одинаковые результаты.
• При подстановке необходимо следить за тем, чтобы у нас не появлялись лишние связывания переменных. Для того чтобы исключить такие случаи пользуются переименованием переменных или преобразованием
4. Списки и функциональные выражения в функциональных языках программирования.
Функциональные языки программирования:
•Программа может интерпретироваться как функция с одним или несколькими аргументами.
•Сложные программы строятся посредством алгаритмирования функций.
•Краткость и простота с позиции математики.
•Строгая типизация.
•Чистота (отсутствие побочных эффектов).
•Отложенные (ленивые) вычисления.
•Автоматизированное динамическое распределение памяти.
•Прозрачное написание рекурсивных функций.
• Контроль типов данных может осуществляться в период выполнения программы (динамический контроль типов).
• В чисто функциональных языках отсутствуют переменные, поэтому вместо итерации здесь используют рекурсию.
•AutoCad
• Функции можно передавать в другие функции в качестве аргументов и возвращать в качестве результата, и даже в общем случае проводить вычисления, результатом которого будет функция.
Списки
Это упорядоченная последовательность структуры данных.
• Первый элемент списка называют головой.
• Остальные элементы - хвостом списка.
• Типы элементов списка явно не объявляются
• Применяют как однородные так и неоднородные списки.
• Список редко имеет фиксированную длину, обычно их длина увеличивается и уменьшается в период выполнения программы.
• Впервые списки появились в функциональном языке Lisp.
5. Механизмы и средства взаимодействия программы с операционной системой.
• Первый этап загрузки ОС. В системном блоке компьютера находится постоянное запоминающее устройство BIOS, в котором содержатся программы тестирования блоков компьютера и первого этапа загрузки ОС. Они начинают выполнятся с первым импульсом тока при включении компьютера. На этом этапе процессор обращаются к диску и проверяет наличие на определенном месте (в начале диска) очень небольшой программы - загрузчика. Если эта программа обнаружена, то она считывается в ОЗУ и ей передается управление.
• Второй этап загрузки ОС. Программа - загрузчик, в свою очередь, ищет на диске базовый модуль ОС, переписывает его в память и передает ему управление.
• Третий этап загрузки ОС. В состав базового модуля входит основной загрузчик, который ищет остальные модули ОС и считывает их в ОЗУ. После окончания загрузки ОС управление передается командному процессору и на экране появляется приглашение системы к вводу команды пользователя.
• Заметим, что в оперативной памяти во время работы компьютера обязательно должны находится базовый модуль ОС и командный процессор. Следовательно, нет необходимости загружать в оперативную память все файлы ОС одновременно. Драйверы устройств и утилиты могут подгружаться в ОЗУ по мере необходимости, что позволяет уменьшать обязательный объем оперативной памяти, отводимый под системное программное обеспечение.
6. Функциональное программирование. Основные положения. Основные отличия от других типов языков программирования.
Функциональное программирование — это стиль программирования, который опирается на вычисление выражений, а не на выполнение команд. Выражения формируются посредством комбинирования функций.
• Функции можно передавать в другие функции в качестве аргументов и возвращать в качестве результата, и даже в общем случае проводить вычисления, результатом которого будет функция.
• Вместо циклов функциональные программы широко используют рекурсивные функции
• Программа может интерпретироваться как функция с одним или несколькими аргументами.
• Сложные программы строятся посредством алгаритмирования функций.
• Краткость и простота с позиции математики.
• Строгая типизация.
• Чистота (отсутствие побочных эффектов).
• Отложенные (ленивые) вычисления. Ленивое вычисление — стратегия вычисления, которая откладывает вычисления выражения до момента, когда значение этого выражения будет необходимо.
• Автоматизированное динамическое распределение памяти.
• Прозрачное написание рекурсивных функций.
• AutoCad
Преимущества
• Отладка:
Функции в ФП не зависят от значений полей, глобальных переменных и состояний других классов, они зависят только от своих аргументов. Для того, чтобы найти ошибку, достаточно просмотреть аргументы вызова каждой функции.
• Многопоточность:
Можно легко добавить потоки к программе не задумываясь при этом о проблемах, присущих императивным языкам, так как ни один кусочек данных в функциональной программе не меняется дважды одним и тем же потоком или разными.
• Обновления систем:
В функциональной программе всё состояние хранится в стеке в виде аргументов функций. Для того, чтобы обновить систему, нужно вычислить разницу между кодом на рабочем сервере и новой версией, и установить изменения в коде. Остальное будет сделано языковыми инструментами автоматически, при этом не будет остановлена работа системы
Функциональное программирование - представляет собой набор определенных функций. Функцию определяют через другую функцию. В функциональном программировании вся программа ФУНКЦИЯ.
Программа на таком языке представляет собой совокупность описаний функций и выражения, которые необходимо вычислить. Оно вычисляется посредством редукции (т. е. серии упрощений). Функциональное программирование не использует концепцию памяти как хранилища значений переменных. Операторы присваивания отсутствуют, вследствие чего переменные обозначают не области памяти, а объекта программы, что полностью соответствует понятию переменной в математике. Наличие стройной математической основы обеспечивает возможность использования алгебраических методов создания структуры, преобразования и исследования программ. Это в какой-то мере приближает их к описанию структуры мышления человека.
Примером функционального языка является язык LISP (List Processing-обработка списков) Разработан и реализован в Массачусетском технологическом институте в 1959 г. Рассматривается специалистами как основной язык программирования систем искусственного интеллекта.
Основные положения этого стиля восприняты многими языками программирования с общей логикой уточнения решаемых задач и обобщения решений на основе выбранных специально базовых конструкций:
1 Базовые конструкции определяются как строгие функции.
2 При необходимости выполняются преобразования программ, (компиляция, оптимизация, ре-факторинг и т.п.) для улучшения эксплуатационных характеристик, связанных с процессами исполнения программ.
3 Важный критерий качества программирования - полнота системы решений и универсальность реализованных определений для синтаксически управляемой обработки данных функциями высоких порядков (компилятор и т.п.), что существенно повышает надежность проектов для развивающихся постановок задач.
4 Разработка ИС предусматривает выполнение ряда шагов, начальные из которых выполняют роль упрощенных прототипов для реализации последующих, возможно другими, более эффективными, средствами.
•Функциональное программирование представляет собой набор определенных функций, которые определяются рекурсивно или через другие функции. В процессе выполнения программы, ф-ии получают параметры, вычисляют и возвращают результат, в случае необходимости вычисляя значения других функций.
•Порядок вычисления в функц ЯП не описывается, описывается лишь желаемый результат в виде системы функций. Большинство функц ЯП реализуются как интерпретаторы (Lisp, Haskell, ML, Standart ML…)
Свойства функциональных ЯП:
1) краткость и простота – ФЯП выходят на более абстрактный уровень, чем традиц. ЯП
2) строгая типизация – большинство ошибок могут быть исправлены на стадии компиляции. Строгая типизация позволяет генерировать эффективный код и ускорить выполнение программ. Некоторые ФЯП поддерживают перегрузку операций.
3) Модульность – позволяет разделить программу на несколько сравнительно независимых частей с четко определенными связями между ними.
4) Отсутствие побочных эффектов – в чистом функ программировании оператор присваивания отсутствует. Объекты нельзя уничтожать\изменять, можно только создавать новые, путем декомпозиции или синтеза существующих. Таким образом, невозможно получить 2 разных значения при вызове 1 и той же функции с одним аргументом дважды, как бывает в императивных ЯП.
5) Отложенное вычисление – аргументы в функции вычисляется, только если они нужны для вычисления результата, тогда как в традиционных ЯП вызов функции приводит к вычислению всех аргументов. (если ФЯП не поддерживает отложенные вычисления, он называется строгим)
7. Классификация языков программирования. Близость языков программирования к естественному языку.
Императивный
(Как делать)
Процедурные Объектные
(С, pscal) (С++,Ada)
◘Императивный:
•Программа представлена как набор директив, обращенных к процессору. (архитектура традиционных ЭВМ)
•Программа состоит из последовательности операторов, задающих процедуру решения задачи.
•Основной оператор – присваивание –служит для изменения содержимого областей памяти.
•Основная концепция – память, как хранилище значений, содержимое которого может обновляться операторами программы.
Декларатиный
(что делать)
Функциональные Логические
(Lisp, Haskell) (Prolog)
◘Декларативный:
•Программа представляет собой множество отношений между некоторыми сущностями (объектами) решаемой задачи и описание действий (не набор команд) которые нужно совершить.
•Этот подход прозрачнее формализуется математическими средствами.
•Ее проще проверять на ошибки и тестировать.
•Программы работают медленнее, но могут решать более абстрактные задачи с меньшими трудозатратами.
[Языки программирования]
Asm АЯ ОО ФП ЛП ЕЯ
|___|___|___|___|___|
Asm-ассемблер
Ая-алгоритмические (процедурные)
ОО-объектно-ориентированные
ФП-функциональное программирование
ЛП-логическое программирование
ЕЯ-естественные языки
<Классификация по типу задач>
•Задачи искусственного интеллекта (lips, prolog)
•Параллельные вычисления (fun, apl)
•Задачи вычислительной математики и физики (pfor, obc)
•Разработка интерфейса (c++, java, ассемблер)
•Разработка программ-оболочек, разработка систем (java, c/c++, ассемблер)
•Задачи вычислительного характера (Ada, Pascal, Basic)
•Оформление документов, обработка больших текстовых файлов, организация виртуальных трехмерных интерфейсов в Интернете, разработка баз данных (DDL,DSDL, QBE)
•Языки для разработки мобильных приложений (c++, java, swift)
•Языки для сетей Интернета (PHP, Perl, Python)
Языки низкого уровня представляют собой линейные последовательности элементарных операций с регистрами, в которых хранятся данные. Языки низкого уровня ориентированные для (аппаратную структуру) конкретного вычислительное устройство.
Низкоуровневое – программирование, основанное на прямом использовании возможностей и особенностей конкретной вычислительной системы. Первым компьютерам приходилось программировать двоичными машинными кодами. Однако программировать таким образом - достаточно трудоемкая и сложная задача. Для упрощения этой задачи стали появляться языки программирования низкого уровня, которые позволяли задавать машинные команды в более понятном для человека виде. Для преобразования их в двоичный код были созданы специальные программы - трансляторы.
Трансляторы делятся на:
компиляторы - превращают текст программы в машинный код, который можно сохранить и затем использовать уже без компилятора (примером являются исполняемые файлы с расширением *. exe).
интерпретаторы - превращают часть программы в машинный код, выполняют и после этого переходят к следующей части. При этом каждый раз при выполнении программы используется интерпретатор.
Преимущества низкоуровневых:
С помощью языков низкого уровня создаются эффективные и компактные программы, поскольку разработчик получает доступ ко всем возможностям процессора.
Недостатки низкоуровневых:
• Программист, работающий с языками низкого уровня, должен быть высокой квалификации, хорошо понимать устройство микропроцессорной системы, для которой создается программа. Так, если программа создается для компьютера, нужно знать устройство компьютера и, особенно, устройство и особенности работы его процессора.
• результирующая программа не может быть перенесена на компьютер или устройство с другим типом процессора.
• значительное время разработки больших и сложных программ.
Языки низкого уровня, как правило, используют для написания небольших системных программ, драйверов устройств, модулей стыков с нестандартным оборудованием, программирование специализированных микропроцессоров, когда важнейшими требованиями являются компактность, быстродействие и возможность прямого доступа к аппаратным ресурсам.
Языки высокого уровня:
Можно сказать более понятными человеку, чем компьютеру. Особенности конкретных компьютерных архитектур в них не учитываются, поэтому созданные программы легко переносятся с компьютера на компьютер. В основном достаточно просто перекомпилировать программу под определенную компьютерную архитектурную и операционную систему. Разрабатывать программы на таких языках гораздо проще и ошибок допускается меньше. Значительно сокращается время разработки программы, что особенно важно при работе над большими программными проектами.
Недостатком языков высокого уровня является больший размер программ по сравнению с программами на языке низкого уровня. Поэтому в основном языки высокого уровня используются для разработок программного обеспечения компьютеров и устройств, которые имеют большой объем памяти. А разные подвиды ассемблера применяются для программирования других устройств, где критичным является размер программы.
• Повышение эффективности труда разработчиков. За счет абстрагирования от конкретных деталей аппаратного обеспечения.
• Операторы и ключевые слова высокого уровня более осмысленны так же ведет к повышению производительности. Возможность повторного использования ранее написанных программных блоков. За счет оформления их в виде процедур и функций. Высокая переносимость программ. Недостаток – появление транслятора.
Виды языков:
<Функциональные языки>
•Программа может интерпретироваться как функция с одним или несколькими аргументами.
•Сложные программы строятся посредством алгаритмирования функций.
•Краткость и простота с позиции математики.
•Строгая типизация.
•Чистота (отсутствие побочных эффектов).
•Отложенные (ленивые) вычисления.
•Автоматизированное динамическое распределение памяти.
•Прозрачное написание рекурсивных функций.
•AutoCad
Стековые языки
◘◘◘◘◘◘◘→считывание\Происходит с одного конца стек. Если записать 1234,
◘◘◘◘◘◘◘←запись / то первый который можно будет считать это 4.
•Для переадресации параметров используется машинная модель стека.
•При использовании стека, в качестве основного канала передачи параметров между словами, элементы языка образуют фразы.
•Forth,C#,Java.
Структурное программирование
•Точно обозначенные управляющие структуры.
•Программные блоки.
•Отсутствие инструкций безусловного перехода (GOTO), автономные программ.
•Поддержка рекурсии и локальных переменных.
Аспектно-ориентированное программирование
•Разделение функциональности для улучшения разбиения программы на модули.
Примеры:
Трассировка
Контрактное программирование, в частности проверка пред и пост условий
Обработка ошибок.
Реализация систем безопасности.
Динамические языки
•Позволяет определять типы данных и осуществлять синтаксический анализ и компиляцию, непосредственно на этапе выполнения.
•Больше подходят для быстрой разработки приложений.
•Phyton,PHP,Rudy,Javascript.
•Операция склеивания строк – конкатенация.
[Объектно-ориентированные языки программирования]
•Объект – объединяет в себе поля данных (атрибуты) и методы (выполняемые объектом действия).
•Программа – описание объектов, их свойств (атрибутов), совокупностей (классов), отношений между ними, способов их взаимодействий и операций над объектами (методов), при этом классы образуют иерархию.
•Наследование – Создание нового класса объектов путем добавления новых элементов (методов).
•Инкапсуляция – сокрытие деталей реализации, которое позволяет вносить изменения в части программы безболезненно для других ее частей, что упрощает сопровождение и модификацию ПО.
•Полиморфизм – Некоторые части (методы) родительского класса заменяются новыми реализующими специфические для данного потомка действия.
•Типизация – позволяет устранить ошибки на момент компиляции.
+Объекты, классы и методы могут быть полиморфными данными, следовательно гибкость и универсальность.
-Сложность адекватной формализации объектной теории, следовательно трудность тестирования и верификации ПО.
•С++, Ada, pascal, PHP.
Прототипное программирование
•ОО программирование, при котором отсутствует понятие класса, а повторное использование (наследование) производится путем клонирования существующего экземпляра объекта программы.
Язык описания интерфейсов
•Похож на описание классов С++.
•Язык спецификаций.
Логическое программирование
•Раздел математической логики, изучающий методы и возможности этой парадигмы, основанная на выводе новых фактов из данных фактов согласно заданным логическим правилам.
•Программа – совокупность логических правил при высказывании.
•Используется в экспертных системах и системах принятия решений.
•Высокий уровень машинной независимости, возможность отката к предыдущей подцели при отрицательном результате анализа одного из вариантов.
•Prolog,Oz,Frill.
•Специфичность решаемых задач.
•Нелинейность структуры программы.
•Сложность эффективной реализации в системе реального времени.
Параллельное программирование
•Программы – совокупность описаний процессов, которые могут выполняться как в действительности одновременно, так и в псевдопараллельном режиме.
•Позволяют достичь заметного выигрыша при обработке больших объемов данных, поступающих от одновременно работающих пользователей, либо имеющих высокую интенсивность.
•Часто применяют в системах реального времени.
•Недостаток – высокие накладные расходы на разработку программ.
•Ada,MC#.
Язык сценариев (скриптовые)
•Программа состоит из сценариев, последовательностей операций.
•Скриптовые языки или языки сценариев пакетной обработки.
•bat,bash.
8. Унификация и хорновский клоз в логических языках программирования.
Логический язык программирования - язык программирования, позволяющий выполнить описание проблемыв терминах фактов и логических формул, а собственно решение проблемы выполняет система с помощьюмеханизмов логического вывода.
Логические языки, как предполагается их названием, для целей передачи смысла программ используют средства математической логики. Сама по себе логика была изобретена как инструмент человеческой мысли, позволяющий упорядочить знания и получить из них соответствующие выводы. Поэтому кажется довольно естественным прибегнуть к логике и для программирования компьютеров.
Ориентированы не на разработку алгоритма решения задачи, а на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания. В логическом программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность шагов, которые требуется выполнить. Логические программы отличаются принципиально низким быстродействием, так как вычисления осуществляются методом проб и ошибок
Унификация - При поиске решений для множеств ограничений мы используем идею, высказанную Хиндли (Hindley, 1969) и Милнером (Milner, 1978), кото- рая состоит в использовании унификации (unification) (Robinson, 1971) для проверки непустоты множества решений и, если это так, нахожде- ния «наилучшего» из его элементов в том смысле, что все остальные решения могут быть непосредственно получены из него.
Дизъюнкт Хорна (хорновский дизъюнкт, клоз Хорна) - дизъюнкция, в которой содержится не более одного положительного литерала.
Пролог — язык и система логического программирования, основанные на языке предикатов математической логики исчисления предикатов, представляющей собой подмножество логики предикатов первого порядка.
Основными понятиями в языке Пролог являются факты, правила логического вывода и запросы, позволяющие описывать базы знаний, процедуры логического вывода и принятия решений, на основе которых система логического программирования Пролог делает логические выводы и дает осмысленные ответы.
Одним из наиболее важных аспектов программирования на Прологе является использование унификации (отождествления) и конкретизации переменных.
Пролог пытается отождествить термы при доказательстве, или согласовании, целевого утверждения. Например, в программе для согласования запроса ?- человек(Х) целевое утверждение человек(X) может быть отождествлено с фактом служащий(Иван), в результате чего переменная Х станет конкретизированной: Х= Иван.
Хорновский клоз (Ноrn clause) — это формула, в которой с помощью конъюнк¬ции («и») элементарных формул выводится одиночная элементарная формула:
(s=>t)<=(t = tl||t2)^(s=>tl)
Логическое программирование основано на том наблюдении, что, ограничи¬вая формулы хорновскими клозами, мы получаем правильное соотношение между выразительностью и эффективностью вывода. Такие факты, как t => t, являются выводами, которые ниоткуда не следуют, т. е. они всегда истинны. Вывод также называется головой формулы, потому при записи в инверсной форме оно появляется в формуле первым.
Чтобы инициализировать вычисление логической программы, задается цель:
“wor” => "Hello world"?
Машина вывода пытается сопоставить цель и вывод формулы. В данном слу¬чае соответствие устанавливается сразу же: "wor" соответствует переменной s, a "Hello world" — переменной t. Это определяет подстановку выражений (в данном случае констант) для переменных; подстановка применяется ко всем переменным в формуле:
"wor" => "Hello world" <= ("Hello world" = tl || t2) ^ ("wor" => tl)
Теперь мы должны показать, что:
("Hello world" = t1|| t2) ^ ("wor" => tl)
является истинным, и это ведет к новому соответствию образцов, а именно попытке установить соответствие "Hello world" с tl || t2. Здесь, конечно, может быть много соответствий, что приведет к поиску. Например, машина вывода может допускать, чтобы tl указывало на "Не", a t2 указывало на "llо world"; эти подстановки затем проводятся во всем вычислении.
9. Модель вычислений функциональных языков программирования.
10. Языки программирования низкого уровня.
Язык программирования низкого уровня — язык программирования, близкий к программированию непосредственно в машинных кодах используемого реального или виртуального (например, Java, Microsoft .NET) процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских).
Языки низкого уровня представляют собой линейные последовательности элементарных операций с регистрами, в которых хранятся данные. Языки низкого уровня ориентированные для (аппаратную структуру) конкретного вычислительное устройство.
Как правило, использует особенности конкретного семейства процессоров. Общеизвестный пример низкоуровнего языка — язык ассемблера, хотя правильнее говорить о группе языков ассемблера. Более того, для одного и того же процессора существует несколько видов языка ассемблера. Они совпадают в машинных командах, но различаются набором дополнительных функций (директив и макросов).
Низкоуровневое – программирование, основанное на прямом использовании возможностей и особенностей конкретной вычислительной системы.
Намечают три вида низкоуровневых языков
1 Машинный код
2 Мнемо код
3 Ассемблер , макроассемблер
Машина Кода программа представляется в виде последовательности чисел являющихся кодами команд процессора, адресами оперативной памяти, номерами регистров процессора и внешних устройств.
Позволяют вместо чисел использовать символьный имена, отражающие смысл выполняемой команды.
Ассемблеры от мнемо кодов отличаются обширным набором директив транслятора. В первую очередь директивами программ в виде логически законченных элементов.
Макроассемблеры является расширением ассемблера за счет включения макросредств.
11. Средства разработки графического интерфейса пользователя. Эргономические свойства человеко-машинного интерфейса.
На начальной фазе разработки важно определить показатели, отражающие эргономические свойства разрабатываемого изделия. Желательно, чтобы они могли быть количественно измерены, что обеспечивает возможность их сравнить до и после внедрения соответствующих изменений, повышающих эргономичность изделия. К таким показателям относятся:
• эргономичность — интегральный показатель степени выполнения эргономических требований;
• показатели качества деятельности оператора (время решения задачи, производительность, число ошибок, состояние здоровья и т.д.);
• надёжность деятельности оператора (своевременное и безошибочное выполнение функций);
• эффективность СЧМ;
• напряжённость и экстремальность деятельности и т.д.
Человеко-машинный интерфейс - это широкое понятие, охватывающее инженерные решения, обеспечивающие взаимодействие оператора с управляемыми им машинами. Создание систем человеко-машинного интерфейса тесно связано с эргономикой (Эргономика - научная дисциплина, комплексно изучающая производственную деятельность человека и ставящая целью её оптимизацию), но не тождественно ей. Проектирование ЧМИ включает в себя создание рабочего места: кресла, стола, или пульта управления, размещение приборов и органов управления, освещение рабочего места, а, возможно, и микроклимат. Далее рассматриваются действия оператора с органами управления, их доступность и необходимые усилия, согласованность (непротиворечивость) управляющих воздействий и "защита от дурака", расположение дисплеев и размеры надписей на них.
Сложность создания человеко-машинного интерфейса состоит в том, что данные, которые нужно “донести” до пользователя, нужно “донести” так, чтобы пользователю было это “донесение” удобным и понятным.
Человеко-машинный интерфейс условно можно разделить на 3 подгруппы:
текстовый (командные строки) интерфейс;
смешанный (псевдографический) интерфейс
(Псевдографический интерфейс обособлен присутствием графических интерфейсных элементов, например, кнопки, индикаторы процесса выполнения, меню. Как пример можно привести известную программу FAR);
графический интерфейс
(это система средств для взаимодействия пользователя с компьютером, основанная на представлении всех доступных пользователю системных объектов и функций в виде графических компонентов экрана (окон, значков, меню, кнопок, списков и т.п.) К этому виду интерфейсов относятся такие системы как, Mac OS, Solaris, GNU/Linux, Microsoft Windows, NeXTSTEP
12. Процедурные языки программирования. Основные отличия от других типов языков.
В процедурных языках программирования на языке программирования описываются действия и порядок их выполнения, а также эти действия разбиваются на группы (подпрограммы). Из процедур в свою очередь формируются структуры кода, которые можно повторно использовать.
К процедурным языкам относятся Basic, Cobol, Fortran, Pascal, C и Ada.
Преимущества:
- маленькие модули можно написать легко и быстро;
- модули общего назначения можно использовать неоднократно, что приведет к ускорению времени разработки новых программ;
- модули можно отлаживать и тестировать независимо от всей программы.
Особенность таких языков программирования состоит в том, что задачи разбиваются на шаги и решаются шаг за шагом. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов.
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.
Процедурный язык программирования предоставляет возможность программисту определять каждый шаг в процессе решения задачи. Особенность таких языков программирования состоит в том, что задачи разбиваются на шаги и решаются шаг за шагом. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов.
Примеры: паскаль, С, Бейсик, Ада, Фортран.
13. Обоснование выбора языка программирования.
Для реализации алгоритма в качестве основного был выбран язык программирования С++, который стал едва ли не стандартом для написания любых достаточно сложных программ.
Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько «близок к машине», что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. С таким умыслом первоначально задумывался C. Второй цели идеально отвечает язык, который настолько «близок к решаемой задаче», чтобы концепции её решения можно было выражать прямо и коротко. С таким умыслом предварительно задумывались средства, добавленные к C для создания С++.
Главным образом выбор языка программирования зависит от
1. Решаемой задачи
2. Операционной системы
3. Возможностей языка программирования
4. Цена программного обеспечения
5. Обучение
6. Сопровождение
7.Удобство
8. Возможности и условия дальнейшего распространения готового продукта
Javascript очень мощный язык, в нем заложен большой потенциал. При бурно растущих веб-технологиях он может стать одним из лидеров среди языков программирования. Среда исполнения javascript кода присутствует в любом компьютере, в большинстве телефонов, да и серверное ПО можно разработать на этом замечательном языке.
Недостатки:
• Язык компилируется в момент исполнения кода. Каждый раз, когда вы открываете сайт, javascript код начинает компилироваться. Как минимум увеличивается время выполнения программы.
• Отсутствует типизация данных. Проблема всех скриптовых языков. Пока выполнение кода не дойдет до нужной строчки, не узнаешь работает ли она. А ведь значительную часть по поиску ошибок мог бы взять на себя компилятор, если бы знал типы данных, с которыми он работает. Да и по скорости выполнения, типизированный код быстрее.
• Не привычная для многих программистов объектная модель. Классы и наследование классов присутствует, но оно сильно отличается от привычной многим реализаций в языках программирования C++/C#/Java.
Достоинства:
• JavaScript предоставляет большое количество возможностей для решения самых разнообразных задач. Гибкость языка позволяет использовать множество шаблонов программирования применительно к конкретным условиям. Изобретательный ум получит настоящее удовольствие;
• Популярность JavaScript открывает перед программистом немалое количество готовых библиотек, которые позволяют значительно упростить написание кода и нивелировать несовершенства синтаксиса;
• Применение во многих областях. Широкие возможности JavaScript дают программистам шанс попробовать себя в качестве разработчика самых разнообразных приложений, а это, безусловно, подогревает интерес к профессиональной деятельности.
14. Перегрузка в языках программирования.
Перегрузка процедур и функций — возможность использования одноимённых подпрограмм: процедур или функций в языках программирования.
Перегрузка. Использование одного и того же имени для обозначения разных объектов/вариантов применения оператора вобщей области действия.
Использования одного и того же имени в 2 разных процедурах не рассматривается как перегрузка, потому что 2 переменные не существуют одновременно.
Чтобы разрешить существование нескольких одноименных операций в язык вводится правило, согласно которому операция распознается не только по имени, но и по сигнатурам их параметров.
Чтобы дать возможность определять и переопределять операции в язык вводятся различные синтаксические конструкции.
Перегружать операции имеет смысл только в том случае, если вновь вводимые операции аналогичны предопределенным.
• Перегрузка – возможность использования одноименных подпрограмм или операторов, различающихся типом или количеством параметров в пределах одной области видимости
• Перегрузка - один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются. (Полиморфизмом называется способность функции обрабатывать данные разных типов)
• Компилятор однозначно идентифицирует функцию по ее имени и набору аргументов. Для компилятора функция с одинаковыми именами, но различными параметрами аргументов – разные функции.
Int add_values(int a, int b)
{ return(a + b);}
Int add_values(int a, int b, int c)
{ return(a + b+c);}
Int add_values(float a, float b)
{ return(a + b);}
Void main(void)
{cout<<”200+800=”<< add_values (200,800);
cout<<”100+200+800=”<< add_values (100,200,800);
cout<<”0.5+0.2=”<< add_values (0.5,0.2);}
Механизм реализации в языке:
+ Улучшает удобочитаемость программ/
- Идентификация – сложность выбора конкретной реализации в случае, если нет точного совпадения типов для аргументов.
• Варианты решения:
1. Требовать однозначный проходящий вариант перегруженной функции.
2. Предоставить выбор компилятору. Выберется вариант, не приводящий к потере информации при преобразовании типов. Если существует более одного варианта – выдать ошибку.
• Приоритет и ассоциативность – порядок выполнения и следование операторов.
• Если они определены жестко – это может быть неудобно и не соответствовать предметной области (например, для операций с множествами приоритеты отличаются от арифметических).
• Если они могут быть заданы программистом – это становится дополнительным источником ошибок.
Пример: операция a+b все нормально для чисел, но для строк важен порядок, т.к. это конкатенация и a+b!=b+a
15. Логические языки программирования. Основные положения и понятия. Отличия от других типов языков программирования.
Логические языки – все операции представлены в виде логических формул. В программе допустимы логические причинно следственные связи. Таким образом логические программы базируются на классической логике и применимы для систем логического вывода.
Преимущества
1) Высокий уровень машинной независимости
2) Возможность откатов (возвращение к предыдущей подцели, и отрицательного в результате анализа одного из вариантов в процессе поиска решения)
Недостатки
1) Специфичность класса решаемых задач.
2) Сложность эффективной реализации для принятия решения в реальном времени.
3) Нелинейность структуры программы.
Логическое программирование - это парадигма программирования, в которой программы пишутся не в виде последовательности инструкций, а в виде множества фактов и правил, а процесс выполнения программы сводится к выводу нужных результатов из этого множества.
Первым языком логического программирования был язык Planner, в котором была заложена возможность автоматического вывода результата из данных и заданных правил перебора вариантов (совокупность которых называлась планом). Planner использовался для того, чтобы понизить требования к вычислительным ресурсам (с помощью метода backtracking) и обеспечить возможность вывода фактов, без активного использования стека. Затем был разработан язык Prolog, который не требовал плана перебора вариантов и был, в этом смысле, упрощением языка Planner.
Логическая программа состоит из предикатов, представляющими собой функции, вырабатывающие логические значения – любой предикат содержит вычисления, которые могут быть либо истинными, либо ложными. При этом результаты вычисления предикат возвращает только если вычисления истинны. Предикаты состоят из правил (предложений), описывающих вычисления и соединенных между собой логическими операторами И/ИЛИ, при этом логическому И соответствует оператор запятая, а ИЛИ – оператор точка. Программы на языке Prolog могут содержать также переменные (их имена обязательно должны начинаться с большой буквы – этим они отличаются от других объектов), однако одним из базовых в логическом и функциональном программировании является принцип однократного присваивания, в соответствии с которым переменная может получить значение лишь один раз, все остальные попытки присваивания будут работать как проверка на равенство. Следствием принципа однократного присваивания является отсутствия циклических конструкций в Prolog – вместо них везде применяется рекурсия, что не снижает скорость работы программы, т.к. хвостовая рекурсия также эффективна, как и цикл.
Логические языки (Prolog) - ориентированы не на разработку алгоритма решения задачи, а на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания. В логическом программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность шагов, которые требуется выполнить. Логические программы отличаются принципиально низким быстродействием, так как вычисления осуществляются методом проб и ошибок (посредством поиска с возвратами).
Задача программиста – описание логической модели предметной области в терминах объектов, их свойств и отношений между ними (без деталей): описание данных и логики их обработки ~ аналогия с ООП.
Удобство описания отношений между объектами (реляционная модель).
Компактность кода (обработка структурированных данных, лог. правила).
Возможность перебора и поиска различных решений, заложенная в язык.
Легкость понимания (описание отд. правил), отладки программ (trace).
Легкость описания сложных структур данных (деревья, списки и т.п.).
Эффективный метод вычислений – рекурсия.
Отсутствие указателей, операторов присваивания и безусловного перехода.
Множество областей для применения: автоматический перевод, обработка текстов, экспертные системы, САПР, Data-minig системы, автоматическое управление, СУБД, символьные вычисления.
16. Объектноориентированные языки программирования. Основные отличия от других концепций языков программирования.
Объектно-ориентированное программирование (ООП) - это методика разработки программ, в основе которой лежит понятие класса как некоторой структуры, описывающей совокупность однотипных объект реального мира, их поведение.
Программа представляет собой описание объектов, их свойств - атрибутов, совокупностей – классов. Отношений между ними, способов их взаимодействия и операциями над объектами (методы). Классы при этом образуют иерархию.
Преимущества
1) Концептуальная близость к предметной области. Произвольные структуры и назначения.
2) Поддержка механизма обработки событий, которые изменяют атрибуты объектов, и моделирует их взаимодействие в предметной области.
3) Использование раннее разработанных библиотек объектов и методов, что снижает трудозатраты и временные затраты.
4) Объекты классы и методы могут быть полиморфными, что делает программное обеспечение более гибким и универсальным.
Недостаток
1) Сложность адекватной т.е. непротиворечивой, полной формализации объектной теории, рождает трудности тестирования и верификации созданного программного обеспечения.
<Объектно-ориентированное программирование (ООП)>
• Описывает статическую структуру системы, показывая ее классы, их атрибуты и методы, и также взаимосвязи этих классов.
• (ООP) (объектно-ориентированное программирование) – это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
• (OOD) (Объектно-ориентированное проектирование) – это методология проектирования, соединяющая в себе процесс объектной декомпиляции и примеры представления логической и физической, а также статистикой и динамической моделей проектируемой системы.
• (OOA) (Объектно-ориентированный анализ) – это методология, при которой требования к системе воспринимаются с точки зрения классов и объектов, выявленных в предметной области.
