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

Классификация языков программирования высокого уровня (Понятие о языках программирования)

Содержание:

Введение

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

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

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

Достижение указанной цели определило постановку и решение следующих задач:

  • исследовать понятие языков программирования;
  • провести анализ языков программирования высокого уровня;
  • рассмотреть подходы к эффективности использования памяти в языках программирования высокого уровня.

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

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

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

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

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

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

1.1. Понятие о языках программирования

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

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

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

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

История языков программирования берет свое начало с разработки машинного языка. Язык включает в себя логические нули и единицы. Код, написанный на этом языке, был достаточно сложный и утомительный. Это привело к созданию языка программирования Ассемблер. Он был создан в конце 40-ч годов, чтобы облегчить работу первым программистам. Записи представляли собой не двоичные цифры, обозначающие какую-то команду, а короткие слова или аббревиатуры. Ассемблер, по мнению программистов, является языком низкого уровня, поскольку он близок к машинному языку – языку программирования самого низкого уровня. Также его называют машинно-ориентированный язык, потому что программы, написанные на языке программирования Ассемблер, сильно зависимы от характеристик конкретного процессора[2]. В связи с тем, что написание программ на языке программирования Ассемблер представляет собой достаточно сложный процесс, и, несмотря на то, что также необходимо отлично знать устройство компьютера, но программы, которые написаны на языке программирования Ассемблер, можно назвать самыми эффективными и работоспособными.

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

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

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

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

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

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

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

В 1954 году начали разрабатывать первый компилятор языка высокого уровня. После двух лет разработок был создан язык программирования Fortran. В языке имелись средства, которые значительно упрощали разработку, однако написание кода на языке программирования Fortran представляло собой достаточно сложную задачу: если в коротких программах он легко понимался, когда дело касалось больших программ, данный язык программирования становился абсолютно нечитаемым. Даже, несмотря на это язык программирования Fortran был очень успешен, и команда разработчиков выпустила много его версий[3].

Изначально все корни Python растут из процедурного структурного и высокоуровневого языка ABC, что задумывался как платформа-язык обучения программированию, по подобию языков Pascal и Бейсик. В разработке же языка ABC и принимал участие родоначальник и создатель языка Python – Гвидо Ван Россум (Guido Van Rossum), которому хотелось придумать не только простой и понятный язык, как ABC, который никак не использовался, кроме как в обучении начинающих программистов, но, и чтобы он был полезен для множества различных людей.

Создание Python началась в декабре 1989 года в центре математики и информатики в Нидерландах, хотя это и не совсем верно, так по словам самого Гвидо Ван Россума «… в декабре 1989 я был в поисках проекта-хобби по программированию, что занял бы меня в течение недели Рождественских каникул. Мой офис был закрыт, но у меня дома был компьютер, и ничего более». Так что, исходя из его слов, можно считать, что начало Python было заложено в уютной, домашней и рождественской обстановке[4].

Хотя сам Гвидо Ван Россум и задумал Python ещё в начале 1980-х, но кто знает, что было бы с Python и был бы он таким, каким мы видим его сейчас, если бы не его «моральный» предшественник ABC…? Практически Python создавался, как попытка исправить ошибки, допущенные при проектировании ABC.

Основными источниками вдохновения при создании Python было множество языков программирования[5]:

  • ABC – использование отступов, вместо скобочек, для группировки операторов и относительная простота и лёгкость понимания кода.
  • Modula-3 – первый язык, использовавший конструкцию исключений try и except, и подаривший её не только Python, но и такому языку как Java. Так же Python унаследовал от Modula-3 систему модулей и пакетов, хотя сама Modula-3 была не первым языком, в котором применялись модули.
  • C, C++ - некоторые синтаксические конструкции. По словам самого Гвидо Ван Россума – он постарался выбрать самые непротиворечивые и логичные конструкции из C, чтобы не вызвать неприязнь C-программистов к Python.
  • Lisp – отдельные черты функционального программирования.

