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

Современные языки программирования (Краткая история языков программирования)

Содержание:

ВВЕДЕНИЕ

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

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

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

В ходе данной работы использовался ряд русскоязычных и англоязычных источников. К последним относится, прежде всего, «Encyclopedia of Computer Science and Technology», предоставляющая в форме кратких энциклопедических статей информацию обо всех основных объектах, изучаемых современным программированием, а также справки о компьютерных языках и истории их развития. Данное издание, дополненное и исправленное, выпущено в 2009 году, и на сегодняшний день остается одним из наиболее цитируемых источником энциклопедических справок по теме компьютерных технологий. Одним из критериев надежности «Энциклопедии» Хендерсона являются обширные списки дополнительной литературы, указанные к каждой статье, в т.ч. научные монографии, публикации в прессе, и др.

Одним из основных источников для написания данной работы было 5-е издание «Основные концепции языков программирования», автор – профессор Р. Себеста (Университет Колорадо-Спрингс). Это многократно переиздаваемый бестселлер тематики изучения компьютерных языков, отличайющийся глубоким аналитическим подходом автора к истории и развитию языков программирования; несмотря на то, что используемый в данной работе перевод «Основных концепций» основан не на последнем на сегодняшний день издании (существует уже 9-е издание), в книге приведен анализ всех основных парадигм программирования, сопровождаемый убедительным инструментарием.

Информация, почерпнутая в работе Р. Себесты, была проанализирована с помощью ряда учебной литературы – учебника «Теория и практика языков программирования» С.А. Орлова, рекомендованного Санкт-Петербургским институтом информатики и автоматизации Российской Академии Наук (опубликован в 2014 году); книги американских специалистов Т. Пратта и М. Зелковица «Языки программирования: разработка и реализация» (использован опубликованный в 2002 году русскоязычный перевод 4-го издания книги), а также публикация 1980 года классического труда Д. Баррона, представляющий интересный для изучения взгляд на развитие языков программирования и их основных концепций, происходившее в 70-х годах 20 века. Представляется, что равнение идей, излагаемых Барроном, с современным подходом к осмыслению основных векторов развития программирования способствует более глубокому исследованию языков программирования. Учебник С.А. Орлова предоставляет особенный интерес в части кратких описаний того или иного языка: автор сопровождает свой анализ критическими выводами о слабых сторонах определенных языков и отмечает преемственность концепций там, где это возможно. Наконец, работа Пратта и Зелковиц отличается подачей материала о программировании через призму математических моделей.

Исследование тематики современных языков программирования было бы невозможным без рассмотрения проблемы популярности отдельно взятых языков и попытки проанализировать современные тренды развития. В этой части работы в качестве источников были использованы наиболее частнотно цитируемые рейтинги и интернет-ресурсы, пользующиеся авторитетом у профессионального сообщества – PYPL, RedMonk, StackOverflow, TIOBE. Их надежность связана с открытостью самих рейтингов, прозрачностью используемых ими принципов и, в большинстве случаев, массивов данных. В завершение работы, для иллюстрации некоторых доводов использована также англоязычная статья о наиболее перспективных для изучения в 2019 году языков, опубликованная на интернет-портале, посвященного программированию Coding Infinite. Она позволяет рассмотреть сферу практического применения языков программистами, и прагматические факторы распространенности тех или иных языков, по понятным причинам не освещаемые в научной или учебной литературе. Несмотря на некоторую неформальность подачи данных, данная статья сопровождена строгой ссылочной частью, основывается на рейтингах, уже отобранных как заслуживающие внимания для данной работы, и не противоречит ранее представленным выводам.

Глава 1. Языки программирования

1.1 Краткая история языков программирования

Язык программирования – это знаковая система для планирования поведения программ; с практической точки зрения он представляет собой средство общение между человеком в роли пользователя и компьютером в роли исполнителя. [2, с. 24-26][1] Д. Баррон, определяя программирование как «искусство получения ответов от машины», пояснял роль языка следующим образом: он несет в себе систему понятий, на основе которых мы можем задавать вопросы и нотаций, позволяющих определить путь решения задачи. [1, с. 9-11][2]. Каждый язык программирования имеет определенные лексические, синтаксические и семантические правила, определяющие внешний вид программы и действия, которые выполнит исполнитель под ее управлением. В современном мире в роли исполнителя обычно выступает компьютер, однако история языков программирования берет начало до появления современных ЭВМ, в 19 веке, с появлением первых устройств, управляемых наборами инструкций. Примером прото-языка программирования может служить алгоритм вычисления чисел Бернулли на аналитической машине, опубликованный Чарльзом Бэббиджем и Адой Лавлейс в 1843 году. [6, с. 35][3]

С появлением в 40-х 20 века первых электронно-вычислительных машин, возникает машинный код – команды, которые может воспринимать электронное устройство, т.е. последовательность 1 и 0, сформированная перепадом напряжения. Машинный код был машинно-зависим, неудобен для программирования, сложен для контроля, громоздок, имел высокий фактор ошибки программиста, т.к. каждая операция должна была сопровождаться инструкцией по обработке данных, выраженной двоичным кодом, а также адресом самих обрабатываемых данных. [6, с. 29][4] Все это являлось предпосылками для поиска решения по автоматизации формирования машинного кода. В 1950 году для записи программ начали применять язык ассемблера – тип языков программирования, предложения которых по своей структуре в основном подобны командам и обрабатываемым данным конкретного машинного языка. Язык ассемблера позволил представить машинный код в более удобной для человека форме: для обозначения команд и объектов, над которыми эти команды выполняются, вместо двоичных кодов использовались буквы или сокращенные слова, которые отражали суть команды. Перевод из символьного языка в исполнимый машинный код производился программой, называемой ассемблером.

Если первым поколением языков программирования считать машинные коды, то язык ассемблера можно рассматривать как второе поколение языков программирования. Недостатки языка ассемблера, сложность разработки на нем больших программных комплексов, а также отсутствие некоего единого языка низкого уровня привели к появлению в середине 50-х годов 20 века языков, не привязанных к определенному типу ЭВМ — языков программирования высокого уровня. В системной области, однако, языки ассемблера продолжили широко применяться, в целях повышения эффективности выполняемых программ, вплоть до 70-х годов, когда развитие среды UNIX, разработанной на языке Си, доказала эффективность языков высокого уровня и в этой области. [3, c. 23][5]

