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

Обзор языков программирования высокого уровня на примере языков Elm, Swift, Scala

Содержание:

Введение

Актуальность темы.

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

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

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

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

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

При выполнении курсовой работы пред нами были поставлены следующие задачи:

1. рассмотреть историю развития языков программирования

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

3. провести обзор языков программирования высокого уровня: Elm, Swift и Scala.

Метод исследования заключен в анализе, сравнении и обобщении литературы.

Структура работы.

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

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

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

Программирование появилось задолго до 50-х годов XX века. Первые идеи высказал ещё Чарльз Бэббидж (1792-1871), которого по праву считают отцом компьютера. Он не знал о транзисторах, микросхемах и мониторах, но достаточно точно описал основные принципы, на которых будут строится все вычислительные машины. Развила идею графиня Ада Лавлейс (1815-1852). Её место в истории до сих вызывает немало споров, но одно абсолютно точно – именно Ада фактически стала первым известным программистом. Благодаря её трудам стало понятно, что путь к эффективному использованию машин – алгоритмы, описанные в коде.

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

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

01 x y – добавление содержимого ячейки памяти y к ячейке x;

02 x y – аналогичная процедура с вычитанием.

В итоге код программы превращался в бесконечную череду цифр:

01 10 15 02 11 29 01 10 11…

Рисунок 1 – Компьютер 1940-х годов

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

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

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

Следующим этапом стало появление языка Фортран, основным предназначением которого была реализация математических вычислений. Он отличался хорошим качеством получаемых программ, а также развитыми средствами ввода-вывода информации. Кроме того, Фортран содержал собственную библиотеку стандартных программ. Данный язык разрабатывался в 1954-1956 годы крупной группой специалистов компании IBM под руководством Дж. В. Бэкуса. В июне 1956 г. была выпущена вторая версия данного языка - Фортран II, которая отличалась наличием подпрограмм, а также операторов связи между программными единицами.[2]

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

Параллельно с развитием языков программирования велись разработки операционных систем, что послужило появлению системы UNIX. Данная система была написана на языке ассемблера, что служило барьером в ее изучении. Поэтому для упрощения системного программирования Д. Ритчи и Б. Керниган разработали язык С, на котором данная система была переписана. Важно отметить, что UNIX-системы используются и сегодня.

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

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

1.2. Уровни языков программирования

В настоящее время разработаны классификации языков по уровню работы, это распределение самое распространённое. Выделяют 3 основных уровня: низкий, высокий и сверхвысокий.

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

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

Машинные языки (самый низкий уровень)

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

Некоторые работают с большой скоростью (красные стрелки): процессор черпает из памяти команды и манипулирует данными, видеокарта – особенно в 3D играх, потребляет огромные объёмы текстур, фигур, координат пикселей и прочих объектов для построения изображения на экране монитора. Другим (в силу ограничения скорости обмена информацией) столь высокие показатели и не нужны. Разнообразные внутренние и внешние устройства подключены на схеме зелёными стрелками.

Рисунок 2 – Схема работы процессора

Все команды процессора поступают из памяти на выполнение в двоичном виде. Формат, количество, подмножество инструкций зависят от его архитектуры. Большинство из них несовместимо друг с другом и следуют разным идеологиям. А также вид команды сильно зависит от режима (8/16/32… разрядность) и источника данных (память, регистр, стек…), с которыми работает процессор. Одно и то же действие может быть представлено различными инструкциями.

Процессор имеет команды сложения двух операндов (ADD X,Y) и прибавления единицы к указанному (INC X). Добавление тройки к операнду можно выполнить как ADD X,3 или троекратно вызвав INC X. И, в отношении разных процессоров, нельзя предсказать какой из этих способов будет оптимальным по скорости или объёму занимаемой памяти. Для удобства двоичную информацию записывают в 16-ричном виде. Рассмотрим часть привычной программы (язык C, синтаксис которого сходный с Java).

Код, реализующий те же действия в виде последовательности инструкций для процессора:

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

Плюсы:

  • Имеются широкие возможности использования процессора и аппаратуры компьютера.
  • Доступны все варианты организации и оптимизации кода.

Минусы:

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

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

Язык ассемблера (низкий уровень)

Сравним фрагменты прошлой программы в машинных кодах (по центру) и на языке ассемблера (справа):

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

Плюсы:

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

Минусы:

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

Самый популярный демонстрационный Java пример:

будет выглядеть (NASM синтаксис, с использованием Windows API и kernel32.lib) следующим образом:

Как и машинные коды, ассемблер чаще используется инженерами и системными программистами. На нём пишут аппаратно-зависимые части ядра операционных систем, критические по времени или особенностям реализации драйвера различных периферийных устройств. Но в последнее время к нему прибегают всё реже и реже, так как его применение сильно сужает переносимость программ на другие платформы. Иногда используют процесс дизассемблирования – создают ассемблерный листинг программы из цифровых кодов для разбора логики выполнения небольших фрагментов. В редких случаях, если первоначальный высокоуровневый код недоступен: анализ вирусов для борьбы с ними или потере исходного текста. Язык ассемблера причисляют к первому/второму поколению.

Языки группы C/Фортран (средний/высокий уровень)

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

Дополнительно эти меры привнесли улучшенную переносимость кода на другие платформы, более комфортную организацию командной работы. Одним из первых языков, поддерживающий всё вышеперечисленное был разработанный в 50-е годы прошлого века Фортран. Возможность создавать в текстовом виде с описанием логики выполнения используя циклы, ветвления, подпрограммы и оперируя массивами и представляя данные в виде вещественных, целых и комплексных чисел привела к тому, что за короткое время были созданы научные «фреймворки» и библиотеки. Всё это и стало следствием того, что Фортран имеет актуальность и развивается, пусть и в узкой научной среде.

Другая ветка развития языков этого уровня – C. Если Фортран стал инструментом учёных, то C создавался в помощь программистам, создающим прикладное ПО: операционные системы, драйвера и т. д. Язык позволяет вручную управлять распределением памяти, даёт прямой доступ к аппаратным ресурсам. C-программистам приходится контролировать низкоуровневые сущности, поэтому многие придерживаются мнения, что язык C – усовершенствованный ассемблер и его часто называют языком «среднего» уровня. Привнеся в ассемблер типизацию данных, элементы процедурного и модульного программирования язык C и сегодня является одним из основных для системного программирования, чему также способствует и бурное развитие микроэлектроники в последнее время. Всевозможные гаджеты, контроллеры, сетевые и прочие устройства нуждаются в драйверах, реализации протоколов для совместной работы и прочем относительно низкоуровневом ПО для реализации взаимодействия с аппаратурой. Все вышеперечисленное способствует востребованности языка и в настоящее время. Объектно-ориентированные и функциональные принципы получили дальнейшее развитие в виде C++, C#, Java, взяв многое от синтаксиса C.

Плюсы:

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

Минусы:

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

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

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

Функциональный язык программирования Elm, представленный американским программистом Эваном Чаплицким в 2012 году в ходе работы над своим дипломным проектом в Гарварде, обладает ключевой особенностью. Системы программирования, поддерживающие этот язык, содержат отладчик реального времени, с помощью которого легко можно изменить программный код в реальном режиме времени и проследить реакцию на внесённые изменения по выбранным параметрам. Подобные действия по изменению параметров записываются, могут быть просмотрены и проанализированы, а также тщательно и многократно оттестированы и проверены.

Этот современный язык программирования относится к парадигме функционального программирования, с поддержкой принципов функционального реактивного программирования (ФРП). Парадигма ФПР ориентирована на параллельную обработку данных, обеспечивает чёткую работу с динамическими потоками данных и позволяет создавать высоко-интерактивные приложения. Концепция, положенная в основу ФПР, была предложена и сформирована в конце прошлого века для упрощения технологии создания пользовательских интерфейсов, анимации, динамических систем. Поэтому программы, написанные на этом языке программирования, легко конвертируются в JavaScript – код, что немало важно для современных условий работы с браузерами всех категорий пользователей. Кроме того, ЯП ВУ Elm удобен и прост в использовании: небольшой по объёму программный код обеспечивает разработчику приложения возможность работать с мышью для воспроизведения любой (даже сложной) фигуры в приложениях или в браузере. Тем не менее, язык изначально – функциональный, о чём говорят его родственные связи с семейством языка Haskell. На рисунке 3 показаны взаимовлияния традиционных языков программирования и новых, ровесников двадцать первого столетия.

Elm, не смотря на ярко выраженную принадлежность к функциональной парадигме, может быть использован для создания различного уровня сложности веб-приложений, практически всегда имеется возможность встроить написанный на этом языке программный код в блок тегов на странице сайта, так как Elm-программа без труда компилируется в коды HTML, CSS JavaScript.

Рисунок 3 – Связи языков программирования высокого уровня

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

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

Рассмотрим новый язык с интересными связями, и, являющийся представителем вычислительной модели высокого уровня – язык Swift от компании Apple. Данный язык служит отличным полигоном для создания интерактивных приложений для мобильных устройств и в этом отчасти совпадает с предназначением ЯП ВУ Elm.[4]