Создание языков структурного программирования привело к появлению программных блоков, независимых подпрограмм, поддержки рекурсии и локальных переменных, отсутствие оператора безусловного перехода. Примерно в 60-ых г.г. был создан один из предшественников язык программирования C#, язык программирования B, который разрабатывал коллектив разработчиков из Технологического института Массачусетса. Главный автор языка программирования B – Кен Томпсон. Тогда команда работала над операционной системой UNIX. Уже существовавший язык программирования PL/I, который применялся в то время для мэйнфреймов производства компании IBM, был достаточно громоздким и меньше подходил для поставленной задачи.

Поэтому ученые решили создать новый язык, который и получил название язык программирования B. Он является типичным представителем ранних императивных языков программирования. В 1972 г после языка программирования B появился язык программирования C – это был очень успешный шаг. Основой для нового языка послужил сам язык программирования B. Язык программирования C включал в себя достижения многих языков, а также имел большое количество различных нововведений.

Также, язык программирования С обладал широкими возможностями, структурированностью, и относительной простотой изучения, совокупность всех этих факторов позволило ему с большой скоростью завоевывать признание и стать одним из основных языков программирования. Создателями языка программирования C были Кен Томпсон и Денис Ритчи, которые работали в исследовательской лаборатории компании AT&T.

В 1971 году Ритчи начал создавать расширенную версию языка программирования B. Сначала он назвал её NB (New B), но когда язык стал сильно отличаться от языка программирования B, название сменили на язык программирования C. Язык программирования B расширился за счет того, что в нем явно использовалось типы, структуры и ряд новых операций. По поводу возникновения языка программирования С Питер Мойлан в своей книге «The case against C» писал: «Нужен был язык, способный обойти некоторые жесткие правила, встроенные в большинство языков высокого уровня и обеспечивающие их надежность. Нужен был такой язык, который позволил бы делать то, что до него можно было реализовать только на ассемблере или на уровне машинного кода».

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

1.2. Анализ объектно-ориентированных языков программирования

Первым объектно-ориентированным языком программирования был Simula 67, разработанный в Норвегии в конце 60-х годов. Авторы данного языка очень точно предвидели перспективы развития программирования: язык программирования Simula намного опередил свое время. Однако его не сразу оценили по достоинству современники (программисты 60-х годов). Они оказались не готовы воспринять ценности языка Simula 67, и он не выдержал конкуренции с другими языками программирования (прежде всего, с языком Fortran). Также огромным недостатком на тот момент показалось то, что данный язык был реализован как интерпретируемый (а не компилируемый), что было совершенно неприемлемым в 60-е годы, поскольку это означало снижение эффективности, то есть скорости выполнения программ.

Однако уже в 70-е годы некоторые программисты заметили достоинства языка Simula 67, и поэтому были разработаны различные экспериментальные объектно-ориентированные языки программирования, такие как: языки CLU, Alphard, Concurrent Pascal и др[6]. Данные языки так и остались экспериментальными, однако в результате их исследования были разработаны современные объектно-ориентированные языки программирования, сведения о которых приводятся ниже. Язык Smalltalk был разработан командой Xerox Palo Alto Research Center Learning Research Group как программная часть Dynabook – фантастического проекта Алана Кея. В основу данного языка были положены идеи Simula. Smalltalk является не только языком программирования, но в то же время и средой разработки программ.

Smalltalk полностью объектно-ориентированный язык, в котором абсолютно все рассматривается как объекты (даже целые числа – это классы)[7]. После Simula, Smalltalk стал важнейшим объектно-ориентированным языком, который не только повлиял на последующие поколения языков программирования, но также заложил основы современного графического интерфейса пользователя, на которых непосредственно базируются интерфейсы Macintosh, Windows и Motif.

В основу языка Smalltalk были положены две простые идеи:

1. Всё является объектами.

2. Объекты взаимодействуют между собой, обмениваясь сообщениями.

Microsoft Visual C++. Язык программирования C++ разработан сотрудником AT&T Bell Laboratories, Бьерном Страустрапом[8]. Ранние версии языка С++, известные под названием «С with Classes», начали появляться с 1980 года. Язык создавался под сильным влиянием С и Simula. В значительной степени С++ является надстройкой над С. В какой-то степени С++ – это улучшенный язык С, обеспечивающий контроль типов, перегрузку функций и другие полезные свойства. Однако главным критерием остаётся то, что С++ дополняет С объектной ориентированностью.