Первые языки высокого уровня можно отнести к третьему поколению языков программирования. Хронологически первым из известных высокоуровневых языков является Планкалкюль (нем. Plankalkül — исчисление планов). Он был создан немецким инженером Конрадом Цюзе в 1943-1945 году для программирования компьютера Z4, однако был пригоден для работы с другими похожими вычислительными машинами. В силу исторических причин, создатель не имел возможность полноценно продолжать свою работу, и язык Планкалкюль становится известен лишь в 1972 году. Более ранняя публикация работ Цюзе существенно повлияла бы на ход истории языков программирования. [6, c. 562][6] [4, c. 60][7]

Первым из языков высокого уровня, получившим практическое применение и дальнейшее развитие, стал Фортран (англ. FORmula TRANslator - переводчик формул), созданный в 1954-1957 году в корпорации IBM: предназначенный для научных и инженерных вычислений. В 1958 году разработана первая версия языка Алгол (англ. ALGOrithmic Language – алгоритмический язык) – Algol 58, унаследовавшего многие черты Фортрана. Позднее Алгол был доработан (Algol 60) и полностью переработан в Алгол 68, отличавшийся сложностью синтексиса и не достигший популярности предыдущих версия). Алгол был первым языком, разработанным интернациональной командой; некоторые из разработчиков были знакомы с языком Планкалкюль – из него заимствовали форму оператора присваивания. [4, c. 76][8] Именно в языке Алгол появилось представление о программе не как о свободной последовательности команд, а как о блочной структуре, состоящей из четко описанных и отделенных друг от друга частей. В Алголе появилась возможность организации рекурсивных процедур. Если в США был более популярен Фортран, то Алгол приобрел широкое распространение в Европе и СССР, как в качестве универсального языка описания алгоритмов в научных публикациях, так и в качестве средства практического программирования. Р. Себеста отмечает, что популярности Фортрана способствовала неосведомленность пользователей, а именно- недостаточное знание рядом программистов и менеджеров общих концепций программирования: «они не приняли во внимание выгод блочной структуры, рекурсии и великолепно организованных управляющих операторов, поэтому они и не увидели преимуществ языка» Алгол 60. [4, c. 26][9]

В 1959 году был разработан Кобол (англ. COmmon Business Oriented Language – общий бизнес-ориентированный язык). Его главной особенностью был приближенность синтаксиса к английскому языку, разработчики ставили перед собой задачу: высказывание должно напоминать утвердительное предложение английского языка, а не математическое уравнение, как в Фортране. Также, в отличие от Фортрана, где зарезервированные слова отсутствовали, а задача распознавания ложилась на компилятор, в Кобол было зарезервировано более 300 слов. [1, c. 13][10] Благодаря легкости чтения, а также средствам работы со структурами данных и файлами, Кобол на два десятилетия занял нишу наиболее распространенного языка в применении к бизнесу. Однако, как отмечает Хендерсон, Кобол останется в стороне от основной линии развития языков программирования, которая прошла от Алгола к Паскаль, С и другим блочно-структурированным языкам. [6, c. 91][11]

Наконец, в 1960 году для работ по искусственному интеллекту был разработан язык Лисп (англ. LISt Processing language – язык обработки списков). Он создавался как язык функционального программирования, отличался простым синтаксисом и был первым из сохранившихся в использовании языков, где использовалось автоматическое управление памятью и сборка мусора. Лисп пережил десятилетия активного использования, в течение которых он вобрал в себя много свойств императивных языков и получил развитие в диалектах-потомках, таких, как Common Lisp (CL) и Scheme, сохранивших, тем не менее, основные концепции функционального программирования. [4, стр.73][12]

Основной чертой высокоуровневых языков стала абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понимания. Принципы, заложенные такими языками, как Фортран, Кобол и Лисп, получили дальнейшее развитие в период 60х-70х годов 20 века, когда были разработаны основные парадигмы программирования. [3, с. 43-47][13] В 1968-1969 году разработан язык Паскаль. К его разработке привели исследования задачи организации и структурирования программного кода. Создатель языка, Никлаус Вирт, изначально возглавлял комитет, работавший над усовершенствованием Алгола. Язык Паскаль стал модернизированной и расширенной версией Алгола, предоставляя работать с различными типами данных, не поддерживавшихся Алголом, а также задавать новые типы данных посредством комбинирования встроенных типов. [6, c. 362][14] Паскаль получил широкое распространение, отчасти обусловленное инновационной технологией компилятора, позволявшего применять язык на широком спектре вычислительных устройств. которую два десятилетия спустя используют разработчики языка Java.

В 1969-1973 году появляется язык Си, оказавший существенное влияние на развитие индустрии программного обеспечения, и давший основу синтаксиса таких языков программирования, как C# и Java. Си тесно связан с операционной системой UNIX, для реализации которой он изначально разрабатывался. [3, 58][15]

В период конца 70х – начало 80х годов 20 века происходит окончательное формирование принципов объектно-ориентированного программирования (далее – ОПП). ОПП - методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса. Понятие класса стало важным шагом вперед в развитии программирования, существенно упростившим написание и отладку программного продукта. ООП идеологически произошел из структурного программирования, и сочетал лучшие его принципы с новыми концепциями: инкапсуляции (механизм языка, позволяющий ограничить доступ одних компонентов программы к другим; позволяет реализовать быструю и безопасную иерархию компонентов программ), наследования (способности объекта использовать методы производного класса, который не существует на момент создания базового), и полиморфизма (в широком смысле - способность функции обрабатывать данные разных типов; например, способности классов с одинаковой спецификацией могут иметь различную реализацию). [4, с. 43][16] Объектно-ориентированные языки программирования – как языки, изначально разрабатывавшиеся на парадигме ООП (Python, Java, Smalltalk, Ruby, Objective-C) , так и те, что в ходе своей эволюции приобрели поддержку объектно-ориентированного программирования, - являются на сегодняшний день наиболее востребованным классом языков программирования. [6, с. 340-341][17]

