Файл: Современные языки программирования.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 29.04.2023

Просмотров: 389

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

<div id="castle-green" class="castle"

style="background:url(images/castle-green.png) no-repeat; left:470px; top:60px; width: 353px; height: 621px;"

data-fly-range="15" data-fly-duration="1500" data-fly-direction="top"></div>

<div id="castle-yellow" class="castle"

style="background:url(images/castle-yellow.png) no-repeat; left:210px; top:50px; width: 267px; height: 630px;"

data-fly-range="5" data-fly-duration="500" data-fly-direction="top"></div>

<div id="fog-01" class="fog"

style="background:url(images/fog-01.png) no-repeat; left:100px; top:435px; width: 580px; height: 194px;"

data-fly-range="25" data-fly-duration="3000" data-fly-direction="left"></div>

<div id="castle-orange" class="castle"

style="background:url(images/castle-orange.png) no-repeat; left:-110px; top:-30px; width: 524px; height: 736px;"

data-fly-range="20" data-fly-duration="1000" data-fly-direction="top"></div>

</div>

1.2.4 Особенности функционального и логического программирования

В логическом программировании, также как и в функциональном программировании, программист остается в неведении о методах, применяемых при вычислении, и последовательности исполнения элементарных действий. Большая часть ответственности за эффективность вычислений в логическом и функциональном программировании перекладывается на «плечи» транслятора используемого языка программирования.

Преимущества функционального программирования:

  • Программа представляет собой множество вычисляемых функций
  • Отсутствует операция присваивания (осн. Императивный оператор)
  • Порядок выполнения программы (вычислений) несущественен
  • Быстродействие (по сравнению с аналогичными императивными вычислениями)
  • Компактность кода (особенно для списков и вариантных типов)
  • Суперпозиции/склеивания функций: из простых – сложные, редукция
  • Суперпозиция моделей: склеивание программ, ленивые вычисления
  • Численное дифференцирование/интегрирование (в т.ч. модульное)
  • Алгоритмы искусственного интеллекта (эвристический поиск и т.п.)
  • Распараллеливание вычислений (Haskell)
  • Интерактивная отладка, Unit-тестирование, карринг
  • Сопоставление с образцом

Преимущества логического программирования:

  • Задача программиста – описание логической модели предметной области в терминах объектов, их свойств и отношений между ними (без деталей): описание данных и логики их обработки ~ аналогия с ООП
  • Удобство описания отношений между объектами (реляционная модель)
  • Компактность кода (обработка структурированных данных, лог. правила)
  • Возможность перебора и поиска различных решений, заложенная в язык
  • Легкость понимания (описание отд. правил), отладки программ (trace)
  • Легкость описания сложных структур данных (деревья, списки и т.п.)
  • Эффективный метод вычислений – рекурсия
  • Отсутствие указателей, операторов присваивания и безусловного перехода
  • Множество областей для применения: автоматический перевод, обработка текстов, экспертные системы, САПР, Data-minig системы, автоматическое управление, СУБД, символьные вычисления

1.2.5 Структурная модель

Структурное программирование – это парадигма программирования, в основе которой лежит представление программы в виде иерархической структуры блоков.

В соответствии с данной парадигмой:

  • Любая программа представляет собой структуру, построенную из базовых конструкций.
  • В программе базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается.
  • Повторяющиеся фрагменты программы (либо представляющие собой логически целостные вычислительные блоки) могут оформляться в виде т. н. подпрограмм (процедур или функций).

Есть несколько подходов реализующих структурную модель программирования:

Модульное программирование – основанное на разбиении программы на независимые модули, каждый из которых компилируется отдельно от остальных. Такая модульность программного кода позволяет значительно уменьшить время перекомпиляции при изменениях, вносимых лишь в небольшое количество исходных файлов, и упрощает групповую разработку.

Объектно–ориентированное программирование (или объектное) – состоит в описании структуры и поведения проектируемой системы, то есть, фактически, определяет: из каких частей состоит система и в чём состоит ответственность каждой из частей, при этом основными концепциями являются понятия объектов и классов.

Класс – это тип, описывающий устройство объектов. Это в чистом виде абстрактный тип данных, создаваемый программистом.

Объект – сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса.

Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления.

1.2.6 Концепции модульного программирования

В основе модульного программирования лежат три основных концепции:

Принцип утаивания информации Парнаса. Всякий компонент утаивает единственное проектное решение, т. е. модуль служит для утаивания информации. Подход к разработке программ заключается в том, что сначала формируется список проектных решений, которые особенно трудно принять или которые, скорее всего, будут меняться. Затем определяются отдельные модули, каждый из которых реализует одно из указанных решений.


Аксиома модульности Коуэна. Модуль — независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям:

  • блочность организации, т. е. возможность вызвать программную единицу из блоков любой степени вложенности;
  • синтаксическая обособленность, т. е. выделение модуля в тексте синтаксическими элементами;
  • семантическая независимость, т. е. независимость от места, где программная единица вызвана;
  • общность данных, т. е. наличие собственных данных, сохраняющихся при каждом обращении;
  • полнота определения, т. е. самостоятельность программной единицы