Достоинства:

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

Недостатки:

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

Язык программирования Visual Basic разрабатывается корпорацией Microsoft, а также широко используется для интеграции офисных пакетов и различных типов СУБД[9].

Достоинства:

  • простота;
  • хорошая среда разработки;
  • позволяет работать с СУБД;
  • возможность создания Web-страницы совместно с HTML и ASP;
  • выполнение функции системного интегратора.

Недостатки:

невысокая скорость выполнения приложений;

отсутствует возможность создания компонентов.

Delphi – это мощный и универсальный язык программирования для быстрой разработки приложений (RAD).

Достоинства:

  • быстрый, простой и эффективный язык;
  • один из самых быстрых компиляторов, который порождает хороший объектный код;
  • программы не требуется снабжать дополнительными библиотеками (в отличие от связки C++/MFC)
  • существует возможность пользоваться компонентами, написанными другими разработчиками, даже не имея при этом их исходного кода.

Недостатки:

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

Java. Примерно в 1995 году широкое распространение получил новый объектно-ориентированный язык программирования Java, ориентированный на сети компьютеров и в первую очередь на Internet. Синтаксис данного языка похож на синтаксис C++, однако, несмотря на это, в остальном языки отличаются. Java является интерпретируемым на конечной стадии языком: для него определены внутреннее представление, то есть прекомпиляция в байткод (bytecode), и постинтерпретатор этого представления на целевой машине, реализованные уже сегодня на большинстве платформ[10].

Положительные свойства технологии Java разрешают использовать ее для программ, которые распространены по сетям. Достоинства:

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

Недостатки:

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

C# (C Sharp). Один из самых распространённых на сегодняшний день объектно-ориентированных языков программирования. Был разработан группой инженеров под руководством Андерса Хейлсберга в 1998– 2001 годах в компании Microsoft как основной язык разработки приложений для платформы Microsoft .NET[11].

C# поддерживает все основные принципы объектно-ориентированного программирования: инкапсуляцию, наследование и полиморфизм. Кроме этого, в данном языке реализована автоматическая «сборка мусора», обработки исключений, а также динамическое связывание. Сегодня, язык программирования C# считается одним из самых мощных, быстро развивающихся и востребованных языков в IT-сфере.

Достоинства:

  • ориентирован на безопасность кода (в сравнении с С и С++);  система типизации является унифицированной;
  • компонентно-ориентированный подход к программированию способствует меньшей машинно-архитектурной зависимости результирующего программного кода, гибкости, переносимости и легкости повторного использования (фрагментов) программ;
  • язык программирования C# претендует на подлинную объектную ориентированность (всякая языковая сущность претендует на то, чтобы быть объектом);
  • расширенная поддержка событийно-ориентированного программирования.

Недостатки:

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

Поскольку С# разработан компанией Microsoft, то работает он только под ОС Windows, однако уже разрабатывается кроссплатформенная версия данного языка.

Visual Basic .NET (VB.NET) – это объектно-ориентированный язык программирования, который реализован на платформе .NET [5], рассматривающийся как очередной виток эволюции Visual Basic (VB). Основным отличием от «классического» VB является то, что VB.NET – полностью объектно-ориентированный язык, поддерживающий полиморфизм, наследование и другие основные принципы ООП.

Достоинства:

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

Недостатки:

  • поддерживает операционные системы Windows и Mac OS;
  • невысокая скорость работы.

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

Глава 2. Анализ языков программирования высокого уровня

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

Прежде всего, языки программирования нужно классифицировать по уровням. Разные авторы разбивают языки либо на три уровня (машинные, машинно-ориентированные и машинно-независимые языки), либо на два уровня (языки программирования низкого уровня, языки программирования высокого уровня)[12].

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

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

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

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

В современной классификации языков программирования по уровням всё чаще используют деление на два уровня: языки высокого и низкого уровней. Языками низкого уровня считаются языки, близкие к машинному коду и ориентированные на конкретные команды процессора, то есть машинно-ориентированные языки, а языками высокого уровня в современной классификации считаются машинно-независимые языки, разработанные для удобства использования[13].

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

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

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

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

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

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