На современном этапе развития программирования становится популярной и другая парадигма – функциональное программирование (далее – ФП). ФП использует другой вид абстракции для вычислений: они разрабатывались с целью максимально близкой имитации математических функций. Основу ФП составляют функции, которые берут в качестве аргументов набор функций и возвращают другую. Каждый символ в ФП является неизменяемым, и как следствие, функции не имеют побочных действий. Язык, реализующий парадигму ФП в чистом ее виде, не использует ни переменные, ни операторы присваивания. Функция не может поменять значение вне своей области видимости, и тем самым повлиять на другие функции. Результат работы функции зависит только от переданных аргументов. Как следствие, языки функционального программирования имеют более легкий процесс отладки, программы можно тестировать параллельно. Модель вычислений без состояний определяет как основные преимущества, так и недостатки ФП. Р. Себеста отмечает, что ФП имеет более низкую эффективность выполнения программ по сравнению с программированием на императивном языке, но при этом, «более высокий уровень программирования, для которого требуется меньше усилий.» [4, c. 612] [18] Наиболее популярными языками, реализующими функциональное программирования, являются Haskell, Scala, Erlixir, Erlang, Elm.

Со времени создания первых ЭВМ было разработано несколько сотен языков программирования, в разной степени использовавшихся в последние полвека. [6, стр. 388][19] Многие языки переживают так называемую эволюцию - выход нескольких версий и, в ряде случаев, существенную переработку, не теряя своей популярности. Выводы о тенденциях развития языков можно сделать, обратившись к вопросу классификации языков программирования.

1.2 Способы классификации

Существует множество признаков, по которым проводят классификацию языков программирования. Большая их часть не основывается на технических свойствах, не является дихотомичной, а в некоторых случаях – подвержена субъективности при типизации. Кроме того, начиная с 80-х годов 20 века в развитии языков программирования действует тенденция к консолидации. Языки заимствуют и перерабатывают некоторые особенности друг друга, объединяют черты различных своих предшественников, при этом существует множество конфликтов между критериями разработки и оценки языка. [4, с. 45][20] Все это обусловливает факт отсутствия общепринятой строгой классификации языков программирования. Рассмотрим некоторые из способов и их несовершенства.

Выше уже упоминалась хронологическая классификация языков. Согласно этому критерию, языки подразделяют, как правило, на пять поколений. Первое поколение – языки, реализованные на аппаратном уровне. [4, с. 61][21] Второе поколение – это языки ассемблера. Третье поколение – это первые из высокоуровневых языков, условно независимые от аппаратного обеспечения. [6, с. 227][22] Четвертое поколение приходится на период с 70-х по 90-е годы 20 века, языки этого поколения ориентированы на специализированные области применения. Для них характерны операторы, позволяющие одной строкой реализовать функциональность, которую на языках третьего поколения потребовалось бы описывать многократно большим исходным кодом. Пятое поколение (встречаются, однако, классификации, ограничивающиеся четырьмя поколениями) объединяет языки и прикладные системы, позволяющие автоматически формировать результирующий текст на универсальных языках программирования

По уровню языка различают языки низкого и высокого уровня, отличие которых в близости семантики к машинному коду архитектуры процессора или к человеческому языку соответственно. Языки низкого уровня – наименее абстрактные и наиболее сложные для восприятия человеком – это языки первого и второго поколения. [6, c. 388][23] Языки третьего поколения преимущественно относят к высокому уровню, однако, к примеру, язык Си был при разработке позиционирован как высокоуровневый язык ассемблера и может быть обособленно классифицирован как язык среднего уровня. Языки четвертого поколения являются языками высокого уровня. Для языков пятого поколения иногда используется термин сверхвысокий уровень.

Различают языки императивные и декларативные. Императивные – традиционно управляемые командами; основной их концепцией является состояние машины. [3, c. 43][24] Они описывают то, как пользователь получит результат, тогда как языки более высокого уровня описывают то, что требуется в результате. Поэтому первые называют языками, ориентированными на машину, а вторые — языками, ориентированными на человека.

По способу реализации различают компилируемые, интерпретируемые и языки смешанной системы реализации. [4, c. 45-52][25] Примером языка чистой интерпретации может служить Лисп. Условность данной классификация заключается в том, что реализация не является присущим конкретному языку свойством, и можно говорить только о естественном для языка способе реализации, который определяется временем связывания программных элементов с их характеристиками. В частности, в языках со статической типизацией переменные и другие объекты программы связываются с типом данных на этапе компиляции, а в случае типизации динамической — на этапе выполнения, как правило — в произвольной точке программы. Некоторые свойства элементов языка, такие как значение арифметических операторов или управляющих ключевых слов, могут быть связаны уже на этапе определения языка. В других языках возможно их переназначение. Раннее связывание обычно означает большую эффективность программы, в то время как позднее — большую гибкость, ценой которого является меньшая скорость или усложнение соответствующего этапа. Для любого традиционно компилируемого языка (например, Паскаль) можно написать интерпретатор. Кроме того, большинство современных интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в некоторое высокоуровневое промежуточное представление. Большинство традиционно интерпретируемых или компилируемых языков могут реализовываться в смешанной системе. Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми: программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# — Common Language Runtime. Подобный подход позволяет использовать плюсы как интерпретаторов, так и компиляторов. Примером языка, реализуемого смешанной системой, может служить Pearl, происходящий от интерпретируемых языков, но являющийся частично компилируемым, что позволяет обнаруживать ошибки до начала интерпретации. [4, c. 51][26]