Сборочное программирование Цейтина. Модули — это программные кирпичи, из которых строится программа. Существуют три основные предпосылки к модульному программированию:

  • стремление к выделению независимой единицы программного знания, в идеальном случае всякая идея (алгоритм) должна быть оформлена в виде модуля;
  • потребность организационного расчленения крупных разработок;
  • возможность параллельного исполнения модулей (в контексте параллельного программирования).

1.2.7 Объектно-ориентированные языки программирования

Многие современные языки специально созданы для облегчения

объектно-ориентированного программирования. Однако следует отметить, что можно применять техники ООП и для не-объектно-ориентированного языка и наоборот, применение объектно-ориентированного языка вовсе не означает, что код автоматически становится объектно-ориентированным.

Современный объектно-ориентированный язык предлагает, как правило, следующий обязательный набор синтаксических средств:

  • Объявление классов с полями (данными — членами класса) и методами (функциями — членами класса).
  • Механизм расширения класса (наследования) — порождение нового класса от существующего с автоматическим включением всех особенностей реализации класса-предка в состав класса-потомка. Большинство ООП-языков поддерживают только единичное наследование.
  • Полиморфные переменные и параметры функций (методов), позволяющие присваивать одной и той же переменной экземпляры различных классов.
  • Полиморфное поведение экземпляров классов за счёт использования виртуальных методов. В некоторых ООП-языках все методы классов являются виртуальными.

Видимо, минимальным традиционным объектно-ориентированным языком можно считать язык Оберон, который не содержит никаких других объектных средств, кроме вышеперечисленных (в исходном Обероне даже нет отдельного ключевого слова для объявления класса, а также отсутствуют явно описываемые методы, их заменяют поля процедурного типа). Но большинство языков добавляют к указанному минимальному набору те или иные дополнительные средства. В их числе:

  • Конструкторы, деструкторы, финализаторы.
  • Свойства (аксессоры).
  • Индексаторы.
  • Интерфейсы (например, в Java используются также как альтернатива множественному наследованию — любой класс может реализовать сколько угодно интерфейсов).
  • Переопределение операторов для классов.
  • Средства защиты внутренней структуры классов от несанкционированного использования извне. Обычно это модификаторы доступа к полям и методам, типа public, private, обычно также protected, иногда некоторые другие.

Часть языков (иногда называемых «чисто объектными») целиком построена вокруг объектных средств — в них любые данные (возможно, за небольшим числом исключений в виде встроенных скалярных типов данных) являются объектами, любой код — методом какого-либо класса, и невозможно написать программу, в которой не использовались бы объекты. Примеры подобных языков – Smalltalk, Python, Java, C#, Ruby, AS3. Другие языки (иногда используется термин «гибридные») включают ООП-подсистему в исходно процедурный язык. В них существует возможность программировать, не обращаясь к объектным средствам. Классические примеры – C++, Delphi и Perl.

1.2.8 Метапрограммирование

Метапрограммирование – это парадигма программирования, основанная на создании программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).

Есть несколько подходов реализующих модель метапрограммирования:

Генерация кода – при этом подходе код программы не пишется вручную, а создается автоматически программой-генератором на основе другой, более простой программы. Реализуется двумя основными методами:

Шаблоны решают задачу, если соблюдение «правил» сводится к вставке в программу повторяющихся (или почти повторяющихся) кусков кода. Помимо этого, обладают еще рядом достоинств: например, помогают повторному использованию.


Внешне-языковые средства применяются в случаях, если простых средств вроде шаблонов недостаточно. Язык генератора составляется так, чтобы автоматически или с минимальными усилиями со стороны программиста реализовывать правила парадигмы или необходимые специальные функции. Фактически, это – более высокоуровневый язык программирования, а генератор – не что иное, как транслятор. Генераторы пишутся, как правило, для создания специализированных программ, в которых очень значительная часть стереотипна, либо для реализации сложных парадигм.

Основные парадигмы и подходы к решению задач в современных языках программирования выглядят так (см. Таблица 2):

Таблица 2 – Парадигмы и подходы языков программирования

Язык

программирования

Парадигмы

программирования

Основные подходы

программирования

Java

императивная

структурная

объектно-ориентированный

C

императивная

процедурный

C++

мультипарадигмальный

метапрограммирование

процедурный

объектно-ориентированный

PHP

мультипарадигмальный

процедурный

объектно-ориентированный

C#

мультипарадигмальный

императивная

процедурный

объектно-ориентированный

Python

императивная

декларативная

структурная

процедурный

функциональный

объектно-ориентированный

Visual Basic

императивная

структурная

процедурный

объектно-ориентированный

Objective C

мультипарадигмальный

процедурный

объектно-ориентированный

Perl

мультипарадигмальный

декларативная

функциональный

объектно-ориентированный

Современные языки программирования не ограничиваются какой-то одной парадигмой, а используют их несколько или даже являются мультипарадигмальными. Это обусловлено стремлением разработчиков расширить области применения языка, сделать его языком общего назначения, а не ориентированным на решение узкого круга задач.