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

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

Содержание:

Введение

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

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

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

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

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

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

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

Если первым поколением языков программирования считать машинные коды, то язык ассемблера можно рассматривать как второе поколение языков программирования. Недостатки языка ассемблера, сложность разработки на нем больших программных комплексов, а также отсутствие некоего единого языка низкого уровня привели к появлению в середине 50-х годов 20 века языков, не привязанных к определенному типу ЭВМ — языков программирования высокого уровня. Язык ассемблера продолжил свое применение в модулях программ, написанных на языках высокого уровня.

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

В 1959 году был разработан Кобол (англ. COmmon Business Oriented Language – общий бизнес-ориентированный язык). Его главной особенностью был приближенность синтаксиса к английскому языку. Благодаря легкости чтения, а также средствам работы со структурами данных и файлами, Кобол на десятилетия занял нишу наиболее распространенного языка в применении к бизнесу.

Наконец, в 1960 году для работ по искусственному интелекту был разработан Лисп (англ. LISt Processing language – язык обработки списков), первый из сохранившихся в использовании языков, использующих автоматическое управление памятью и сборку мусора. Лисп пережил десятилетия активного использования, в течение которых он вобрал в себя практически все существующие методологии программирования и получил развитие в диалектах/потомках, таких, как Common Lisp (CL).

Основной чертой высокоуровневых языков стала абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понимания. Принципы, заложенные такими языками, как Фортран, Кобол и Лисп, получили дальнейшее развитие в период 60х-70х годов 20 века, когда были разработаны основные парадигмы программирования. В 1968-1969 году разработан язык Паскаль. В 1969-1973 году появляется язык Си, оказавший существенное влияние на развитие индустрии программного обеспечения, и давший основу синтаксиса таких языков программирования, как C# и Java.

В период конца 70х – начало 80х годов 20 века происходит окончательное формирование принципов объектно-ориентированного программирования. ОПП - методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса. Понятие класса стало важным шагом вперед в развитии программирования, существенно упростившим написание и отладку программного продукта. ООП идеологически произошел из структурного программирования, и сочетал лучшие его принципы с новыми концепциями: инкапсуляции (механизм языка, позволяющий ограничить доступ одних компонентов программы к другим; позволяет реализовать быструю и безопасную иерархию компонентов программ), наследования (способности объекта использовать методы производного класса, который не существует на момент создания базового), и полиморфизма (в широком смысле - способность функции обрабатывать данные разных типов; например, способности классов с одинаковой спецификацией могут иметь различную реализацию). Объектно-ориентированные языки программирования - C++, Java, Ruby, Python, JavaScript, Ruby являются на сегодняшний день наиболее востребованным классом языков.

На современном этапе развития программирования становится популярной и другая парадигма – функциональное программирование. ФП использует другой вид абстракции для вычислений, отличный от ООП. Основу ФП составляют функции, которые берут в качестве аргументов набор функций и возвращают другую. Каждый символ в ФП каждый символ является неизменяемым, и как следствие, функции не имеют побочных действий. Функция не может поменять значение вне своей области видимости, и тем самым повлиять на другие функции. Результат работы функции зависит только от переданных аргументов. Как следствие, языки функционального программирования имеют более легкий процесс отладки, программы можно тестировать параллельно. Модель вычислений без состояний определяет как основные преимущества, так и недостатки ФП. Наиболее популярными языками, реализующими функциональное программирования, являются Haskell, Scala, Erlixir, Erlang, Elm. Следует отметить, однако, что элементы функционального программирования включены и во многие современные языки ОПП, например, Java.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Еще одним известным рейтингом популярности языков выступает рейтинг компании RedMonk, публикуемый с 2010 года. Его статистика помогает всем желающим начать новые проекты понять, какие языки наиболее популярны среди разработчиков. Актуальная на сегодняшний день версия рейтинга была опубликована в июне 2019 года. Вот она:

  1. JavaScript
  2. Java
  3. Python
  4. PHP
  5. C++
  6. C#
  7. CSS
  8. Ruby
  9. C
  10. TypeScript
  11. Swift
  12. Objective-C
  13. Scala
  14. Shell
  15. R
  16. Go
  17. PowerShell
  18. Perl
  19. Haskell
  20. Kotlin

