Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

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

Содержание:

Введение

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

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

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

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

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

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

На сегодняшний день в мире существуют сотни различных языков программирования, которые в общем можно разделить на языки программирования низкого (Asembler) и высокого уровня (Pascal, Basic, Delphi, C и т.д.).

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

Объект исследования – основы алгоритмизации и программирования.

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

Основные задачи работы:

  1. Определить этапы решения задач с помощью ЭВМ;
  2. Исследовать развитие языков программирования;
  3. Исследовать классификации языков программирования;
  4. Определить классификацию языков программирования высокого уровня;
  5. Сделать обзор некоторых языков программирования высокого уровня (Basic, Java).

1. Основы программирования

1.1.Языки программирования. Почему нельзя обойтись одним языком?

В современном мире сложно представить себе жизнь без персонального компьютера, смартфона, планшетного компьютера и многих других цифровых устройств, так называемых «гаджетов» (англ. gadget — штуковина, приспособление, устройство, безделушка)[3], которые призваны разнообразить и облегчить жизнь человеку. Каждый день ученые и инженеры различных компаний работают над разработкой нового или усовершенствования старого «гаджета», наделяя его новыми функциями и возможностями.

Резкий технологический прорыв конца 20-го начала 21 веков повлек за собой и активное развитие языков программирования, причем активно развивались как новые языки, так и языки, основанные на других языках. Еще в 20-м веке было известно о 120 языках программирования, которые использовались в США[1].

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

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

Для ответа на эти вопросы необходимо рассмотреть понятие «язык программирования», а также историю появления и основные направления развития современных языков программирования.

Язык программирования - формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель (обычно — ЭВМ) под её управлением[6].

Первые программисты (в начале 1950-х гг) для написания программ использовали машинный код, который состоял из нулей и единиц. При этом программа писалась под конкретную ЭВМ, так как при переносе на ЭВМ другого производителя, обладающими отличными кодами, программу приходилось переписывать и набирать заново, что приводило к частому возникновению ошибок. Машинный код принято считать языком программирования первого уровня.

Использование символьных обозначений машинных команд (мнемоник) привело к облегчению, хоть и небольшому, работы программистов. Также программисты научились сопоставлять имена и адреса в памяти ЭВМ. Это стало развитием языков программирования второго уровня. Наиболее ярким представителем языков программирования второго уровня является ассемблер (от англ. assembler — сборщик)[2]. Программы, написанные на ассемблере, имели ряд недостатков, а именно – при переходе на ЭВМ иной архитектуры возникали проблемы совместимости, а также программисту необходимо в решении задачи оперировать терминами «регистр», «ячейка», «команда».

Начиная с середины 1950-х г.г. разработаны так называемые языки высокого уровня, которые не имели жесткой привязки к аппаратной платформе. За исполнение программ высокого уровня на любой платформе отвечает транслятор, переводящий программный код в машинный код. Наиболее яркими представителями языка программирования высокого уровня того времени являются Фортран, Лисп и Кобол[6].

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

Так, например, язык APL был первым языком программирования, в котором была реализована обработка массива. Этот язык оказал основное влияние на функциональное программирование.

Первый язык программирования, в котором реализована поддержка объектно-ориентированного программирования, стал язык Симула,

С 1969 по 1973 г.г. велась активная разработка языка Си (С), который приобрел наибольшую популярность в мире. Многие операционные системы, например, Windows, были написаны на этом языке программирования.

Среди языков логического программирования можно выделить Пролог, созданный в 1972 году.

Каждый из приведенных языков программирования стал родоначальником целых семейств современных языков. На рисунке 1 представлено генеалогическое дерево языков программирования[4]:

Рисунок 1. Генеалогическое дерево языков программирования.

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