А вот с классификацией языков четвёртого и пятого поколений ситуация не так проста. К языкам программирования четвёртого поколения чаще всего относят языки объектно-ориентированные, декларативные (непроцедурные) и визуальные. Но эти языки с уверенностью можно отнести и к языкам третьего поколения. Также очень часто сюда относят языки запросов, например, SQL, который, по своей сути, вовсе не является языком программирования. Вообще, часто можно прочитать о том, что языки программирования четвёртого поколения – это языки, встроенные в определённую программную оболочку и используемые для узкоспециализированных задач, например, для создания баз данных и управления ими (встроенные языки систем управления базами данных). Получается, вернее всего сказать, что языки программирования четвёртого поколения – логичное развитие языков третьего поколения, упрощающее работу программистов ввиду того, что в основе своей эти языки встроены в собственную программную оболочку с функциями, помогающими разработчикам. Также к языкам четвёртого поколения нужно отнести языки параллельного программирования, ориентированные на создание программных средств многопроцессорной архитектуры[15].

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

Далее, рассмотрим классификацию языки программирования по функциональному признаку, или парадигме программирования. Парадигма – совокупность идей и понятий, определяющих подход к программированию. Большинство авторов даёт чёткое разделение языков программирования на процедурные (императивные) и непроцедурные (декларативные). Класс непроцедурных языков содержит в себе два подкласса: функциональные и логические языки. Часто отдельным классом выделяют объектно-ориентированные языки программирования, хотя они содержат элементы процедурного программирования. Остановимся на каждом классе поподробнее[16].

В процедурных языках программа явно описывает необходимые к выполнению действия, то есть она является чёткой последовательностью команд, которые необходимо выполнить компьютеру. Можно сказать, что, программируя на этих языках, программист говорит компьютеру, не что делать, а как. К этому классу можно отнести большинство языков программирования: Pascal, Basic, C и другие.

Непроцедурные языки можно запросто назвать противоположностью языкам процедурным. Декларативное программирование – парадигма программирования, в которой описывается, что необходимо сделать компьютеру. Хорошим примером служит язык разметки HTML, возьмём тег <img>: необходимо просто заключить в него ссылку на изображение, а каким образом оно отобразится на странице – это задача компьютера.

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

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

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

2.2. Сравнительный анализ языков программирования

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

Однако, стоит заметить, что для разработки подобных систем необходимо знание нескольких языков программирования, которые в совокупности позволяют создавать именно то, что необходимо будущим пользователям. Поэтому проблема выбора языка программирования и среды разработки является актуальной, так как именно от этого зависит будущий функционал разработанного программного продукта, его работоспособность и эффективность в целом. Необходимо отметить, что существует огромное количество различных языков программирования, таких как: Java, C, C++, Python, C#, JavaScript, Visual Basic.NET, Ruby, PHP, Perl и т.д. Это далеко не весь перечень языков, которые могут использоваться для разработки интернет-приложений. По данным исследования TIOBE Index for November 2018 они считаются наиболее востребованными.

Рейтинг языков программирования на 2018 год представлена на рисунке 3[17].

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

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

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

В таблице 1 представлена сравнительная характеристика рассматриваемых языков программирования, применяемых для разработки различных приложений[18].

Таблица 1

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

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

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

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

С# – еще один объектно-ориентированный язык с синтаксисом языка Си. Позволяет разрабатывать простые приложения и программы, которые выполняются в среде .NET Framework. C# в отличие от C++ и некоторых других языков, не поддерживает множественное наследование классов (между тем допускается множественное наследование интерфейсов).

JavaScript – универсальный динамический язык, который применяется к HTML документу, и может обеспечить динамическую интерактивность на веб-сайтах, в основном используется в веб-разработке. Очень гибкий и компактный. Схож с Java и Cи, обладает широким функционалом и простой в изучении.