По типу решаемых задач различают языки для решения математических (Фортран), экономических (Кобол) задач, языки для обучения (Бейсик, Паскаль), языки сетевого (Java) и системного (C, C++, C#) программирования. [4, 27-28][27] Очевидно, что данная классификация условна и большинство языков позволяет решать задачи широкого спектра. Отдельно следует упомянуть схожую классификацию языков программирования на языки фронтенд и бэкенд разработки.

По уровню риска человеческого фактора различают безопасные и небезопасные языки. Безопасным считается язык, где программы, которые могут быть приняты компилятором как правильно построенные, в динамике никогда не выйдут за рамки допустимого поведения. При этом если программа содержит ошибку, то она тем не менее не способна нарушить целостность данных и обрушиться. В опасных языках определенного вида ошибки, присущие конкретному языку, являются статистической нормой – например, ошибки неявного преобразования чисел в строки в языке Pearl [2, с. 83][28] , а также ошибки, связанные с несоответствием типов в языке Си [2, с. 66][29].

Различают языки для программирования в мелком и крупном масштабе. Различные языки программирования рассчитаны на разный исходный масштаб задачи и по-разному справляются с ростом сложности программных систем. Ключевым качеством языка, от которого зависит, как меняется трудоемкость разработки по мере наращивания системы, является абстракция. Высокая степень абстракции, допускаемая языком, значительно облегчает его использование. [4, с. 37][30]

Различают языки программирования с высоким и низким порогом вхождения и/или условной быстротой освоения. Данный фактор классификации упоминается большинством авторов при описании того или иного языка, но является предметом широких дискуссий, так как зависит не только от субъективных предпочтений, но также и от опыта конкретного программиста, опыта работы с другими языками конкретной языковой семьи (здесь уместно говорить об аналогии с изучением естественных языков), а также уровня, до которого указанное «вхождение» осуществляется. Обычно классифицируются как языки с низким порогом вхождения Си, Бейсик, Паскаль, Python, квази-языки – из-за более понятной семантики и относительно быстрого срока освоения основ языка. [10][31] К более «сложным» относят Java, Javascript, Си++, PHP. К языкам с высоким порогом вхождения относят сравнительно молодые мультипарадигмальные языки (Scala, Go) или, напротив, низкоуровневые языки – ассемблера или машинного кода.

По типу парадигмы – основной вычислительной модели, различают 4 типа языков: императивные (процедурные), функциональные (аппликативные), логические (основанные на системе правил) и объектно-ориентированные. При этом, как отмечают Пратт и Зелковиц [3, c. 45][32], объектно-ориентированная модель «является попыткой объединить лучшие свойства других моделей», такие как эффективность императивной модели (за счет возможности строить конкретные объекты данных), гибкость и надежность функциональной модели (за счет построения классов функций, которые используют ограниченный набор объектов данных). Хотя процедурные языки представляли собой первый широко используемый класс языков (Фортран, Алгол) и наиболее широко распространены и на сегодняшний день (Си, Паскаль, Ada), но концепция объектно-ориентированного программирования постепенно приобретает все большее значение и, с распространением мультипарадигмальности, большинство современных языков поддерживают реализацию ООП в том или ином виде. Таким образом, классификация языков по типу парадигмы может дополняться классификацией мультипарадигмальных языков – по числу поддерживаемых ими парадигм.

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

1.3 Популярные языки программирования

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

- число строк написанного кода;

- число упоминаний имени языка в поисковых запросах;

- число вакансий, требующих знания данного языка;

- число проектов на GitHub, использующих данный язык;

- число курсов программирования и тренировочных площадок, открытых для изучения языка;

- число книг и других учебных материалов (напр., видео на YouTube), посвященных языку).

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

Рассмотрим несколько рейтинговых систем, часто упоминаемых в профессиональном сообществе. [10][33]

Одним из наиболее распространенных рейтингов популярности языков программирования является индекс TIOBE (TIOBE programming community index) - индекс, оценивающий популярность языков программирования, на основе подсчета результатов поисковых запросов, содержащих название языка. [7][34] (Актуальный на момент написания данной работы Индекс TIOBE представлен в Приложении 1). Для его формирования используется поиск в нескольких наиболее посещаемых порталах: Google, Blogger, Wikipedia, YouTube, Baidu, Yahoo!, Bing, Amazon. Расчет индекса происходит ежемесячно, текущая информация предоставляется бесплатно. Методика расчета индекса очень чувствительна к внутренним алгоритмам и политикам поисковых систем, в частности, к алгоритму оценки количества найденных страниц. Например, в апреле 2004 года после проведения в поисковой системе Google очистки от нечестных способов продвижения сайтов, произошло резкое падение значения индекса для языков Java и C++, хотя они и остались на вершине таблицы. Для борьбы с такими флуктуациями TIOBE начал использовать большее количество поисковых систем.

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

Отмечается, что топ-8 языков индекса TIOBE стабильны (присутствуют в рейтинге) на протяжении последних 15 лет (Рисунок 1).

Рисунок 1. Индекс TIOBE топ-10 языков программирования.

[7][35]

TIOBE использует в отборе на исследование критерий полноты по Тьюрингу. Это означает, к примеру, что не исследуется HTML или базовый SQL, тогда как расширения PL/SQL и T-SQL входят в индекс. Еще одним спорным критерием является наличие у исследуемого языка статьи в Википедии, в которой указано, что язык является языком программирования. По этому критерию в индекс не были включены Ruby on Rails, Excel, ASP, AJAX.

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

Еще одним известным рейтингом популярности языков выступает рейтинг компании RedMonk, публикуемый с 2010 года.

Данные RedMonk помогают всем желающим понять, какие языки на данный момент наиболее популярны среди разработчиков. Актуальная на момент написания данной работы версия рейтинга была опубликована в июне 2019 года (Рисунок 2).

Рисунок 2. Рейтинг популярности языков программирования Red Monk за 3 кв. 2019 г. [11][36]

RedMonk ежеквартально собирает статистику по каждому из языков на профессиональных порталах программистов GitHub и Stack Overflow. Первый из них помогает определить частоту использования языка для написания кода (без учета ветвлений проектов). Второй из указанных ресурсов помогает создателям рейтинга оценить статистики обсуждения языков. Цель рейтинга RedMonk - выявить популярные языки для будущих проектов.

Представленный в виде графика, рейтинг сопровождается также нумерическим списком: топ-10 наиболее популярных языков, в порядке убывания, это JavaScript, Java, Python, PHP, C++, C#, CSS, Ruby, C и TypeScript. Создатели рейтинга RedMonk отмечают, что за исключением одного квартала прошлого года, когда Swift поднимался на десятую строчку, перечень топ-10 языков остается неизменным на протяжении 5 лет, изменяется лишь их последовательность. [11][37]