Если рассмотреть генеалогические связи этого языка (рис. 3), то становится понятно, почему Swift такой яркий и его синтаксис вполне лёгкий для освоения современными прикладными программистами.

Во-первых, на его появление оказали влияние Си-подобные языки программирования, которые на протяжение десятков лет широко востребованы и освоены разработчиками ПО: это Java, Ruby, C++, Objectiv-C.

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

ЯП ВУ Swift сочетает в себе понятность Си-подобных языков, опирается на мощную динамическую объектную модель Objective-C, не уступает по быстродействию C++ и Java, обладает доступностью по отношению к интерфейсам прикладного программирования для различных операционных систем.

 Первая программа на новом языке должна выводить на экран слова “Hello, world”. С помощью Swift это делается так:

Простые типы данных:

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

Если же инициализатор отсутствует или не предоставляет достаточной информации, можно указать тип самостоятельно после переменной, разделив название и тип двоеточием:

При работе с массивами и ассоциативными массивами (словарями, dictionary) используются квадратные скобки ([]):

Чтобы создать пустой массив или dictionary, используется следующий синтаксис:

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

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

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

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

Язык программирования Scala является «симбиозом» Java и C#. Это не первый язык, комбинирующий ООП с функциональным подходом, но он начал набирать обороты в тот момент, когда развитие Java замедлилось. Более того, создатели Scala решили, что язык должен работать на виртуальной машине JVM и предоставлять доступ к Java-библиотекам.

Мартин Одерски начал разрабатывать Scala в начале 2000-х в стенах Лаборатории методов программирования EPFL. Он же ранее занимался разработкой Generic Java и компилятора Java фирмы Sun.

Внутренний релиз Scala появился в 2003 году. Первый публичный релиз вышел в начале 2004 года на Java-платформе, а в июне того же года – на .NET Framework (правда, с 2012 года эта платформа не поддерживается). Scala 2.0 увидела свет в 2006 году. Его компиляторы и библиотеки распространяются под лицензией BSD.

Язык Scala объединяет три вещи: статическую типизацию, объектно-ориентированный и функциональный подход.

Scala работает на виртуальной машине Java. Совместимость («свободное смешивание») этого языка с Java дает возможность писать на Scala Android-приложения. Кроме того, возможность компиляции в JavaScript позволяет разрабатывать веб-приложения на Scala.

Помимо упомянутых выше Java и C#, на Scala оказали влияние другие языки и технологии. Способ выражения свойств во многом заимствован из Sather. Из Smalltalk перекочевала концепция унифицированной объектной модели. Beta поделился идеей о вложенности всего подряд, включая классы. Абстрактные типы в Scala напоминают абстрактные типы сигнатур в SML и OCaml, обобщенные в контексте полноценных компонентов.

Кроме того, Scala перенял особенности таких функциональных языков, как Scheme, Standard ML и Haskell.

Scala — язык, работающий на JVM, поэтому для работы требует установленную JDK (минимальная версия 1.6). После установки JDK можно приступить к установке самой Scala.

Для того, чтобы все корректно работало из командной строки, рекомендуется прописать переменные среды JAVA_HOME и SCALA_HOME, а также дополнить переменную PATH путями к выполняемым файлам. На Linux и MacOS это делается так:

export JAVA_HOME=<путь к каталогу c установленной Java, в котором есть папка 'bin'>

export SCALA_HOME=<путь к каталогу c установленной Scala, в котором есть папка 'bin'>

export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin

На Windows команда немного другая:

set JAVA_HOME=<путь к каталогу c установленной Java, в котором есть папка 'bin'>

set SCALA_HOME=<путь к каталогу c установленной Scala, в котором есть папка 'bin'>

set PATH=%PATH%;%JAVA_HOME%\bin;%SCALA_HOME%\bin

Прописать эти опции постоянно можно в настройках системы: Control Panel → Advanced System Settings → Environmental Variables.

После выполнения всех манипуляций можно проверить результат, запустив:

> java -version

java version "1.8.0_31"

Java(TM) SE Runtime Environment (build 1.8.0_31-b13)

Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

> scala -version

Scala code runner version 2.11.6 -- Copyright 2002-2013, LAMP/EPFL

Простые скрипты и маленькие программы можно, конечно, компилировать и запускать вручную с помощью команд scalac и scala. Однако, по мере того, как количество файлов будет расти, ручная компиляция будет становиться все более нудной. Вместо этого используют системы сборки. Для сборки кода на Scala можно использовать стандартные для Java (неофициально) maven, gradle или ant, но сообщество и сами разработчики рекомендуют sbt (simple build tool)