Visual Basic.NET – гибкий объектно-ориентированный язык программирования, позволяющий разрабатывать крупные приложения. Поддерживает ряд языков VB.NET, C#, C++ и является кроссплатформенным. Позволяет разработчикам создавать приложения Windows, веб-приложения и приложения для мобильных устройств. Программы, написанные на языке Visual Basic, как и на других языках, предназначенных для платформы Microsoft .NET Framework. Ruby – динамический язык с простым синтаксисом, который был создан из других языков и объединил функциональную и императивную парадигму программирования. Является достаточно сложным языком в изучении, несмотря на то, что обладает простым синтаксисом. Схож с Java и Python. Есть возможность написания расширений на Си, что значительней проще чем в Perl или Python. Отличается высокой скоростью разработки.

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

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

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

Дать однозначной ответ на вопрос «Какой язык программирования лучше?» практически невозможно, так как ни один язык нельзя назвать лучшим по сравнению с другим.

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

Глава 3. Подходы к эффективности использования памяти в языках программирования высокого уровня

Жизнь современного человека невозможно представить без телефона, компьютера и прочих гаджетов, которые упрощают существование человека и делают его более комфортным. Однако активное использование человеком современных устройств влечет за собой проблему хранения и обработки информации. В связи с этим растут требования как к техническим, так и к программным требованиям устройств. Работа с памятью одна из самых сложных задач в программировании, а понимание устройства памяти компьютера даёт возможность разрабатывать наиболее эффективные программы. Для эффективного использования памяти в данной работе рассмотрены принципы работы с памятью на примере языка C++.

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

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

Автоматическую память часто называют стеком[19]. Как структура данных, стек работает по принципу–LIFO (Last In First Out), то есть первым извлекается элемент, пришедший последним. Автоматическая память имеет ряд недостатков, которые с успехом решает динамическая память. Динамическая память используется, вопервых, при нехватке единоразово выделенной автоматической или статической памяти, во-вторых, если модель LIFO не соответствует требовани ям программы. Динамическая память – это оперативная память компьютера, предоставляемая программе при ее работе, ее также называют кучей (heap). Динамическое размещение данных означает использование динамической памяти при работе программы[20].

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

Первая заключается в том, что любое выделение или освобождение памяти в ОС является системным вызовом, замедляющим работу программы. В языке C++ используются умные указатели и RAII. Управление динамической памятью является важнейшей стороной программирования на C++. Работая с динамической памятью, разработчик вплотную сталкивается с указателями, понимание природы которых позволяет избежать огромного количества ошибок. Как написал Джоэл Спольски в своей книге: «Указатели и рекурсия требуют определённых способностей к рассуждению и абстрактному мышлению, а главное – умения рассматривать проблему на нескольких уровнях абстракции одновременно. Поэтому способность разобраться в указателях и рекурсии непосредственно связана с перспективой стать выдающимся программистом»[21].

О нетривиальных подходах к управлению памятью, написании собственных диспетчеров памяти для нестандартного размещения объектов конкретных классов, а также об умных, мудрых, гениальных, ведущих и невидимых указателях можно почитать в книге Джеффа Элджера «C++: библиотека программиста»[22], содержание которой более точно отражает английский вариант названия «C++ for Real Programmers».

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

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

Пример использования памяти C++. Над множествами можно производить основные математические операции, такие как пересечение, объединение , разность, и симметрическая разность. Каждый из алгоритмов будет проиллюстрирован отдельно. Множества представлены в виде односвязных список, то есть в виде структуры данных, представляющей собой последовательность элементов, в которых хранится значение и указатель на следующий элемент списка[23].

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

Функция add добавляет элемент в множество, функция getSize возвращает номер последнего элемента, функция getValue возвращает значение элемента по указанному номеру, функция deleteList удаляет список.

Функция intersection: возвращает множество, полученное операцией пересечения двух указанных множеств.

List *intersection(List *headA, List *headB, List *headC)

{int a = 0, b = 0;

for (int i = 1; i <= getSize(headA); i++)

{ a = getValue(headA, i);

for (int j = 1; j <= getSize(headB); j++)

{ b = getValue(headB, j);

if (a == b) {

headC = add(headC, a);}}}

return headC;}

Функция Join: возвращает множество, полученное операцией объединения двух указанных множеств.

List *Join(List *headA, List *headB, List *headM)