Еще одной заслуживающей упоминания системой оценки является рейтинг PYPL (PopularitY of Programming Languages).[9][38] Система оценки PYPL основана на количестве поисковых запросов учебных пособий в Google. Авторы утверждают, что чем больше людей интересуется изучением языка, тем более он популярен. Согласно публикациям PYPL, в октября 2019 года топ-3 языков выглядел так: на первом месте - Python, с индексом 29,49%. Это на 4,5 % больше, чем в прошлом году. На втором месте - Java с индексом 19,57 %, что составило на 2,4 % меньше чем в прошлом году. Замыкает тройку лидеров Javascript с 8,4%, что примерно соответствует значению прошлого года. На четвертом и пятом месте находятся C# и PHP соответственно. Авторы PYPL отмечают, что в глобальной популярности,за последние пять лет, язык Python вырос больше, чем другие: он прибавил 18,9 процента. Самые большие потери за этот период понес Java - 7,0 процента (Рисунок 3). Данный тренд еще более выражен, если исчислять популярность по отдельным регионам – Индия, и в меньшей степени, США. В Европе показатели обоих языков, по данным PYPL, подвержены более слабой динамике.

Рисунок 3. Динамика изменения глобальной популярности языков Python и Java, по данным рейтинга PYPL[9][39]

Заслуживает упоминания система отчетов портала Stack Overflow, который, кроме упоминавшегося выше индекса частоты использования, ежегодно опрашивает представителей профессионального сообщества о языках, наиболее удобных в работе (вызывающих позитивную оценку) – такие языки, как Rust, Python, TypeScript и Kotlin лидируют в данном опросе последние два года, и можно говорить о тенденции к росту их популярности. Среди факторов, влияющих на высокую оценку, часто указывают относительную легкость освоения, лаконичность синтаксиса, высокую безопасность языка и актуальные сферы его распространения. [10][40]

Таким образом, анализируя публикации наиболее известных рейтинговых систем, можно говорить о сходных результатах, выделяющих топ-5 и топ-10 наиболее популярных языков. Тем не менее, следует учитывать, что один язык может отнимать наибольшее количество человеко-часов, на другом написано наибольшее число строк кода, третий занимает наибольшее процессорное время, а четвертый наиболее часто служит исследовательской базой в академических кругах. Кроме того, некоторые языки очень популярны для конкретных задач. Например, Кобол до сих пор доминирует в корпоративных дата-центрах, Фортран — в научных и инженерных приложениях, вариации языка Си — в системном программировании, Лисп и его потомки – в работе с искусственным интеллектом, а потомки ML — в формальной верификации.

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

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

1.4 Описание и сравнительные особенности наиболее популярных языков

Рассмотрим особенности языков, популярность которых подтверждена указанными выше методиками. Все три рейтинга включают Python, Java, Javascript, С#. Остановимся на каждом из них подробнее.

Python - это высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Разработан в 1990 году. [6, c. 392][41] Синтаксис ядра Python минималистичен, в то же время стандартная библиотека включает большой объем полезных функций. Python является мультипарадигмальным языком и поддерживает структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное программирование. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений, высокоуровневые структуры данных. [2, c. 86][42] Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.

Программа-приветствие, выводящая на экран текст «Hello World», написанная на Python, выглядит следующим образом: print("Hello, World!")

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

Java - строго типизированный объектно-ориентированный язык программирования, основной язык разработки для Android. Разработан в 1995 году, на основе С++, как более простой и надежный – что достигнуто, к примеру, за счет удаления половины приведений типов, введения параллельности, а также проверки диапазона изменения индексов при доступе к массивам. [4, c. 116-117][43] Язык является мультипарадигмальным: поддерживает обобщенную, объектно-ориентированную, процедурную парадигмы. Программы транслируются в байт-код Java, выполняемый виртуальной машиной Java - программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор. [3, c.611][44]

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

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

Программа-приветствие на Java выглядит так:

class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hello, World!");

    }

}

JavaScript - компилируемый язык программирования. Мультипарадигмальный: поддерживает объектно-ориентированный, императивный и функциональный стили. [2, c. 84][45] Разработан в 1995 году. JavaScript обычно используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для придания интерактивности веб-страницам.

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

На JavaScript оказали влияние многие языки. Имеет синтаксис, сходный языку Си. [6, c. 256][46] При разработке JavaScript была цель сделать язык похожим на Java, но при этом легким для использования непрограммистами.

Программа-приветствие выглядит так:

<!DOCTYPE HTML>

<html>

<body>

<script>

alert( 'Hello, world!' );

</script>

</body>

</html>

Одним из достоинств JavaScript является гибкость языка, которая позволяет использовать множество шаблонов программирования применительно к конкретным условиям и реализовывать приемы, невозможные в более жестких языках. [5, с. 23][47] Взаимодействие с приложением может осуществляется даже через текстовые редакторы. К недостаткам относят безопасность: JavaScript может использовать систему пользователя, поэтому вредоносный код может быть запущен на клиентской машине. Также JavaScript иногда интерпретируется по-разному разными браузерами. Различные механизмы компоновки могут отображать JavaScript по-разному, что приводит к несогласованности с точки зрения функциональности и интерфейса. К недостаткам часто относят и систему наследования – в JavaScript реализовано наследование, основанное на прототипах.

В практической части данной работы будут отмечены особенности языка JavaScript будут изучены подробнее.

C# - объектно-ориентированный язык программирования. Мультипарадигмальный: поддерживает обобщенную, объектно-ориентированную, процедурную, функциональную парадигмы. Разработан в 2002 году. Относится к семье языков Си, разрабатывался как близкий по синтаксису к языкам C++ и Java, но несколько упрощенный в некоторых аспектах и более приспособленный к использованию с программной платформой Miscrosoft. [6, c.67][48] Язык имеет статическую типизацию, поддерживает полиморфизм, содержит абстрактные методы, подобные абстрактным методам языка С++, но использующие другой синтаксис. [2, c. 496-497][49]

Приведем в качестве примера синтаксиса ту же программу-приветствие:

using System;

namespace HelloWorld

{

class Hello

{

static void Main()

{

Console.WriteLine("Hello World!");

}

}

}