RedMonk отмечает, что за исключением одного квартала прошлого года, когда Swift поднимался на десятую строчку, перечень топ-10 языков остается неизменным на протяжении 5 лет, изменяя лишь их последовательность.

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

Еще одной заслуживающей упоминания системой оценки является рейтинг PYPL (PopularitY of Programming Languages). Система оценки PYPL основана на количестве поисковых запросов учебных пособий в Google. Авторы утверждают, что чем больше людей интересуется изучением языка, тем более он популярен. Согласно публикациям PYPL, в октября 2019 года топ-3 языков выглядел так: на первом месте - Python, с индексом 29,49%. Это на 4,5 % больше, чем в прошлом году. На втором месте - Java с индексом 19,57 %, что составило на 2,4 % меньше чем в прошлом году. Замыкает тройку лидеров Javascript с 8,4%, что примерно соответствует значению прошлого года. На четвертом и пятом месте находятся C# и PHP соответственно. Авторы PYPL отмечают, что за последние пять лет популярность Python выросла больше, чем по другим языкам: он прибавил 15,8 процента. Самые большие потери за этот период понес PHP — 6,1 процента.

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

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

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

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

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

Python - это высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Разработан в 1991 году. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объем полезных функций. Python является мультипарадигмальным языком и поддерживает структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное программирование. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений, высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.

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

print("Hello, World!")

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

Java - строго типизированный объектно-ориентированный язык программирования, основной язык разработки для Android. Разработан в 1995 году. Язык является мультипарадигмальным. Программы транслируются в байт-код Java, выполняемый виртуальной машиной Java - программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.

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

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

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

class HelloWorld {

    public static void main(String[] args) {

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

    }

}

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

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

На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на Java, но при этом легким для использования непрограммистами.

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

<!DOCTYPE HTML>

<html>

<body>

<script>

alert( 'Hello, world!' );

</script>

</body>

</html>

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

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

C# - объектно-ориентированный язык программирования. Мультипарадигмальный. Разработан в 2000 году. Относится к семье языков Си, его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщенные типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML. Это относительно простой, удобный и современный язык, по мощности не уступающий С++, но существенно повышающий продуктивность разработок.

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

using System;

namespace HelloWorld

{

class Hello

{

static void Main()

{

Console.WriteLine("Hello World!");

}

}

}

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

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

Сравнительные особенности 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, который можно повторно использовать в программе. Особенность функций в том, что их можно вызывать, передавать им аргументы и получать некоторое новое значение.

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

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

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

Код:

<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 включительно.

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

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

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

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

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

<meta charset="utf-8">
<script>

function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}

function getCard() {
var cards =
return cards[getRandomInt(0, cards.length - 1)];
}

function getSum(arr) {
var sum = arr.length;
var sumCard = 0;
for (var i=0; i<=(sum-1); i++) {
var n = arr[i];
if ( isNaN(n) && n != 'A') {
sumCard = sumCard + 10;
}
else if (n != 'A') {
sumCard = sumCard + parseInt(n);
}

}
for (var i=0; i<=(sum-1); i++) {
var n = arr[i];
if (n == 'A' && sumCard<=10) {
sumCard = sumCard + 11;
}
else if (n == 'A') {
sumCard = sumCard + 1;
}

}
sum = sumCard;
return sum;
}

function getStatus() {
return 'Дилер: ' + dealer.join(' ') + ' Игрок: ' + player.join(' ') + '.';

}

var dealer = [getCard()];
var player = [getCard(), getCard()];

