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

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

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

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

Добавлен: 04.07.2023

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

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

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

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

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

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

Кроме того, появление языков высокого уровня значительно уменьшила зависимость реализации от аппаратного обеспечения. Чтобы это реализовать, были созданы специализированные программы - трансляторы, предназначенные для преобразования инструкции языка программирования в коды определенной машины. Использование трансляторов привело к некоторой потере скорости вычислений, но этот недостаток компенсировался значительным выигрышем в скорости разработки и модификации программ [17].

Также в этот период начали разработку специализированных языков программирования для решения конкретных классов задач: для систем управления базами данных, имитационного моделирования и др.

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

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

Практика программирования показала, что большая часть высокоуровневых языков, созданных в период процедурного подхода, очень удачно реализована, поэтому они или их вариации используются до сих пор. Например, до сих пор используется язык Fortran для реализации вычислительных алгоритмов, язык COBOL для описания бизнес-процессов или язык APL, поэтапно трансформировалась в язык С (CI) [1].

Потребность повышения уровня типизации языков программирования привела к появлению языка Pascal (Паскаль). Одновременно с Паскалем был разработан язык С, который в основном ориентирован на системное программирование и является слабо типизированным языком.


Основные преимущества процедурно-ориентированных языков программирования [11]:

  1. Повышение уровня абстракции;
  2. Меньше машинной зависимости;
  3. Большая совместимость;
  4. Содержательная значимость текстов программ;
  5. Унификация программного кода
  6. Повышение эффективности труда программистов.
  7. Основные недостатки:
  8. Большие затраты на изучение языков;
  9. Меньше вычислительная эффективность.

Примеры процедурно-ориентированных языков программирования: Fortran, ALGOL, PL / 1, APL, BPL, COBOL, Pascal, C, Basic .

2.3. Проблемно–ориентированные языки программирования

Проблемно–ориентированные языки, предназначенные для решения целых классов новых задач, возникших в связи с постоянным расширением области применения вычислительной техники.

В 60-х гг. ХХ века возникает новый подход к программированию - декларативный подход. При декларативном подходе к программированию программа является не набором команд, а описанием действий, которые нужно выполнить.

Этот подход легко формализуется математическими средствами. В результате программы легче проверять на ошибки и соответствие техническим требованиям (верифицировать) [12].

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

Изначально декларативным языкам программирования было трудно конкурировать с императивными, из-за проблемам при создании эффективных трансляторов. Программы работали медленнее, однако они решали более абстрактные задачи с меньшими затратами.

Например, язык SML была разработан как средство доказательства теорем. Диалекты языка LISP возникли благодаря тому, что этот язык является эффективной при обработке символьной информации [5].

Одним из путей развития декларативного стиля программирования стал функциональный подход, возникший с появлением и развитием языка LISP.

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

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


При функциональном программировании повторное использование кода сводится к вызову ранее описанной функции, структура которой, в отличие от процедуры императивного языка, прозрачная математически. Более того, типы отдельных функций, используемых в функциональных языках, могут быть переменными. То есть обеспечивается возможность обработки разнородных данных (например, упорядочение элементов списка по возрастанию для целых чисел, отдельных символов и строк), или полиморфизм. Благодаря реализации механизма сопоставления с образцом, такие языки, как ML и Haskell, очень хорошо применимы для символьной обработки [11].

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

К недостаткам языков функционального программирования относят нелинейную структуру программы и относительно невысокую эффективность реализации. Однако первый недостаток достаточно субъективный, а второй успешно преодолен современными реализациями, в частности рядом последних трансляторов языка SML, включая и компилятор, для среды Microsoft. NET.

Функциональное программирование предполагает достаточным вычисления функций от исходных данных и результатов других функций, и не предполагает явного хранения состояния программы. Самые известные языки: LISP, F #, Haskell, Erlang, APL, ML, Scala, Miranda, Nemerle, XQuery, Python.

Концепция функционального программирования [10-14]:

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

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

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

4. Отсутствие оператора присваивания уподобляет переменные функциональных языков программирования переменным в математике - получив раз свои значения, они больше никогда их не меняют.


5. Следствием отсутствия побочных эффектов в процессе вычисления функций является несущественность порядка выполнения отдельных фрагментов программы - итоговое значение во всех случаях будет одинаковым.

6. Функциональное программирование достаточно привлекательное. Однако, для успешного овладения этим стилем программирования необходимо достаточно глубокое понимание многих разделов математики.

На функциональных языках хорошо решаются задачи:

  1. Обработки данных:
  2. Синтаксический разбор;
  3. Компиляторы, преобразования программ;
  4. Data Mining;
  5. Биоинформатика;
  6. Вычислительные задачи;
  7. Параллельные задачи.

В 70-х гг. ХХ века возникла еще одна ветвь языков программирования, связанная с проектами в области искусственного интеллекта - языка логического программирования [11].

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

Важным преимуществом подхода является достаточно высокий уровень машинной независимости, а также возможность откатов - возвращение к предыдущей цели при отрицательном результате анализа одного из вариантов в процессе поиска решения (скажем, очередного хода при игре в шахматы), что избавляет от необходимости поиска решения полным перебором вариантов и увеличивает эффективность реализации [8-10].

Одним из недостатков логического подхода в концептуальном плане специфичность класса решаемых задач.

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

В качестве примеров языков логического программирования можно привести Prolog (название произошло от слов PROgramming in LOGic) и Mercury.

Программа на Prolog состоит из предикатов. Программа на Prolog и база знаний - синонимы. Цель формулируется также в виде предикатов. Выполнение программы Prolog - это резолюция (вывод) цели.

Под интерпретатором Prolog понимают механизм решения задачи, сформулированной в языке Prolog. Иначе говоря, интерпретатор языка Prolog - это исполнитель Prolog -программ, то есть и "активная сила", которая выполняет программы, написанные на Prolog.


В каждом из языков программирования есть свой круг задач, при решении которых они используются с наибольшей эффективностью. Для Prolog – это задачи, связанные с разработкой систем искусственного интеллекта (различные экспертные системы, программы-переводчики, интеллектуальные игры) [17].

Логическое программирование - это концепция, которая позволяет описывать проблемы предметной области без составления алгоритма поиска развязку.

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

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

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

Prolog присущ ряд механизмов, отсутствующих в традиционных языках программирования: сопоставление с образцом, вывод с поиском и возвратом. Еще одно существенное отличие заключается в том, что для хранения данных в Prolog используются списки, а не массивы. В языке отсутствуют операторы присваивания и безусловного перехода, указатели [7].

Естественным и зачастую единственным методом программирования является рекурсия.

Prolog требует отказа от стереотипов, стиля мышления императивного программирования. Основные области применения Prolog:

  1. Быстрая разработка прототипов прикладных программ;
  2. Автоматический перевод с одного языка на другой;
  3. Символьные вычисления для решения уравнений, дифференцирования и интегрирования;
  4. Проектирование динамических реляционных баз данных;
  5. Экспертные системы и оболочки экспертных систем;
  6. Автоматизированное управление производственными процессами;
  7. Атоматическое доказательство теорем;
  8. Полуавтоматическое составление расписаний;
  9. Системы автоматизированного проектирования;
  10. Основанное на знаниях программное обеспечение;
  11. Организация сервера данных или, точнее, сервера знаний, к которому может обращаться клиентское приложение, написанное на каком-либо языке программирования.

Рост производительности компьютеров при снижении их стоимости во второй половини1990-х гг. с одновременным ростом сложности решаемых задач и совершенствованием техники реализации компиляторов и интерпретаторов привели к значительному повышению эффективности решении задач именно с помощью языков высокого уровня.