Действительно, программирование микроконтроллеров и написание прикладной программы требует разных подходов, к тому же, несмотря на сложность в написании, программы на языке программирования низкого уровня (на ассемблере) работают быстрее и дают разработчику полный контроль над каждой ячейкой памяти. Однако код программ, написанных на разных языках программирования и выполняющих одно и то же действие, будет отличаться разительно. Ниже приведен код программы на ассемблере, выводящий на экран компьютера строку «Hello world» :

.MODEL SMALL

.STACK 100h

.DATA

HelloMessage DB 'Hello World',13,10,'$'

.CODE

START:

mov ax,@data

mov ds,ax

mov ah,9

mov dx,OFFSET HelloMessage

int 21h

mov ah,4ch

int 21h

END START

Эта же программа на языке С++ будет выглядеть так:

#include <iostream>

int main()

{

std::cout << "Hello, World!" << std::endl;

return 0;

}

А с использованием языка python этаже программа займет всего 2 строчки:

#!/usr/bin/python

print 'Hello World!'

Но почему же нельзя обойтись каким-либо одним языком программирования?

В зависимости от решаемой задачи, языки программирования можно разделить на три основных группы:

  1. Неструктурное программирование – создание программы ведется под конкретную платформу. Такой код обладает повышенной скоростью исполнения за счет более быстрой компиляции кода в машинный код. Неструктурное программирование применяется, когда необходимо написать драйвер для какого-либо устройства, или запрограммировать микросхему[5].

В неструктурном программировании в основном используется Ассемблер.

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

Наиболее яркими представителями языков, применяемых в структурном программировании, являются такие языки как С, Pascal и Fortran.

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

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

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

Яркими представителями языков, используемых в функциональном программировании, являются List и Haskell, в логическом программировании – Prolog.

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

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

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

Наиболее известными языками объектно-ориентированного программирования являются С++, Delphi, Java, Python.

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

С помощью языков объектно-ориентированного программирования обычно реализуют сложные и объемные проекты.

Рассмотрев историю развития языков программирования, а также их основные направления, можно сделать вывод о том, что в процессе создания и последующей эволюции каждый язык программирования был направлен на решение задач в какой-то определенной области. Созданные ранее методы решения популярных задач, находили свою реализацию в библиотеках и классах, что позволило современным программистам не тратить время на «изобретение велосипеда». В рамках рассматриваемых вопросов вывод напрашивается сам собой – использование одного языка программирования невозможно из-за разнообразия возникающих перед программистом задач: невозможно написать на скриптовом языке JavaScript драйвер, например, для клавиатуры, так же как и невозможно написать обработчик нажатия виртуальной кнопки на Ассемблере или на Prolog.

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

1.2. Классификации языков программирования

Существуют сотни различных классификаций языков программирования. Однако к основным классификационным признакам следует отнести следующие: степень зависимости как от аппаратных средств, принципы программирования и ориентация на класс задач (рис. 2) [7].

Языки

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

машинно-ориентированные

(Ассемблер, внутренний язык ЭВМ)

Языки низкого уровня

проблемно-ориентированные,

предназначены для решения

определенного класса задач

(моделирования, экономические

и т.д.)

процедурно-ориентированные, универсальные, для научно-технических и др. задач

(С, Бейсик и Паскаль)

Языки

высокого уровня

Языки

низкого уровня

Рис. 2. Классификация языков программирования

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

Универсальные языки предназначены для решения широкого класса задач. До этих языков относят Pascal, С, C ++ и другие. Особым классом универсальных языков являются языки, реализованные в визуальных средах программирования (Visual Basic, Delphi и другие) [14].

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

По принципам программирования различают процедурные, непроцедурные языки и языки объектно-ориентированного программирования.

Процедурные языки построены на описании последовательной смены состояния компьютера, то есть значения ячеек памяти, состояния процессора и других устройств. Они манипулируют данным в пошаговом режиме, используя последовательное выполнение инструкций. В процедурных языках придерживаются четкой структуризации программ, поэтому их еще называют языки структурного программирования. Примерами таких языков является Алгол, Pascal, первые версии языка Basic [15].

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

