Файл: Обзор языков программирования высокого уровня(Теоретические основы языков программирования высокого уровня ).pdf

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

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

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

Добавлен: 20.05.2023

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

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

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

2.3 Декларативные языки программирования высокого уровня

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

В рамках декларативной парадигмы можно выделить функциональное и логическое программирование.

Функциональный стиль программирования сложился в практике решения задач символьной обработки данных в предположении, что любая информация для компьютерной обработки может быть сведена к символьной (существование аналоговых методов принципиально не противоречит этой гипотезе). Слово «символ» здесь близко понятию «знак» в знаковых системах. Информация представляется символами, смысл которых может быть восстановлен по заранее известным правилам.

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

Языки функционального программирования (ЯФП) используют гибкие списки и абстрактные атомы. ЯФП нацелены на полный контроль типов значений при исполнении программ, допускающих динамический анализ и управление с откладыванием вычислений, автоматизацию повторного использования памяти – «сборки мусора».


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

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

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

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

3. Подобие машинным языкам. Система функционального программирования допускает, что программа может интерпретировать и/или компилировать программы, представленные в виде структур данных. Это сближает методы функционального программирования с методами низкоуровневого программирования и отличает от традиционной методики применения языков высокого уровня. Не все языки функционального программирования в полной мере допускают эту возможность, но для языка Lisp она характерна. В принципе, такая возможность достижима на любом стандартном языке, но так делать не принято [4, c. 100].

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

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


Парадигма логического программирования использует идею автоматического вывода информации на основе заданных фактов и правил. Логическое программирование основано на теории и аппарате формальной логики. Написанная согласно формальной логике программа является множеством логических форм, представляющих факты и правила относительно некоторой предметной области. Основным языком логического программирования признан Prolog, хотя известны и другие – Planner, ASP и Datalog. Во всех таких языках правила имеют форму клауз:

H :- B11, …, BNn,

понимаемую как логическое следование

if (B11 and … and BN) then H или B11 & … & BN → H

H называют головой правила, а B11, …, BN – телом. Факты – это правила без тела. Различают атомарные и составные клаузы. Предикаты, образующие тело, могут быть выражены в стиле сопоставления с образцом. Важный механизм – использование отрицаний в теле клауз, что приводит к немонотонной логике. Логика программ может использовать процедурный стиль при вычислении целей:

to solve H, solve B1, and ... and solve Bn.

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

3 Характеристика популярных языков программирования высокого уровня

3.1 Java

Для оценки популярности языков программирования за определенный период используется индекс TIOBE - индекс, оценивающий популярность языков программирования, основываясь на количестве поисковых запросов, содержащих название языка [6].

Одни языки становятся более популярными, другие – утрачивают популярность. Динамика индекса с конца 2011 до середины 2017 года представлена на рис. 4.

Рисунок 4 – Динамика индекса TIOBE [16]

Несмотря на определенное снижение популярности, лидирующие позиции сохраняет язык Java.

История Java восходит к 1991 году, когда группа инженеров из компании Sun под руководством Патрика Нотона (Patrick Naughton) и члена Совета директоров Джеймса Гослинга (James Gosling) занялась разработкой языка, который можно было бы использовать для программирования бытовых устройств, например, контроллеров для переключения каналов кабельного телевидения. Поскольку такие устройства не потребляют много энергии и не имеют больших микросхем памяти, язык должен был генерировать очень компактные программы. Кроме того, поскольку разные производители могут выбирать разные центральные процессоры, было важно не ориентироваться только на какую-то одну архитектуру компьютеров [3].


Технология Java – это объектно-ориентированная, платформонезависимая, многопоточная среда программирования.

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

Когда программный продукт, написанный на языке программирования Java, компилируется с использованием Java-компилятора, получается байт-код, который может интерпретироваться на любой платформе, где установлена виртуальная машина Java. Это означает, что нет необходимости в портировании программ, то есть их перевода на язык, понятный конкретному компьютеру [14, с. 187].

Архитектурная независимость - лишь составная часть переносимости. В отличие от С или С++ в Java не существует понятия "зависимости от реализации", когда речь идет о размерности базовых типов. Форматы типов данных и операции над ними четко определены. Тем самым, программы остаются неизменными на любой платформе - не существует несовместимости типов данных на аппаратных и программных архитектурах.

Архитектурная независимость и переносимость программного обеспечения Java обеспечивается виртуальной машиной Java (Java Virtual Mashine - JVM) - абстрактной машиной, для которой компилятор Java генерирует код. Специальные реализации JVM для конкретных аппаратных и программных платформ предоставляют уже конкретную виртуальную машину. JVM базируется на стандарте интерфейса переносимых операционных систем (POSIX).

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

Язык программирования Java с самого начала проектировался как объектно-ориентированный. Задачам распределенных систем клиент-сервер отвечает объектно-ориентированная парадигма: использование концепций инкапсуляции, наследования и полиморфизма. Язык Java предоставляет ясную и действенную объектно-ориентированную платформу разработки. Программисты на Java могут использовать стандартные библиотеки объектов, обеспечивающие работу с устройствами ввода/вывода, сетевые функции, методы создания графических пользовательских интерфейсов.


Платформа Java разработана для создания высоконадежного прикладного программного обеспечения. Большое внимание уделено проверке программ на этапе компиляции, за которой следует второй уровень - динамическая проверка (на этапе выполнения). Модель управления памятью предельно проста: объекты создаются с помощью оператора new. В Java, в отличие от С++, механизм указателей исключает возможность прямой записи в память и порчи данных: при работе с указателями операции строго типизированы, отсутствуют арифметические операции над указателями. Работа с массивами находится под контролем управляющей системы. Существует автоматическая сборка мусора. Данная модель управления памятью исключает целый класс ошибок, так часто возникающих у программистов на С и С++. Программы на Java можно писать, будучи уверенным в том, что машина не «повиснет» из-за ошибок при работе с динамически выделенной памятью.

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

3.2 С/С++

Язык С, созданный Денисом Ритчи в начале 1970-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования. Язык С считается языком системного программирования, хотя он удобен и для написания прикладных программ. Среди преимуществ языка С следует отметить переносимость программ на компьютеры различной архитектуры и из одной операционной системы в другую, лаконичность записи алгоритмов, логическую стройность программ, а также возможность получить программный код, сравнимый по скорости выполнения с программами, написанными на языке ассемблера. Последнее связано с тем, что хотя С является языком высокого уровня, имеющим полный набор конструкций структурного программирования, он также обладает набором низкоуровневых средств, обеспечивающих доступ к аппаратным средствам компьютера. С 1989 года язык С регламентируется стандартом Американского института национальных стандартов ANSI С. В настоящее время, кроме стандарта ANSI C разработан международный стандарт ISO C (International Standard Organization C) [9, c. 8].