{if (getSize(headA) > getSize(headB))

headM = headB;

else headM = headA;

int a = 0, d = 0;

bool multi=true;

for (int i = 1; i <= getSize(headA); i++)

{a = getValue(headA, i);

for (int j = 1; j <= getSize(headM); j++)

{d = getValue(headM, j);

if (a != d) multi = true;

else { multi = false;

break;}}

if (multi) headM = add(headM,a);}

return headM;}

Функция difference: возвращает множество, полученное операцией разности двух указанных множеств.

List *difference(List *headA, List *headB, List *headD)

{ int a = 0, d = 0;

bool multi = true;

for (int i = 1; i <= getSize(headA); i++)

{ a = getValue(headA, i);

for (int j = 1; j <= getSize(headB); j++)

{ d = getValue(headB, j);

if (a == d) {

multi = false; break; }

else multi = true;}

if (multi) headD = add(headD, a);}

return headD;}

Функция sumDifference: возвращает множество, полученное операцией симметрической разности двух указанных множеств.

List *sumDifference(List *headA, List *headB, List *headS)

{ List *temp_A = NULL;

List *temp_B = NULL;

temp_A = difference(headA, headB, temp_A);

temp_B = difference(headB, headA, temp_B);

headS = Join(temp_A, temp_B, headS);

return headS;}

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

Заключение

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

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

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

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

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

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

Александреску, А. Язык программирования D / А. Александреску. - СПб.: Символ-плюс, 2014. - 544 c.

История развития языков программирования. – http://softcreate.narod.ru.дата доступа (14.05.2019)

Классификация языков программирования [Электронный ресурс]. URL:http://bourabai.ru/alg/classification.htm дата доступа (14.08.2018)

Костарев А.Н. Размещение объектов в оперативной памяти. Понятие указателя / RSDN Magazine. – 2010. – №2. – С. 25 - 32.

Коэльё Л. П., Ричерт В. Построение систем машинного обучения на языке Python. — Перевод с английского. — М.: ДМК Пресс, 2015.

Маккинли У. Python и анализ данных. — Перевод с английского. — М.: ДМК Пресс, 2015. — 482 с.

Объектно-ориентированные языки программирования [Электронный ресурс] // Vuzlit.ru: архив студенческих работ. – Режим доступа: https://vuzlit.ru/1021735/smalltalk.

ООП. Объектно-ориентированные языки программирования [Электронный ресурс] // Bourabai Research: официальный вебсайт частного Боровского исследовательского учреждения по внедрению новых технологий. – Режим доступа: http://bourabai.ru/ alg/oop11.htm.

Особенности объектно-ориентированных языков программирования [Электронный ресурс] // Kopilkaurokov.ru: сайт для учителей. – Режим доступа: https://kopilkaurokov.ru/informatika/prochee/ osobiennosti_obiektno_oriientirovannykh_iazykov_ proghrammirovaniia.

Пять поколений языков программирования [Электронный ресурс]. URL: http://life-prog.ru/view_zam2.php?id=194&cat=5&page=11 дата доступа (14.05.2019)

Спольски Дж. Джоэл И снова о программировании; пер. с англ. — СПб.: СимволПлюс, 2009. — 320 с.

Сравнение языков программирования. Википедия. URL: https://ru.wikipedia.org/ wiki/Сравнение_языков_программирования (дата обращения: 14.05.2019).

Элджер Дж. С++: библиотека программиста; пер. с англ. — СПб.: Питер, 2000. — 320 с.

Язык программирования C# [Электронный ресурс] // Bourabai Research: официальный веб-сайт частного Боровского исследовательского учреждения по внедрению новых технологий. – Режим доступа: http://bourabai.ru/alg/c-sharp.htm.

Язык программирования. Эволюция языков программирования [Электронный ресурс]. URL:http://wiki.mvtom.ru/index.php/Язык_программирования дата доступа (14.05.2019)

Языки программирования и их классификация [Электронный ресурс]. URL:http://www.maksakov-sa.ru/ProgrProd/YazProgr/index.html дата доступа (14.05.2019)

INTUIT, [Электронный ресурс]. Режим доступа : https: // www.intuit.ru / studies / courses / 627 / 483 / lecture / 10960