Существует несколько парадигм (ключевых подходов), которые управляют конструированием программ. Первый подход считает программу моделью, ориентированной на процесс (process-oriented model). При этом программу определяют последовательности операторов ее кода.

Первые компиляторы (например, FORTRAN) поддерживали процедурную модель программирования, в основе которой лежит использование функций. Следующий этап развития связан с переходом к структурной модели программирования (к ней относятся компиляторы ALGOL, Pascal, C), в основе которого лежат следующие положения: программы представляются в виде совокупности взаимосвязанных процедур и данных, которыми эти процедуры (или блоки) оперируют. Здесь широко используются процедурные блоки и минимальное использование GOTO. Эти программы являются более простые. Такие языки программирования, как Pascal, C успешно используют эту модель. Но здесь часто возникают проблемы, когда растет размер и сложность программ. [2]

Другой подход, названный объектно-ориентированным программированием (ООП), был создано для управления возрастающей сложностью программ. ООП организует программу вокруг ее данных (т.е. вокруг объектов) и набора четко определенных интерфейсов с этими данными. Объектно-ориентированную программу можно характеризовать как доступ к коду, который управляется данными (data controlling access to data). Такой подход имеет некоторые организационные преимущества, а именно:

1. Можно повторно использовать код программы и таким образом экономить время на разработку;

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

3. Программы с использованием ООП легко тестировать и модифицировать. Можно разбить программу на компоненты и тестировать работу каждой из них. [1]

В современном программировании существует несколько подходов к программированию: структурное (детальное), модульное и объектно-ориентированное программирование.

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

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

Модульное программирование использует методологию, ориентированную на обработку. Его основные признаки:

- Каждый модуль реализует одну и только одну независимую функцию;

- Каждый модуль имеет единственную точку ввода-вывода;

- Размер модуля нужно минимизировать;

- Каждый модуль может быть записан на языке программирования разработчиком или программистом и может быть протестирован отдельно;

- Вся программа состоит из протестированных модулей и поэтому легко проверяется. [4]

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

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

Существует классификация, по которой языки и системы программирования по типам их парадигмы распределяют [3] на четыре разновидности:

  1. Директивные (directive), процедурные (procedural) или императивные (imperative);
  2. Структурные;
  3. Декларативные (declarative);
  4. Объектно-ориентированные (object-oriented).

2. Классификация языков программирования высокого уровня

2.1. Особенности языков программирования высокого уровня

Примерно в 50-е годы XX века появились языки программирования так называемого «высокого уровня» (high-level programming language).

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

Можно считать, что в этот период появились стиль, или парадигмы, программирования. Следующим шагом развития программ стало повышение их структурированности - структурный подход, при котором выделяли канонические структуры: линейные участки, циклы и ветвления [17].

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

Разработать программу - значит описать алгоритм на соответствующем языке программирования.

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

Язык программирования высокого уровня и система программирования играют роль посредника между человеком и компьютером [15].

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

- алфавит (аналогично алфавита обычной человеческой речи);

- символы арифметических и логических операций и некоторые специальные знаки;

- набор так называемых ключевых слов, которые нельзя изменять (например, begin, end, var, for)

- идентификаторы - комбинации символов для обозначения переменных, функций, файлов и других объектов (примеры: alfa, n32, sun_2, аи) [9].

Язык программирования высокого уровня имеет строгие правила записи команд (операторов) и данных. Совокупность таких правил создает синтаксис языка, а содержание каждой команды и других конструкций языка - его семантику.

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

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

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

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

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

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

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

- текстовый редактор для ввода и редактирования программ;

- редактор связей;

- транслятор (компилятор или интерпретатор).

Среда программирования содержат набор подпрограмм вычисления значений стандартных функций. Для объединения всех модулей программы в единый файл (такой файл называют файлом, выполняется) в средах программирования применяются редакторы связей, средства для отладки программ и другие составляющие [12].

Языки программирования высокого уровня делятся на определенные группы: процедурно-ориентированные языки, проблемно-ориентированные, объектно-ориентированные.