Scala разрабатывался для простого и быстрого программирования приложений, поэтому в нём органично сочетаются возможности объектно-ориентированного и функционального программирования. На формирование этого языка оказали влияние такие ЯП ВУ, как Lisp, Haskell, Java, C#, он считается языком хорошей поддержки для компонентного программного обеспечения.[5]

Влияние Java на этот язык велико, на Scala можно писать программы лишь немного корректируя синтаксис Java, это тоже является плюсом, так как Java появился на десять лет раньше и следует проверенным и надёжным принципами «чистого» объектно-ориентированного программирования. Например, можно использовать Scala-коллекции из библиотек и неявные преобразования из данной коллекции в Java – коллекции, причём как в одну сторону, так и в другую сторону. Даже инструмент написания встроенных аннотаций совпадает у этих двух языков.[6]

Заключение

Поставленные цели и задачи были выполнены в данной курсовой работе.

В данной работе была рассмотрена тема основных операторов программирования высокого уровня.

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

- машинные коды;

- ассемблеры;

- алгоритмические языки;

- процедурные языки;

- объектно-ориентированные языки.

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

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

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

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

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

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

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

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

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

  1. Березин Б.И. Начальный курс С и С++ / Б.И. Березин, С.Б. Березин. М.: Диалог-МИФИ, 2005. 248 с.
  2. Бузыкова Ю.С. Языки и технологии программирования / Ю.С. Бузыкова, Т.А. Жданова, М.А. Шувалова. Хабаровск: Изд-во Тихоокеан. гос. ун-та, 2014. 44 с.
  3. Волкова И.А. Основы объектно-ориентированного программирования. Язык программирования С++ / И.А. Волкова, А.В. Иванов, Л.Е. Карпов. М.: Издательский отдел факультета ВМК МГУ, 2011. 112 с.
  4. Голицына О.Л., Попов И.И. Программирование на языках высокого уровня // М.: ФОРУМ. 2011. 496 с.
  5. Грацианова Т.Ю. Программирование в примерах и задачах. М.: БИНОМ, 2015. 354 с.
  6. Исаева Г.Н, Пахомов Д.А. Возможности современных языков программирования высокого уровня // под науч. ред. В.М. Артюшенко. М., 2015. С. 163-167.
  7. Исаева Г.Н, Клешнев И.Б., Функциональное программирование: эффективный инструмент решения современных задач. Современные информационные технологии / сборник трудов по материалам II-й международной научно-технической конференции 14 сентября 2016г. г. Королёв, «МГОТУ» Под общей науч. ред. док. техн. наук проф В.М. Артюшенко // М: Издательство «Научный консультант». 2016. С. 136-142.
  8. Лучников В.А. Программирование на языке Паскаль. Иркутск: ИрГУПС, 2014. 168 с.
  9. Тюгашев А.А. Основы программирования. СПб.: Университет ИТМО, 2016. 160 с.
  10.  Федоров Д.Ю. Основы программирования на примере языка Python. - СПб.: Питер, 2016. - 176 с.
  11. Фридман А.Л. Построение Интернет-приложений на языке Java // М.: Горячая линия–Телеком. 2012. 336 с.
  12. Язык программирования Swift. Русская версия. Электронный ресурс. Режим доступа: https://habrahabr.ru /post/ 225841 (дата обращения 05.02.2020).
  13. Scala. Язык программирования. Электронный ресурс. Режим доступа: http://progopedia.ru /language/scala// (дата обращения 05.02.2020).
  14. Язык программирования Swift. Русская версия. Электронный ресурс. Режим доступа: https://habrahabr.ru /post/ 225841 (дата обращения 05.02.2020).
  15. Very Long Term History. Электронный ресурс. Режим доступа: http:/www.tiobe.com/tiobe-index/ (дата обращения 05.02.2020).
  1. Тюгашев А.А. Основы программирования. СПб.: Университет ИТМО, 2016. 160 с.

  2.  Лучников В.А. Программирование на языке Паскаль. Иркутск: ИрГУПС, 2014. 168 с.

  3.  Федоров Д.Ю. Основы программирования на примере языка Python. СПб.: Питер, 2016. 176 с.

  4. Исаева Г.Н, Пахомов Д.А. Возможности современных языков программирования высокого уровня // под науч. ред. В.М. Артюшенко. М., 2015. С. 163-167.

  5. Scala. Язык программирования. Электронный ресурс. Режим доступа: http://progopedia.ru /language/scala// (дата обращения 05.02.2020).

  6. Язык программирования Swift. Русская версия. Электронный ресурс. Режим доступа: https://habrahabr.ru /post/ 225841 (дата обращения 05.02.2020).