TIOBE Index for November 2018. URL: https://www.tiobe.com/tiobe-index/ (дата обращения: 15.05.2019).

  1. Александреску, А. Язык программирования D / А. Александреску. - СПб.: Символ-плюс, 2014. - 544 c.

  2. История развития языков программирования. – http://softcreate.narod.ru.дата доступа (14.05.2019)

  3. История развития языков программирования. – http://softcreate.narod.ru.дата доступа (14.05.2019)

  4. Коэльё Л. П., Ричерт В. Построение систем машинного обучения на языке Python. — Перевод с английского. — М.: ДМК Пресс, 2015.

  5. Маккинли У. Python и анализ данных. — Перевод с английского. — М.: ДМК Пресс, 2015. — 482 с.

  6. ООП. Объектно-ориентированные языки программирования [Электронный ресурс] // Bourabai Research: официальный вебсайт частного Боровского исследовательского учреждения по внедрению новых технологий. – Режим доступа: http://bourabai.ru/ alg/oop11.htm.

  7. Объектно-ориентированные языки программирования [Электронный ресурс] // Vuzlit.ru: архив студенческих работ. – Режим доступа: https://vuzlit.ru/1021735/smalltalk.

  8. Особенности объектно-ориентированных языков программирования [Электронный ресурс] // Kopilkaurokov.ru: сайт для учителей. – Режим доступа: https://kopilkaurokov.ru/informatika/prochee/ osobiennosti_obiektno_oriientirovannykh_iazykov_ proghrammirovaniia.

  9. Особенности объектно-ориентированных языков программирования [Электронный ресурс] // Kopilkaurokov.ru: сайт для учителей. – Режим доступа: https://kopilkaurokov.ru/informatika/prochee/ osobiennosti_obiektno_oriientirovannykh_iazykov_ proghrammirovaniia.

  10. Особенности объектно-ориентированных языков программирования [Электронный ресурс] // Kopilkaurokov.ru: сайт для учителей. – Режим доступа: https://kopilkaurokov.ru/informatika/prochee/ osobiennosti_obiektno_oriientirovannykh_iazykov_ proghrammirovaniia.

  11. Язык программирования C# [Электронный ресурс] // Bourabai Research: официальный веб-сайт частного Боровского исследовательского учреждения по внедрению новых технологий. – Режим доступа: http://bourabai.ru/alg/c-sharp.htm.

  12. Классификация языков программирования [Электронный ресурс]. URL:http://bourabai.ru/alg/classification.htm дата доступа (14.08.2018)

  13. Языки программирования и их классификация [Электронный ресурс]. URL:http://www.maksakov-sa.ru/ProgrProd/YazProgr/index.html дата доступа (14.05.2019)

  14. Пять поколений языков программирования [Электронный ресурс]. URL: http://life-prog.ru/view_zam2.php?id=194&cat=5&page=11 дата доступа (14.05.2019)

  15. Пять поколений языков программирования [Электронный ресурс]. URL: http://life-prog.ru/view_zam2.php?id=194&cat=5&page=11 дата доступа (14.05.2019)

  16. Язык программирования. Эволюция языков программирования [Электронный ресурс]. URL:http://wiki.mvtom.ru/index.php/Язык_программирования дата доступа (14.08.2018)

  17. TIOBE Index for November 2018. URL: https://www.tiobe.com/tiobe-index/ (дата обращения: 15.05.2019).

  18. Сравнение языков программирования. Википедия. URL: https://ru.wikipedia.org/ wiki/Сравнение_языков_программирования (дата обращения: 14.05.2019).

  19. Костарев А.Н. Размещение объектов в оперативной памяти. Понятие указателя / RSDN Magazine. – 2010. – №2. – С. 25 - 32.

  20. INTUIT, [Электронный ресурс]. Режим доступа : https: // www.intuit.ru / studies / courses / 627 / 483 / lecture / 10960

  21. Спольски Дж. Джоэл И снова о программировании; пер. с англ. — СПб.: СимволПлюс, 2009. — 320 с.

  22. Элджер Дж. С++: библиотека программиста; пер. с англ. — СПб.: Питер, 2000. — 320 с.

  23. INTUIT, [Электронный ресурс]. Режим доступа : https: // www.intuit.ru / studies / courses / 627 / 483 / lecture / 10960 3