2.2. Процедурно-ориентированные языки программирования

Процедурно-ориентированные языки программирования начали появляться в 50 годах ХХ ст. Первый язык высокого уровня Фортран (FORTRAN - FORmula TRANslator) был создан в 1954 году.

Размер программ постоянно увеличивался, поэтому программисты начали объединять отдельные их части в подпрограммы, которые группировали в библиотеки. Библиотеки подключались к основной рабочей программе, которая при необходимости вызывала нужную подпрограмму. Фактически такой подход увеличил структурность программ - большая программа стала совокупностью процедур-подпрограмм. Одна подпрограмма, главная, начинала работу всей программы. То есть произошел переход к следующему этапу развития технологий - процедурного программирования. Процедурно–ориентированные языки, предназначенные для записи процедур или алгоритмов обработки информации для каждого определенного круга задач [11].

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

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

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

Кроме того, появление языков высокого уровня значительно уменьшила зависимость реализации от аппаратного обеспечения. Чтобы это реализовать, были созданы специализированные программы - трансляторы, предназначенные для преобразования инструкции языка программирования в коды определенной машины. Использование трансляторов привело к некоторой потере скорости вычислений, но этот недостаток компенсировался значительным выигрышем в скорости разработки и модификации программ [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-х гг. с одновременным ростом сложности решаемых задач и совершенствованием техники реализации компиляторов и интерпретаторов привели к значительному повышению эффективности решении задач именно с помощью языков высокого уровня.

2.4. Свойства объектно-ориентированных языков программирования

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

2.4.1. Абстракция и инкапсуляция

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

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

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

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

2.4.2. Наследование

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

В окружающем мире мы видим объекты, связанные между собой иерархически, например, животные, млекопитающие, собаки. Если мы хотим описать животных абстрактным образом, нам необходимо определить некоторые их атрибуты, например, размер, вес, пол, возраст и т.д. Животным также присуще определенное поведение – они едят, дышат, спят. Такое описание атрибутов и поведения и определяет класс животных.

Если мы захотим описать более специфический класс животных, такой как млекопитающие, они должны были бы иметь более специфические атрибуты, такие как тип зубов и молочные железы. Такой класс известен как подкласс животных, тогда как класс животных называют суперклассом (родительским классом, классом-предком). [5]

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

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

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

2.4.3. Полиморфизм

Полиморфизм (греч "polymorphos" – множественность форм) – свойство, которое позволяет использовать один интерфейс для общего класса действий. Специфическое действие точно определяется в зависимости от конкретной ситуации. Например, рассмотрим стек (список типа LIFO – Last-In, First-Out; последним вошел, первым вышел). Программа может потребовать три типа стеков. Один стек используется для целых чисел, второй – для чисел с плавающей точкой, третий – для символов. Алгоритм, реализующий каждый стек, один и тот же, хотя данные, хранящиеся разные. НЕ объектно-ориентированный язык требовала бы создание трех различных стековых подпрограмм, каждая из которых имела бы свое собственное имя. Благодаря полиморфизму можно определить общий для всех типов данных набор стековых подпрограмм, использующих одно и то же имя.

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

Итак, полиморфизм – это свойство кода вести себя по-разному в зависимости от ситуации, возникающей в момент исполнения. [7]

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

3. Обзор некоторых языков программирования высокого уровня

3.1. Язык программирования Basic

Язык Бейсик (Basic) разработали сотрудники Дартмутского колледжа (США) Томасом Курцем и Джоном Кемени в 1964 году с целью обучения студентов. Широкое признание он получил в конце 60-х в начале 70-х годов благодаря применению в малых компьютерах фирм General Electric, Hewlett-Packard, Digital Equipment Corporation и др. [2]

Название языка образовано из первых букв английских слов Beginner's All-purpose Sumbolic Instruction Code. В переводе это означает: «язык программирования для начинающих". Английское слово Basic переводится как элементарный, базовый (например, набор знаний). Первая версия языка насчитывала 14 служебных слов. [2]

Известны десятки версий языка: Дартмутская, Бейсик-Плюс, Бейсик-Агат, Бейсик-Корвет, GW-Бейсик, Турбо Бейсик (Turbo Basic), Быстрый Бейсик (Quick Basic), Power Basic и другие. Все версии имеют много общих элементов, ознакомившись с которыми, можно работать практически с любой версией, например, с GW-Бейсиком или Quick Бейсиком.

Возможности новейших версий (компиляторов, позволяющих создавать exe-файлы) Quick Бейсика и Турбо Бейсика настолько велики, что во многих случаях они успешно конкурируют с языком Паскаль. [7]

3.2. Языка программирования Java.

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

Проект Java созрел в недрах лабораторий Sun Microsystems в 1990-х годах. Его рождение связано с проблемой несовместимости программного обеспечения для разных платформ (DOS, Windows, Unix, Macintosh), а также с появлением и стремительным распространением World Wide Web. В 1991 г. несколько работников Sun (Patrick Naughton, James Gosling, Mike Sheridan) образовали ядро группы, которой поручили создание программной технологии, которая бы была уникальной и имела неоспоримые перспективы. Первоначальное название проекта – Oak. Через несколько лет, после проведения маркетинговых исследований, проект был переименован в Java. С тех пор символом этого языка программирования и платформы в целом является логотип с чашкой горячего кофе (рис. 1). [3]

Рис.1. Символ языка программирования Java.

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

Первым примером Java-приложений стали апплеты, которые запускались в окне специально созданного браузера WebRunner, позже переименованного в HotJava.

23 мая 1995 г. Java и HotJava был официально представлен Sun. Была предложена концепция платформы, документацию и инструментальный пакет для разработчиков JDK – Java Development Kit. [4]

В декабре 1995 г.. Компании Sun и Netscape (разработчик популярного в то время браузера Netscape Navigator) презентует язык Java Script – язык сценариев, который расширяет HTML и является частью кода веб-страницы. Ее назначение – расширение функциональности и интерактивности работы в браузере. Заметим, что Java и JavaScript – разные языки, с разным позиционированием и возможностями.

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

В 2009 году Sun Microsystems была поглощена софтверным гигантом Oracle, под эгидой которого осуществляется дальнейшее развитие Java-платформы. [5]

Язык Java – это объектно-ориентированный язык программирования, который ведет свою историю от известного языка C ++. Но, в отличие от последнего, Java является языком, который интерпретируется. Программы, написанные на ней, способны работать в разных местах сети и не зависят от платформы, на которой выполняются написанные на ней приложения. Java сознательно избегает арифметики с указателями и другими ненадежными элементами, которыми изобилует C.

Для отладки программ на языке Java подойдет любой из пакетов: Microsoft Visual J ++, Symantec Cafe, Java Add-On из состава Borland C ++ или Sun Java WorkShop. Если есть желание пользоваться командными файлами, то можно загрузить с Web-сервера "родной" вариант компилятора Java – Java Development Kit (JDK). [9]

В терминах языка Java маленькое приложение, встраиваемое в страницу Web, называется апплетом. Собственно говоря, создание апплетов – основное применение для Java. Апплеты снискали себе звание подлинных украшений для Web. Апплет может быть и окном анимации, и электронной таблицей, и всем, что только можно себе представить. Но это не значит, что на Java нельзя писать нормальные приложения с окнами. Этот язык программирования изначально была создан для обычных приложений, выполняющихся в Internet и в интрасети, и уже потом стал использоваться для изготовления апплетов.

Создание различных программ осуществляется с помощью различных сред программирования. На сегодняшний день язык Java наиболее широко используется современными разработчиками, поскольку Java имеет ряд преимуществ, выделяющих ее среди других языков: независимость от платформы, на которой выполняются программы; один и тот же код можно запускать под управлением различных операционных систем, например, Windows, Linux, FreeBSD, Solaris, Apple Mac и др.

Заключение

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

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

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

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

Сегодня насчитывают несколько тысяч различных языков программирования и их модификаций, однако лишь некоторые из них получили широкое признание. На разных этапах развития ЭВМ популярными были такие языки программирования: Фортран, Кобол, Алгол-60, ПЛ-1, Алгол-68, АДА, С, Бейсик, Pascal, Prolog, Delphi и другие. Наиболее популярные сейчас языки программирования: C ++, C # и Java, Python.

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

Языки программирования высокого уровня делятся на определенные группы: процедурно-ориентированные языки, проблемно-ориентированные, объектно-ориентированные.

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

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

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

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

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

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

Список литературы

  1. Альфред В. Ахо, Джон Э. Хопкрофт, Джеффри Д. Ульман Структуры данных и алгоритмы: — Санкт-Петербург, Вильямс, 2012 г.- 400с.
  2. Ахметов И.Г. Программирование для студентов и школьников на примере Small Basic. СПб.: БХВ-Петербург, 2012. — 160 с.
  3. Бахирев А. Сюрреализм на JavaScript СПб.: СИНЭЛ, 2014. — 228 с.
  4. Блох Дж. Java. Эффективное программирование. Лори, 2014. 2-е издание – 460 с.
  5. Бойченко Л.П. Практикум по программированию в среде Visual Basic (примеры решения задач). Учебное пособие. — Ухта: УГТУ, 2010. — 162 с.
  6. Головин И.Г., Баева Н.В. Языки управления приложениями. Учебно-методическое пособие. – М.: Издательский отдел факультета ВМиК МГУ имени М.В. Ломоносова; МАКС Пресс, 2015. – 96 с.
  7. Грошев А.С. Информатика. Лабораторный практикум. Арханг. гос. техн. ун-т, 2012. - 148 с.
  8. Зикратов И.А., Косовцев В.В., Петров В.Ю. Разработка и стандартизация программных средств и информационных технологий. Учебное пособие. — СПб.: СПбГУ ИТМО, 2010. — 91 с.
  9. Караванова Т.П, Основы алгоритмизации и программирования: Пособие. - К.: Форум, 2011. – с.289
  10. Медведев В.И. Особенности объектно-ориентированного программирования на C++/CLI, C# и Java 2-е изд., испр. и доп. – Казань: РИЦ «Школа», 2010.-444 c.
  11. Нимейер П., Леук Д. Программирование на Java. М.: Эксмо, 2014. — 1216 с.
  12. Робертсон Л. А. Программирование - это просто. Пошаговый подход:— Москва, Бином. Лаборатория знаний, 2010 г.- 384 с.
  13. Сальников Ю. Н. Программирование. Базовый курс: — Москва, 2010 г.- 336 с.
  14. Свердлов С.З. Языки программирования и методы трансляции: учеб. пособие/ С.З. Свердлов. – СПб.: Питер, 2007. – 638 с.
  15. Семенов М.В. Информатика. - Ростов н/Д: Феникс, 2011. – 288с.
  16. Шилдт Г. Java 8. Полное руководство 9-е полное издание. — М.: Вильямс, 2015. — 1377 с.
  17. Классификация языков программирования [Электронный ресурс] / URL: Программирование на высоком уровне, http://www.excode.ru/art6213p1.html
  18. Классификация языков программирования [Электронный ресурс]. URL: http://bourabai.ru/alg/classification.htm
  19. Эволюция языков программирования [Электронный ресурс]. URL: http://www.urtt.ru/bib/dataindex/oaip/lection/_html/lect_05.htm
  20. Язык программирования. Эволюция языков программирования [Электронный ресурс]. URL: http://wiki.mvtom.ru/index.php/Язык_программирования
  21. Языки программирования и их классификация [Электронный ресурс]. URL: http://www.maksakov-sa.ru/ProgrProd/YazProgr/index.html