Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (ТЕОРЕТИЧЕСКИЕ И ИСТОРИЧЕСКИЕ АСПЕКТЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ).pdf

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

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

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

Добавлен: 31.03.2023

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

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

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

Тем не менее, со временем в программах появились ситуации, когда структуры имели свой набор операций, который зависел от типа структур. И даже некоторые структуры могли иметь внутри себя некоторые указатели, которые в зависимости от ситуации могли указывать на дополнительные подпрограммы, таким образом, реализуя некий новый уровень абстракции. Со временем появилась идея объектов, которые включали в себя структуру данных и набор операций над ними. Впервые, еѐ выдвинул Иван Сазерленд, в своей программе - Планшет. В нем присутствовала система выпадающих меню и поддержка светового пера, путем применения которого было возможно рисование несложных примитивов, их перемещение и хранение[44].

Понятие класса у Сазерленда отождествлялось с определением "мастера", а объект именовался экземпляром "мастера". Таким образом, появились первые предпосылки возникновения первых объектно-ориентированных языков.

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

Simula-67 считается первым языком программирования с поддержкой объектов[45]. Он был разработан сотрудниками Норвежского Вычислительного Центра Кристеном Нюгордом и Оле-Йоханом Далем для моделирования сложных систем. Изначально она позиционировалась как объектное расширение языка Algol[46].

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

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

class order(number); integer number;

begin integer batch_size;

real setup_time;

end;

Пример, указанный выше объявляет несложный класс order, характеризующийся целочисленным полем number и двумя полями: batch_size и setup_time[48].

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


Этот язык сильно опередил своѐ время, современники были не готовы к возможностям языка Simula-67. В конечном итоге, он не смог конкурировать с другими языками программирования (прежде всего, с языком Fortran)[49].

Отчасти проблема заключается в том, что в нем присутствовала сборка мусора. Нужно понимать, что согласно последним данным для быстрой сборки мусора нужна память в 4-8 раз большая чем память, требуемая программе. Учитывая тот факт, что машинная реализация была не самой эффективной, а сборка мусора дополнительно замедляла программу, то Simula-67 заслужил прохладное к себе отношение у программистов[50].

Другим языком, с которого как считается, появилось объектно-ориентированное программирование, является разработанный Аланом Кеем в 70-х гг. Smalltalk.

Рассмотрим основные идеи Smalltalk.

В Smalltalk всѐ является объектом, даже такие единицы языка в некоторых реализациях, а также аппаратные объекты (стек и память). При этом программа состоит из посылок сообщений между объектов, в которых объект, принимающий сообщение может определить, правильно ли сообщение и как оно должно быть обработано[51].

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

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

Особенно успешным оказался другой язык — Pascal. Автором его является Никлаус Вирт, участвовавший в разработке стандарта языка Алгол. Паскаль был создан в 1968-1969 году[52].

Первая публикация Вирта о языке датирована 1970 годом. Сам Никлаус Вирт ставил целью его создания — построение небольшого и эффективного языка. Данный язык должен был поспособствовать хорошим на тот момент практикам программирования с использованием структур[53].

Необходимо отметить, что сам Паскаль не был объектно-ориентированным языком. Объектное его расширение появилось лишь в 1986 году, когда фирма Apple, а конкретно Ларри Теслер и его группа разработали Object Pascal. Позднее объектная модель появилась и в других реализациях Pascal, одной из которых является популярная до сих пор реализация Turbo Pascal.


В Object Pascal классы задавались с помощью встроенного типа object. Данный тип мог содержать поля данных, а также методы, которые представлялись процедурами и функциями, имена которых шли после имени класса. Конструктор задавался как процедура с именем constructor, а деструктор - destructor. Соответственно, деструкторов могло быть несколько, и они могли иметь параметры. Поддерживались наследование (не множественное), приницип подстановки Барбары Лисков и динамические методы[54].

Другим достаточно интересным подходом к реализации является, реализованная на основе языка LISP (который будет рассмотрен позднее) система объектно-ориентированного программирования CLOS.

CLOS имеет много особенностей. Это и перегрузка с множественной диспетчеризацией, когда реализация определяется всеми аргументами, Это и группировка методов в «обобщѐнные функции»[55], так как методы не принадлежат классам, и исходя из этого - открытость.