Следует отметить, что указанный год разработки для каждого из рассмотренных языков относится к первой выпущенной версии, при этом обозначенные особенности изложены для актуальных на сегодняшний день версий (прежде всего, мультипарадигмальность). Анализ истории развития языков программирования и сравнительных классификаций показывает, что среди десятков актуальных на сегодняшний день языков можно выделить ряд взаимосвязей, обусловленных их предшественниками. Ни один из языков не является абсолютно уникальным лексически, синтаксически и семантически, языки исторически связанны между собой, и наиболее популярные из них обладают свойством мультипарадигмальности, даже при условии, что изначально разрабатывались строго в одной парадигме. Языки Java, JavaScript, Паскаль и C# , созданные в период с 1991 по 2000 год и увидевшие с даты создания несколько своих версий, являются примерами такой мультипарадигмальности, расширяемой в новых выпусках. Они универсальны в сферах своего применения, уверенно занимают верхние строчки рейтингов и несомненно имеют перспективы и в будущем программирования.

Глава 2. Особенности языка программирования на примере JavaScript

2.1 Сравнительные особенности языка JavaScript

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

Структурно JavaScript можно представить в виде объединения трех четко различимых друг от друга частей:

- ядро (ECMAScript)

- объектная модель браузера (BOM)

- объектная модель документа (DOM)

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

Имена переменных и функций в JavaScript должны начинаться с буквы, $ или символа подчеркивания. Они могут даже содержать эмодзи или иероглифы! Идентификаторы зависимы от регистра: example и Example – это разные переменные.

Нельзя использовать в качестве имен зарезервированные слова языка: break, do, instanceof, typeof, case, else, new, var, catch, finally, return, void, continue, for, switch, while, debugger, function, this, with, default, if, throw, delete, in, try, class, enum, extends, super, const, export, import, implements, let, private, public, interface, package, protected, static, yield.

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

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

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

2.2 Пример кода на JavaScript №1

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

Рисунок 4. Выполнение кода программы примера №1

Программы, написанные на языке JavaScript, встраиваются непосредственно в html документы посредством парного тега <script>. [2, c.85][50]

Программа начинает работу с вывода сообщения для пользователя через alert. Отображение диалогового окна является побочным эффектом. Далее выполняется prompt, дающий пользователю возможность ввести число. Следующая строка кода задействует так называемое условное выполнение. [5, 47][51]. Функция isNaN проверяет, является ли введенное значение числом. В случаях, если результат этой проверки положительный, запускаются варианты, перечисленные в нескольких парах if/else. Программа может запустить альтернативные ветки в зависимости от значения, введенного пользователем. К выигрышу приводит значение в диапазоне от 65 до 75 включительно.

Код:

<meta charset="utf-8">

<script>

alert("Попади птицей по свинье!");

var angle=parseInt(prompt("У тебя есть только одна птица. Перед тобой - две свиньи: одна повыше, другая пониже. Введи угол, под которым ты будешь стрелять:"));

if (isNaN(angle)){

alert("Ты проиграл! В следующий раз вводи число");

}

else if (angle==0) {

alert("Ты проиграл! Угол, равный нулю? Серьезно?");

} else if (angle<0 || angle>=180) {

alert("Ты проиграл! Такой угол невозможен");

} else if (angle>90 && angle<180) {

alert("Какая неудача! Ты выстрелил в противоположную сторону! Свиньи все еще впереди - и они торжествуют.");

} else if (angle==90) {

alert("Тысяча чертей! Ты выстрелил птицей прямо вверх, и она упала обратно прямо на тебя");

} else if (angle<90 && angle>75){

alert("Проклятые свиньи! Птица пролетела слишком высоко");

} else if (angle<=75 && angle>=65){

alert("Победа! Твоя птица поразила верхнюю свинью и падая, сбила вторую свинью тоже");

} else if (angle<65 && angle>45) {

alert("Проклятые свиньи! Птица пролетела ровно между ними, не задев ни одну");

} else if (angle==45) {

alert ("Прямо в свинью! К сожалению, та свинья, что повыше, все еще хрюкает");

} else {

alert("Тысяча чертей! Птица пролетела слишком низко, и проклятые свиньи издевательски хрюкают над тобой");

}

alert("Конец игры")

</script>

В данном случае, для удобства тестирования кода на веб-ресурсе https://js.do используется опция языка встроить код непосредственно в веб страницу, используя HTML теги <script>, но вместо указания файла в атрибуте src, код помещается между тегами. В ином случае начальный тег бы выглядел так:

<!-- Код записан в .js файле и включен через атрибут src тега script. -->

<script src="C:\Users\Raenel\Desktop\Курсовая пример 1 свиньи.js">

</script>

В приведенном примере множественно используется блок else if – для он служит для проверки нескольких вариантов условий. Выигрыш соответствует условию ввода пользователем значения в диапазоне от 65 до 75 включительно.

Рассмотрим более сложный пример.

2.3 Пример кода на JavaScript №2

Игра в Black Jack (Рисунок 5). Игроку предлагается набрать карты, значение которых в сумме будет больше, чем у дилера, но не более 21.

Рисунок 5. Выполнение кода программы примера №2

В данной программе используется метод Math.random(), который возвращает псевдослучайное число из диапазона 0 включительно до 1 не включая 1; метод масштабируется.

Рассмотрим код.

<meta charset="utf-8">

<script>

function getRandomInt(min,max) {

return Math.floor(Math.random() * (max - min + 1)) + min;

}

function getCard(cards) {

var i = getRandomInt(0, cards.length - 1);

var card = cards[i];

cards.splice(i,1);

return card;

}

function getSum(hand) {

var sum = 0;

//Сначала напишем инструкцию по подсчету всех карт, кроме туза

for (i = 0; i < hand.length; i++) {

var card = hand[i];

if (card != 'A'){

if (card == 'J' || card == 'Q' || card == 'K'){

sum = sum + 10;

}

else {

sum = sum + parseInt(card);

}

}

}

//Теперь подсчет туза: его значение равно либо 1, либо 11

for (i = 0; i < hand.length; i++){

var card = hand[i];

if (card == 'A') {

if (sum > 10) {

sum = sum + 1;

} else {

sum = sum + 11;

}

}

}

return sum;

}

function getStatus() {

return 'Дилер: ' + dealer.join(' ') + ' (' + getSum(dealer) + '), Игрок: ' + player.join(' ') + ' (' + getSum(player) + ')\n\n';

}

var cards = [

'6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', ];

var dealer = [getCard(cards)];

var player = [getCard(cards)];

var playing = true;

var sumPlayer = 0;

var loseMessage = 'Сожалею, в этот раз Вы проиграли.';

var winMessage = 'Поздравляю, Вы выиграли!';