var answer = ' ';
do {
answer = prompt(getStatus() + ' Хотите еще карту? 1 - да, любое другое значение - нет')

if (answer == '1') {

player.push(getCard());

}

if (getSum(player) > 21) {

answer = '0';

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

} else if (getSum(player) == 21) {

alert('У вас Black Jack');

alert('Дилер берет карту');

dealer.push(getCard());

if (getSum(dealer) == 21) {

answer = '0';

alert('У вас ничья ' + getStatus() + ' У дилера: ' + getSum(dealer) + ' и у вас: ' + getSum(player));

} else {

do {

alert(getStatus() + ' У дилера меньше, он берет еще карту.');

dealer.push(getCard());

answer = '1';

if (getSum(dealer) > 21) {

answer = '0';

alert('Вы выиграли! ' + getStatus() + ' У дилера перебор: ' + getSum(dealer));

}

} while (answer == '1')

}

} else {

if (answer != '1' && answer != '0') {

answer = '1';

alert('Дилер берет карту');

dealer.push(getCard());

alert(getStatus());

if (getSum(dealer) == getSum(player)) {

answer = '0';

alert('У вас ничья ' + getStatus() + ' У дилера: ' + getSum(dealer) + ' и у вас: ' + getSum(player));

} else if (getSum(dealer) < getSum(player)) {

do {

alert(getStatus() + ' У дилера меньше, он берет еще карту.');

dealer.push(getCard());

answer = '1';

if (getSum(dealer) > 21) {

answer = '0';

alert('Поздравляю, Вы выиграли! ' + getStatus() + ' У дилера перебор: ' + getSum(dealer));

}

} while (answer == '1')

} else {

answer = '0';

alert('Сожалею, Вы проиграли! ' + getStatus() + ' У дилера больше: ' + getSum(dealer));

}

}

}

} while (answer == '1');

</script>

Аналогично предыдущему примеру, используются условные операторы. Также используется оператор цикла while, позволяющий игроку продолжать. Генератор использует объявленные варианты значений карт - '6', '7', '8', '9', '10', 'J', 'Q', 'K', "A" – и возвращает одно новое значение для каждого шага игры.

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

Заключение

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

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

Приложение 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%

Список использованной литературы

  1. Роберт Гласс. Факты и заблуждения профессионального программирования. — "Символ-Плюс", 2004. — 240 с. — ISBN 5-93286-092-8, 978-5-93286-092-2.
  2. Роберт У. Себеста. Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. — 5-е изд. — М.: Вильямс, 2001. — 672 с. — 5000 экз. — ISBN 5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.).
  3. Теренс Пратт, Марвин Зелковиц. Языки программирования: разработка и реализация. — 4-е издание. — Питер, 2002. — (Классика Computer Science). — ISBN 978-5-318-00189-5.
  4. https://en.ppt-online.org/224815 / Лекции по программированию, в слайдах.
  5. Режим доступа: https://commons.wikimedia.org/w/index.php?curid=40832044 / TIOBE Index
  6. Режим доступа: https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F / Язык программирования
  7. Режим доступа: https://en.wikipedia.org/wiki/Measuring_programming_language_popularity / Measuring programming language popularity
  8. Режим доступа: https://js.do / Online JavaScript Editor
  1. Хронологически первым из известных высокоуровневых языков программирования является Планкалюль (нем. Plankalkül — исчисление планов). Он был создан немецким инженером Конрадом Цюзе в 1943-1945 году для программирования компьютера Z4, однако был пригоден для работы с другими похожими вычислительными машинами. В силу исторических причин, создатель не имел возможность полноценно продолжать свою работу, и язык Планкалюль становится известен лишь в 1972 году. Вероятно, болея ранняя публикация работ Цюзе существенно повлияла бы на ход истории языков программирования.

  2. (Источник: https://en.ppt-online.org/224815 [4])

  3. Источник: TIOBE Software B.V. https://commons.wikimedia.org/w/index.php?curid=40832044 [5]