CLOS является динамическим языком. В нем структура объектов может быть изменена при исполнении, к примеру могут быть добавлены и удалены методы класса. CLOS поддерживает смену класса любого экземпляра при помощи конструкции CHANGE-CLASS. Кроме этого, CLOS поддерживает множественное наследование.

Данные языки заложили очень важные концепции развития объектно-ориентированного программирования. После них было огромное количество других языков, также позволяющих работать с объектами, но концептов нового уровня они уже не вносили[56]. Конечно, определенным развитием объектно-ориентированного программирования можно считать аспектно-ориентированное программирование, когда моделируются аспекты системы или компонентно-ориентированное программирования, когда моделируются системы в целом. Однако стоит понимать, что изнутри они представляют из себя те же объекты, с более мощными средствами валидации моделей, а также средствами интроспекции[57].

Современные языки программирования

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


Одной из тенденций является потребность в решении более сложных и разнообразных задач. Мы уже говорили о том, как появилось аспектное и компонентно-ориентированные стили программирования. Стоит отметить, что при таком условии появляется требование открытости инфраструктуры языка (примером которого служат системы CLOS и Smalltalk)[58]. Современные языки предоставляют возможности препроцессора и шаблонирования, когда одни классы, являются параметрами для других, таким образом повышая уровень абстракции программы. Также возникает возможность подменять реализации уже существующих процедур (к примеру реализация monkey-patching в Ruby).

Требование портируемости кода между платформами, привело к развитию отделения синтаксиса от аппаратной реализации для языков системного программирования и появлению виртуальных машин для языков программирования бизнес-приложений. Что же касается, современных языков для разработки бизнес-приложений, то здесь хорошо себя зарекомендовали виртуальные машины Java (Java, Ceylon, Kotlin, Xtend, Clojure и др.) и .Net (C#, F#, Visual Basic, Delphi), вокруг которых были построены целые плеяды языков[59].

Кроме этого, рост числа процессоров привел к тому, что большинство языков имеют возможности для работы с недетерминированным исполнением команд (потоки). Одним из таких языков стал набирающий популярность в последнее время – Erlang[60].

Erlang является функциональным языком программирования со строгой динамической типизацией, предназначенным для создания распределѐнных вычислительных систем. Создан компанией Ericsson. Он включает в себя средства для работы специальных легких процессов, потребляющих малое число ресурсов компьютера. Его средства поддерживают взаимодействие через обмен сообщениями (для этого применяется модель акторов). При этом процессам не обязательно находиться на одной машине, Erlang-процессы могут исполняться на разных нодах кластера.

Erlang отчасти демонстрирует еще одну тенденцию в современных языках программирования – уход от концепции объектно-ориентированного программирования в сторону функционального.

Примером такого ухода является рост в последние годы популярности языков LISP и Haskell.

Лисп (LISP, Lisp) представляет собой целую пляду языков программирования. В LISP программы и данные едины и представляют системы списков символов. Создатель Лиспа — Джон Маккарти[61]. Синтаксис данного языка довольно прост и содержит в себе лишь так называемые s-expressions — выражения, разделяемые пробелами и отделяемые друг от друга лишь скобками, в которых сами выражения и заключены. Однако, семантическая сторона последовательности вычисления выражений ничем не ограничена, и исходя из этого он позволяет просто конструировать даже довольно сложные системы[62].


Другим таким языком является Haskell — функциональный язык программирования, позиционирующий себя как «чистый», т.е. лишенный нежелательных побочных эффектов, которые могут запутать программиста[63].

Имеет поддержку отложенных вычислений, которой помогает автоматический вывод типов, основанный системе Хиндли-Милнера и представляющий собой мощный инструмент для создания управляющих структур[64].

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

ГЛАВА 2. КРИТЕРИИ ВЫБОРА СРЕДЫ И ЯЗЫКА РАЗРАБОТКИ ПРОГРАММ

2.1 Языки программирования, особенности и критерии отбора

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

· Собственно характеристиками, особенностями самого языка;

· Наличием удобного, доступного к использованию среды программирования;

· Наличие методической поддержки[65].

Относительно характеристики собственно языка программирования, то важнейшими являются: назначение; тип, распространение; особенности синтаксиса.

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

Существует широкая типизация языков программирования по способу созданием программы или их парадигмой. В обучении используются процедурные, объектно, визуальные, скриптовые, декларативные и другие типы языков программирования[67].