do {

if (playing) {

player.push(getCard(cards));

sumPlayer = getSum(player);

if (sumPlayer > 21) {

alert(getStatus() + 'У вас перебор! ' + loseMessage);

break;

} else if (sumPlayer == 21) {

alert(getStatus() + 'У вас Black Jack! ' + winMessage);

break;

}

}

playing = confirm(getStatus() + 'Вы хотите взять еще карту?');

} while(playing);

// подсчет карт у дилера

if(sumPlayer < 21) {

while (getSum(dealer) < 17) {

dealer.push(getCard(cards));

}

var sumDealer = getSum(dealer);

if (sumDealer == 21) {

alert(getStatus() + 'У дилера Black Jack! ' + loseMessage );

} else if (sumDealer > 21) {

alert('У дилера перебор! ' + winMessage);

} else if (sumDealer == sumPlayer) {

alert('Ничья!');

} else if (sumPlayer > sumDealer) {

alert(getStatus() + winMessage);

} else {

alert(getStatus() + loseMessage);

}

}

</script>

Аналогично предыдущему примеру, в программе используются условные операторы. Из-за распространенности шаблона циклов while, в которых создается сначала привязка-счетчик для контроля за выполнением цикла, в JavaScript и аналогичных языках есть более короткая форма цикла – for. [5, c. 52][52] Все инструкции, связанные с состоянием цикла, сгруппированы после слова for. Для Си-подобных языков, оператор цикла for задает не определенное количество повторений, в отличие от языков Pascal, Ada. [2, c.134][53]

Также используется оператор цикла while, позволяющий игроку продолжать. Генератор использует объявленные варианты значений карт и возвращает одно новое значение для каждого шага игры. Прерывание цикла осуществляет расположенные внутри инструкции break: если подсчет возвращает сумму, превышающую 21 (игрок при этом получает сообщение о переборе, означающее проигрыш) и если подсчет возвращает сумму 21 (игрок получает сообщение Black Jack, означающее выигрыш). Без оператора break или при ошибке в написании кода, при которой условие завершения записано в for, но его значение всегда является истинным, то программа застрянет в бесконечном цикле. [5, c. 53][54]

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

ЗАКЛЮЧЕНИЕ

В настоящей работе было проведено исследование современных языков программирования в контексте их общих и отличительных черт. В процессе ознакомления с историей возникновения и развития языков программирования был сделан вывод о том, что многие языки переживают выход нескольких версий и существенную переработку, не теряя своей популярности. В определенный период исторического развития (80-е годы 20 века) на смену появления новых парадигм пришла тенденция консолидации и приобретения языками, переживающими развитие и выпуски обновленных версий, некоторых черт, заимствованных у конкурентов. Постепенное развитие данном направлении привело к тому, что четыре наиболее популярных языка, лидирующие в рассмотренных рейтингах, являются мультипарадигмальными. Также следует отметить выявленную общую тенденцию на повышение уровня языков, приобретения новыми версиями и диалектами возможности работать с другими, ранее не поддерживавшимися, парадигмами языка, стремлением разработчиков языков создавать упрощенные версии синтаксиса и семантики, общим запросом на языки более низкого порога вхождения. При исследовании вопроса об измерении популярности языков было установлено, что языки программирования, расположенные в верхних 5 или 10 строчках индексов популярности, остаются лидерами рейтингов на протяжении многих лет, лишь периодически меняясь друг с другом местами. Анализ истории развития языков программирования и сравнительных классификаций показывает, что среди десятков актуальных на сегодняшний день языков можно выделить ряд взаимосвязей, обусловленных их предшественниками. Иными словами, ни один из языков не является абсолютно уникальным лексически, синтаксически и семантически, языки исторически связанны между собой. Несмотря на обилие языков программирования, разработанных с середины прошлого века и используемых на сегодняшний день, основной вектор развития прошел от языка Алгол через Паскаль, Си и так называемые Си-подобные языки (прежде всего С# и Java). Языки Java, JavaScript, Python и C#, созданные в период с 1991 по 2000 год и увидевшие с даты создания несколько своих версий, являются примерами возрастающей с новыми версиями универсальности. Они уверенно занимают верхние строчки рейтингов и несомненно имеют перспективы и в будущем программирования.

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

ПРИЛОЖЕНИЯ

Приложение 1. Индекс TIOBE на октябрь 2019 года

Таблица 1.

Индекс TIOBE на октябрь 2019 года

Октябрь 2019, место

Октябрь 2018, место

Изменение

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

Рейтинг, %

Изменение, %

1

1

-

Java

16,884

-0,92

2

2

-

C

16,180

+0,80

3

4

Python

9,089

+1,93

4

3

C++

6,229

-1,36

5

6

C#

3,860

+0,37

6

5

Visual Basic .NET

3,745

-2,14

7

8

JavaScript

2,076

-0,20

8

9

SQL

1,935

-0,10

9

7

PHP

1,909

-0,89

10

15

Objective-C

1,501

+0,30

11

28

Groovy

1,394

+0,96

12

10

Swift

1,362

-0,14

13

18

Ruby

1,318

+0,21

14

13

Assembly language

1,307

+0,06

15

14

R

1,261

+0,05

16

20

Visual Basic

1,234

+0,58

17

12

Go

1,100

-0,15

18

17

Delphi/Object Pascal

1,046

-0,11

19

16

Perl

1,023

-0,14

20

11

MATLAB

0,924

-0,39

Источник: [7. TIOBE Index. – 2019. URL: https://tiobe.com/tiobe-index/ (Дата обращения: 08.10.2019).]

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Баррон Д. Введение в языки программирования./ Пер. с англ. В.А. Серебрякова. – М.: Мир,1980. – 190 с.
  2. Орлов С.А. Теория и практика языков программирования. Учебник для вузов. Стандарт 3-го поколения. – СПб.: Питер, 2014. – 688 с.
  3. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. /Под общ. ред. А. Матросова . — СПб.: Питер, 2002. – 688 с.
  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — 672 с. 
  5. Хавербеке М. Выразительный JavaScript. Современное веб-программирование. 3-е изд. – СПб.: Питер, 2019. – 480 с.
  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – 580 с.
  7. TIOBE Index. – 2019. URL: https://tiobe.com/tiobe-index/ (Дата обращения: 08.10.2019).
  8. Online JavaScript Editor. [Электронный ресурс]    Режим доступа: https://js.do, свободный. - Загл. с экрана. (Дата обращения: 08.10.2019).
  9. PopularitY of Programming Language index. – 2019. URL: http://pypl.github.io/PYPL.html (Дата обращения: 08.10.2019).
  10. Saeed A. Here Are The Ten Best Programming Languages to learn in 2019//Coding Infinite. - 2018. URL: https://codinginfinite.com/best-programming-languages-to-learn-2019/ (Дата обращения 17.09.2019)

11. The RedMonk programming language rankings: June 2019// RedMonk. - 2019. URL: https://redmonk.com/sogrady/2019/07/18/language-rankings-6-19/ (Дата обращения 17.09.2019)

  1. 2. Орлов С.А. Теория и практика языков программирования. Учебник для вузов. Стандарт 3-го поколения. – СПб.: Питер, 2014. – C. 24-26.

  2.  1. Баррон Д. Введение в языки программирования. / Пер. с англ. В.А. Серебрякова. – М.: Мир,1980. – C. 9-11.

  3.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – C.35.

  4.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – C.29.

  5.  3. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. /Под общ. ред. А. Матросова. — СПб.: Питер, 2002. – С. 23.

  6.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – C.562.

  7.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 60.

  8.  Там же. С. 76.

  9.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 26.

  10.  1. Баррон Д. Введение в языки программирования. / Пер. с англ. В.А. Серебрякова. – М.: Мир,1980. – C. 13.

  11.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – C.91.

  12.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 73.

  13.  3. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. /Под общ. ред. А. Матросова . — СПб.: Питер, 2002. – С. 43-47.

  14.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – C.362.

  15.  3. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. /Под общ. ред. А. Матросова . — СПб.: Питер, 2002. – С. 58.

  16.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 43.

  17.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – С. 340-341.

  18.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 612.

  19.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – С. 388.

  20.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 45.

  21.  Там же. С. 61.

  22.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – С. 227.

  23.  Там же. С. 388.

  24.  3. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. /Под общ. ред. А. Матросова . — СПб.: Питер, 2002. – С. 43.

  25.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 45-52.

  26.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 51.

  27.  Там же. С. 27-28.

  28.  2. Орлов С.А. Теория и практика языков программирования. Учебник для вузов. Стандарт 3-го поколения. – СПб.: Питер, 2014. – C. 83.

  29.  Там же. С. 66.

  30.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C.37.

  31.  10. Saeed A. Here Are The Ten Best Programming Languages to learn in 2019//Coding Infinite. - 2018. URL: https://codinginfinite.com/best-programming-languages-to-learn-2019/ (Дата обращения 17.09.2019)

  32.  3. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. /Под общ. ред. А. Матросова . — СПб.: Питер, 2002. – С. 45.

  33.  10. Saeed A. Here Are The Ten Best Programming Languages to learn in 2019//Coding Infinite. - 2018. URL: https://codinginfinite.com/best-programming-languages-to-learn-2019/ (Дата обращения 17.09.2019)

  34.  7. TIOBE Index. – 2019. URL: https://tiobe.com/tiobe-index/ (Дата обращения: 08.10.2019).

  35.  7. TIOBE Index. – 2019. URL: https://tiobe.com/tiobe-index/ (Дата обращения: 08.10.2019).

  36.  11. The RedMonk programming language rankings: June 2019// RedMonk. - 2019. URL: https://redmonk.com/sogrady/2019/07/18/language-rankings-6-19/ (Дата обращения 17.09.2019)

  37.  11. The RedMonk programming language rankings: June 2019// RedMonk. - 2019. URL: https://redmonk.com/sogrady/2019/07/18/language-rankings-6-19/ (Дата обращения 17.09.2019)

  38.  9. PYPL PopularitY of Programming Language index. – 2019. URL: http://pypl.github.io/PYPL.html (Дата обращения: 08.10.2019).

  39.  9. PYPL PopularitY of Programming Language index. – 2019. URL: http://pypl.github.io/PYPL.html (Дата обращения: 08.10.2019).

  40.  10. Saeed A. Here Are The Ten Best Programming Languages to learn in 2019//Coding Infinite. - 2018. URL: https://codinginfinite.com/best-programming-languages-to-learn-2019/ (Дата обращения 17.09.2019)

  41.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – C.392.

  42.  2. Орлов С.А. Теория и практика языков программирования. Учебник для вузов. Стандарт 3-го поколения. – СПб.: Питер, 2014. – C. 86.

  43.  4. Себеста Р.У. Основные концепции языков программирования - 5-е изд. / Пер. с англ. - М.: Вильямс, 2001. — C. 116-117.

  44.  3. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. /Под общ. ред. А. Матросова . — СПб.: Питер, 2002. – С. 611.

  45.  2. Орлов С.А. Теория и практика языков программирования. Учебник для вузов. Стандарт 3-го поколения. – СПб.: Питер, 2014. – C. 84.

  46.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – C.256.

  47.  5. Хавербеке М. Выразительный JavaScript. Современное веб-программирование. 3-е изд. – СПб.: Питер, 2019. – С.23.

  48.  6. Henderson. H. Encyclopedia of Computer Science And Technology. Rev. ed. – 2009. – C.67.

  49.  2. Орлов С.А. Теория и практика языков программирования. Учебник для вузов. Стандарт 3-го поколения. – СПб.: Питер, 2014. – C. 496-497.

  50.  2. Орлов С.А. Теория и практика языков программирования. Учебник для вузов. Стандарт 3-го поколения. – СПб.: Питер, 2014. – C. 85.

  51.  5. Хавербеке М. Выразительный JavaScript. Современное веб-программирование. 3-е изд. – СПб.: Питер, 2019. – С 47.

  52.  5. Хавербеке М. Выразительный JavaScript. Современное веб-программирование. 3-е изд. – СПб.: Питер, 2019. – С 52.

  53.  2. Орлов С.А. Теория и практика языков программирования. Учебник для вузов. Стандарт 3-го поколения. – СПб.: Питер, 2014. – C. 134.

  54.  5. Хавербеке М. Выразительный JavaScript. Современное веб-программирование. 3-е изд. – СПб.: Питер, 2019. – С 53.