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

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

Содержание:

Введение

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

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

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

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

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

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

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

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

В процессе написания данного курсового проекта использовалась следующая учебная литература: «Основы алгоритмизации и программирования» под редакцией Л. Г. Гагариной и В. Д. Колдаева, «Основы алгоритмизации и программирования (среда PascalABC.NET)» под редакцией И. Г. Фризен, «Основы алгоритмизации и программирования на Python» С. Р. Гурикова, а также учебники, представленные в методических рекомендациях. Помимо учебной литературы, для составления третьей главы изучались научные статьи В. Б. Захарова, М. Г. Мальковского, А. И. Мостяева в «International Journal of Open Information Technologies» – рецензируемом электронном журнале издательства «Лаборатория Открытых Информационных Технологий факультета ВМК МГУ им. М.В. Ломоносова». Вышеперечисленная литература использовалась потому, что она наиболее полно раскрывала выбранную тему курсового проекта и являлась надёжной по причине того, что выпускалась от имени престижных университетов и авторитетных учёных.

Глава 1. Сущность языков программирования

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

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

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

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

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

Становление языков программирования можно начать с революционных идей Ч. Бэббиджа, которые привели к созданию автоматических цифровых вычислительных машин, и высказанных им в 20-х гг. XIX в. следующих принципов для вычислительной техники (которые впоследствии стали фундаментальными): 1) автоматическое выполнение операций, т.е. без остановок, требующих участия человека; 2) программа должна вводиться в исполнительное устройство со скоростью, соизмеримой со скоростью выполнения операций; 3) для записи программы можно использовать перфокарты.[4]

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

На заре компьютерной эры, которым считается XX в., человек мог установить контакт с компьютером только при помощи машинного кода. Во времена того периода создатели языков программирования работали над тем, чтобы компьютер мог переводить эти языки на машинный код, и у них это получилось. Данное событие стало одним из величайших достижений 20-го столетия.[5]

На протяжении первой половины 20-го столетия формировалась среда программирования. Начало века связано с именем Джона Моучли, который создал системы кодирования машинных команд, используя специальные символы. Чуть позже Моучли совместно с другим программистом, Грейс Хоппер, начали использовать первые средства автоматизации программирования – языки Автокоды, впоследствии ставшими Ассемблерами. В конце 1940-х гг. Джоном Моучли была создана система, носящая название Short Code.[6] В 1944 г. для релейной машины «Марк I» под руководством Грейс Хоппер была написана подпрограмма для вычисления sin(x). В 1951 г. она же создала первый в мире компилятор. А в 1954 г. группа под её руководством разработала систему MATH-MATIC.

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

В 1954 году появился такой язык программирования, как FORTRAN. Далее, в 1958 году, усилиями Джона Маккартни был изобретён LISP. Результатом международного сотрудничества в области программирования в конце 1950-х явился ALGOL. В середине 1960-х трудом Томаса Курц и Джона Кемени появился специализированный язык программирования, состоящий из простых английских слов, имя которому – BASIC.

Долгое время BASIC не имел компилятора или интерпретатора, которые бы позволяли создавать полноценные exe-файлы. Лишь в 1975-м году Дик Уиппл и Джон Арнольд создали его первый компилятор. В этом же году фирма Micro Instrumentation and Telemetry Systems выпустила новую версию данного языка программирования.[8]

В начале 1960-х были предприняты попытки создать универсальный язык программирования. Первым детищем данного проекта стало появление PL/1 (Programming Language 1) в 1967 году. Он совмещал в себе особенности Фортрана, Кобола и Алгола. Затем на эту роль претендовал появившийся в 1968 году Алгол 68.[9]

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

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

Последующее развитие языка Паскаль привело к появлению библиотеки Turbo Vision и языка Object Pascal, который впоследствии стал основной для создания Delphi.[11]

Значительным вкладом в современное программирование послужило создание языка Си в 1972 году.[12] Первоначально этот язык был инструментом для реализации операционной системы UNIX на ЭВМ фирмы DEC. Однако он быстро стал применим и за пределами конкретной машины, операционной системы и задач системного программирования.[13]

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

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

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

Классификация языков программирования по типам задач представлена в таблице ниже.

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

Наименование задач

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

Задачи искусственного интеллекта

Lisp, Prolog, Multilisp, Commonlisp, Рефал, Planner, QA4, FRL, KRL, QLisp

Параллельные вычисления

Fun, Apl, Alfl, PARAlfl, ML, SML, PPL/1, Hope, Miranda, Occam, PFOR, Glypnir, Actus, параллельный Cobol, ОВС-ЛЯПИС, ОВС-Мнемокод, ОВС-Алгол, ОВС-Фортран, РА (1), РА (G)

Задачи вычислительной математики и физики

Occam, PFOR, Glypnir, Actus, параллельный Cobol, ОВС-ЛЯПИС, ОВС-Мнемокод, ОВС-Алгол, ОВС-Фортран, РА (1), РА (G)

Продолжение таблицы

Разработка интерфейса

Forth, C, C++, Ассемблер, Макроассемблер, Simula-67, OAK, Smalltalk, Java, РПГ

Разработка программ-оболочек, разработка систем

Задачи вычислительного характера

Algol, Fortran, Cobol, Ada, PL/1, Фокал, Basic, Pascal

Оформление документов, обработка больших текстовых файлов, организация виртуальных трёхмерных интерфейсов в Интернете, разработка баз данных

HTML, Perl, Tcl/Tk, VRML, SQL, PL/SCL, Informix 4GL, Natural, DDL, DSDL, SEQUEL, QBE, ISBL

Примечание – Источник: Гагарина Л. Г. Основы алгоритмизации и программирования: Учебное пособие / Л. Г. Гагарина – М.: ИНФРА-М, 2015 г. – С. 12

Простейшей классификацией является группировка языков программирования по уровням, которую ещё также называют классификацией по степени абстракции от аппаратуры.[14] Основных уровней у языков три: низкий, высокий и сверхвысокий. Соответственно в данной классификации выделяется три вида языков.

Низкий уровень языков программирования представлен находящимися в сильной зависимости от особенностей определённых ЭВМ и применимыми только на них языками, наборами операторов и изобразительных средств. Зависимость наблюдается от внутреннего языка, структуры памяти и т. д.[15] Основными представителями являются машинные или машинно-зависимые и машинно-ориентированные языки.

Как уже было написано выше, к языкам низкого уровня относятся так называемые машинные языки. Как сказано в учебнике С. А. Орлова: «Такие языки представляют собой свод правил кодирования инструкций для определённого типа ЭВМ с помощью чисел». Наиболее известные примеры языков такого вида – это Автокод, Ассемблер и Макроассемблер.[16]

Высокий уровень языков состоит из машинно-независимых языков таких, как Pascal, C, Basic и Си. Как сказано в учебнике С. А. Орлова: «Они имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы». Особенностью языков высокого уровня считается то, что они способны определять сложные структуры данных.

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

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

По типу транслятора языки бывают компилируемые и интерпретируемые. Компилируемыми языками считаются такие языки, как PL/M, Си, Ассемблер и Pascal. К числу же интерпретируемых языков относятся всем известные Basic и Java.[18]

Следующей рассматриваемой классификацией языков программирования является классификация по парадигме программирования. Прежде всего следует дать определение самой парадигме. В учебнике Е. Г. Алексеева можно найти следующее определение: «Это система идей и понятий, определяющих, в каком стиле будут написаны компьютерные программы, а также образ мышления программиста». По данной классификации языки подразделяются на процедурные, непроцедурные и объектно-ориентированные.[19]

Процедурные языки программирования также носят названия императивные или алгоритмические. Это проблемно-ориентированные языки, которые облегчают выражение процедуры как точного алгоритма и представляют собой не столько саму задачу (т. е., что нужно получить), сколько её решение (т. е., как это получить). Примерами могут служить такие языки программирования, как Fortran, ALGOL, PL/1, APL, BPL, COBOL, Pascal, C, Basic.[20]

Следует отметить, что процедурные языки в свою очередь подразделяются на структурные, операционные и параллельные. Для структурных (модульных, директивных) языков характерно, что одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т. д. (ALGOL, Pascal, Си, ПЛ/1). В операционных (неструктурных) языках используются несколько операций для записи одной алгоритмической структуры и допускается использование в явном виде команды безусловного перехода (в большинстве языков GOTO, ранние версии Basic и Фортрана). При использовании параллельных языков (другие названия – язык поддержки параллельных вычислений, язык реального времени) программа представляется как совокупность описаний процессов, которые могут выполняться одновременно или в режиме разделения времени (Ada, Modula-2, Oz).[21]

Ещё один вид языков программирования в их классификации по парадигмам – непроцедурные. Непроцедурные или декларативные языки описывают по большей части саму задачу (т. е., что нужно получить), а с помощью чего и как будет получено решение определяет уже компьютер. Среди таких языков отмечают LISP (Interlisp, Common Lisp, Scheme), SML, Haskell, Prolog.[22]

Непроцедурные языки делятся на функциональные и логические. На функциональных языках программа описывает вычисление некоторой функции, которая задаётся как совокупность более простых функций, делящихся на ряд задач (LISP, HASKELL, Miranda, SML, CaML, Hope). Важно отметить несколько особенностей функциональных языков: их основным элементом является рекурсия (вложенные циклы); в них нет оператора присваивания и циклов. Логические непроцедурные языки базируются на классической логике и применяются в системах логического вывода, в частности в экспертных системах (Prolog, Mercury).[23]

И завершают раскрытие классификации по парадигме программирования объектно-ориентированные языки. Для них характерен тот факт, что программа представляет собой описание объектов, их свойств или атрибутов, совокупностей или классов, отношений между ними, способов их взаимодействия и операций над объектами или методов (C++, Visual Basic, Eiffel, Oberon, Java, Delphi, Simula, Object Pascal, Python, Smalltalk, PHP и т. п.).

Подвидом объектно-ориентированных языков является язык сценариев (скриптов). В рамках данного языка программа представляет собой совокупность возможных сценариев обработки данных, выбор которых инициируется наступлением конкретного события, например, щелчок мыши или попадание курсора в ту или иную позицию (VBScript).[24]

Классификация по семейственной принадлежности включает в себя следующие группировки языков: С-семейство языков, Pascal-семейство языков, Ada-семейство языков, Lisp-семейство языков и Prolog-семейство языков.[25]

Каждое из вышеперечисленных семейств включает в себе подмножество языковых конструкций определённого языка. С-семейство языков состоит из С, С++, С++ARM, C++Std, C#, C9x, Limbo, Java, Objective C. Pascal-семейство представлено такими языками, как сам Pascal, Modula-2, Oberon, Oberon-2 и Component Pascal. Ada-семейство – это семейство универсальных и многофункциональных языков, к числу которых относятся Mesa, Euclid, сам язык Ada, Cedar, Modula 3 и Ada9x. Языки из семейства Simula широко применяются для решения задач имитационного моделирования. Среди них – сам язык Simula, Smalltalk и BETA. К числу Lisp-семейства относят языки Lisp, Planner, Scheme и Common Lisp, занимающиеся функциональным программированием. А представители Prolog-семейства – языки Prolog, Parlog и CLR(R) – близки к языкам логического программирования.[26]

Есть также ещё одна классификация языков программирования, помимо тех пяти, что были разобраны выше, – по поколениям. Всего выделяется пять поколений. В рамках первого поколения рассматривают машинные языки программирования, которые ориентированы на использование в конкретной ЭВМ, сложны в освоении и требуют хорошего знания архитектуры ЭВМ. Второе поколение представлено ассемблерами и макроассемблерами, которые уже более удобны для использования, однако по-прежнему являются машинно-зависимыми. В третьем поколении главенствуют языки высокого уровня с их мобильностью, человекоориентированностью и простотой в использовании.[27] Четвёртое поколение – это время непроцедурных, объектно-ориентированных, параллельных языков и языков запросов, ориентированных на непрофессионального пользователя и на ЭВМ с параллельной архитектурой.[28] И завершающее, однако не последнее (если учитывать прогресс современных языков программирования) поколение – пятое поколение языков искусственного интеллекта, экспертных систем и баз знаний, естественных языков. Языки этого поколения ориентированы на повышение интеллектуального уровня ЭВМ и интерфейса с языками.

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

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

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

2.1. Критерии выбора среды разработки программ

Среда разработки программ – это совокупность программных средств, используемая программистами для разработки программ или программного обеспечения.[29]

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

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

Современные же среды разработки, которые поддерживают объектно-ориентированную разработку программного обеспечения, включают также браузер классов, инспектор объектов и диаграмму иерархии классов. Существуют и среды разработки, предназначенные для нескольких языков, — это Eclipse или Microsoft Visual Studio. Однако зачастую среда разработки предназначается для определённого языка программирования.

Чётко определённых критериев, по котором можно выбирать ту или иную среду разработки программ, нет. Однако, в соответствии с несколькими информационными источниками[32], посвящённым сравнительному анализу различных сред разработки, можно выявить критерии, на которые программисты опираются при выборе наиболее подходящей для решения конкретной задачи среды.

Выбирать среду разработки программ нужно по следующим критериям: 1) функциональность, которая рассматривается как возможность программного обеспечения для реализации требуемых задач, инструментарий и разнообразность встроенных функций; 2) надежность, раскрывающаяся как способность программного обеспечения работать без ошибок и отказа компонентов на протяжении всего срока эксплуатации или времени, требуемого для решения поставленных задач; 3) удобство использования, проявляющееся в простоте интерфейса программного обеспечения и лёгкости в освоении работы с ним; 4) эффективность, как способность программного обеспечения выполнять поставленные задачи сохраняя общую производительность, не перегружая систему в которой оно установлено; 5) удобство сопровождения, проявляющееся в поддержке программного обеспечения разработчиком, включающей в себя создание новых версий продукта и поддержку пользователей; 6) портативность в виде способности программного обеспечения работать в различных операционных системах, а также в возможности его переноса в другую систему без потери в функционале; 7) доступность как лёгкость в получении программного обеспечения (доступность источника для скачивания, цена продукта).[33]

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

2.2. Критерии выбора языка разработки программ

Язык программирования определяется множеством показателей, которые характеризуют его отдельные свойства. Для оценки степени приспособленности языка программирования к выполнению возложенных на него функций необходимо ввести определённые меры, которые называют мерами эффективности.[35]

Эффективность определяет степень соответствия языка программирования своему назначению. Она измеряется либо количеством затрат, необходимых для получения определённого результата, либо результатом, который был получен при определённых затратах. Задачу проведения сравнительного анализа эффективности нескольких языков программирования и принятия решение на использование конкретного языка позволяет критерий эффективности.[36]

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

В качестве критериев эффективности выступают: читабельность (легкость чтения и понимания программ); легкость создания программ (удобство языка для создания программ в выбранной области); надёжность (обеспечение минимума ошибок при работе программ); стоимость (суммарная стоимость всего жизненного цикла языка); переносимость программ (легкость переноса программ из одной операционной среды в другую); универсальность (применимость к широкому кругу задач); четкость (полнота и точность официального описания языка).[37]

Рассмотрим эти показатели более подробно.

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

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

Говоря о читабельности, важно упомянуть и простоту языка программирования, ведь она значительно влияет на его читабельность. Язык должен иметь простой набор конструкций, которые могут быть использованы в качестве базисных элементов при создании программы. Желательно обеспечить минимальное количество различных понятий с простыми правилами их комбинирования. Этому мешает наличие в языке нескольких способ описания одного и того же действия.[39] Например, в языке С добавление единицы к целому числу можно записать четырьмя способами.[40] Сильное воздействие на простоту оказывает синтаксис языка: он должен прозрачно отражать семантику конструкций, исключать двусмысленность толкования. Предельно лаконичный синтаксис удобен при написании программы, однако усложняет её модификацию, поскольку в программе нелегко разобраться. Здесь нужен разумный компромисс – простота должна не быть чрезмерной, не должна приводить к загадкам расшифровки.

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

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

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

В некоторых языках наблюдается недостаток ортогональности. В языке Pascal функции могут возвращать значения только скалярного или указательного типа, а в языках С и С++ – значения всех типов, за исключением массивов (трактовка массивов в этих языках отличается от трактовки остальных типов).

В языке C локальные переменные могут быть определены только в начале блока (составного оператора), а в C++ переменные определяются в любом месте блока (но, конечно, перед использованием).

В языке Java величины скалярных типов (символьного, целого, вещественного и т. д.) не являются объектами, а величины всех остальных типов считаются объектами.[43] Скалярные типы называют примитивными типами, а типы объектов — ссылочными типами. Примитивные типы используют семантику значения (значение копируется во время присваивания). Ссылочные типы используют семантику ссылки (присваивание формирует две ссылки на один и тот же объект). Кроме того, в языке Java коллекции объектов и коллекции примитивных типов трактуются по-разному. Среди коллекций в Java только массивы могут содержать примитивные значения. Примитивные значения могут вставляться в коллекции других типов лишь в капсулах объектов оболочек. В языках Smalltalk и Python, напротив, все величины являются объектами, а все типы — ссылочными типами.[44] Таким образом, в этих языках применяется лишь семантика ссылки и все коллекции объектов создаются в ортогональном стиле.

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

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

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

Следующий критерий – это легкость создания программ. Она отражает удобство языка для написания программ в конкретной предметной области. Поскольку в каждой предметной области программы имеют свою специфику, очень важно выбирать язык, который ее учитывает.[46] К примеру, если это – исследование искусственного интеллекта, то тогда следует использовать язык Prolog или LISP, а при решении задач научных вычислений применять язык Fortran.

Вполне ожидаемо, что характеристики, от которых зависит этот показатель, во многом пересекаются с характеристиками читабельности, ведь чтение текста является неотъемлемым атрибутом и процесса создания, и процесса понимания программы.[47]

Составляющей легкости создания программ является концептуальная целостность языка. Она включает в себя три взаимосвязанных аспекта: простоту, ортогональность и единообразие понятий.[48] Простота языка предполагает использование минимального числа понятий. Ортогональность позволяет комбинировать любые языковые конструкции по определенным правилам. Единообразие понятий требует согласованного, единого подхода к описанию и использованию всех понятий.[49]

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

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

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

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

При рассмотрении критерия лёгкости создания программ, важно упомянуть естественность для приложений. Синтаксис языка должен способствовать легкому и прозрачному отображению в программах алгоритмических структур предметной области. Любой из типовых алгоритмов (последовательный, разветвляющийся, циклический, параллельный) имеет естественную структуру, которая должна поддерживаться программными операторами реализующего языка. Язык должен предоставлять структуры данных, операции и структуры управления, адекватные решаемой задаче. Естественность — это одна из важнейших причин популярности того или иного языка.[51] Язык, который ориентируется на характерные черты предметной области, может сильно упростить создание для нее программных приложений. Приведем примеры языков с очевидной направленностью на решение конкретных классов задач: Prolog (поддерживает дедуктивные рассуждения), Perl (предназначен для записи различных сценариев).[52]

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

Следующее, что рассматривается в критерии лёгкости создания программ, – это выразительность. Она может характеризовать две возможности. С одной стороны, она означает наличие очень мощных средств для представления структур данных и действий, описывающих большой объем вычислений с помощью очень маленькой программы (языки APL, Snobol, Icon, SETL).[55] С другой стороны, выразительность позволяет записывать вычисления в более удобной и компактной форме. Например, в языке С запись х++ удобнее и короче представлять в виде х = х + 1. Аналогично, булевы операции «and then» и «or else» в языке Ada позволяют указать сокращенное вычисление булевых выражений. В языке Pascal циклы с известным количеством повторений проще создавать с помощью оператора «for», чем с помощью оператора «while». Нет сомнений в том, что все эти возможности облегчают разработку программ.

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

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

Первый фактор – проверка типов. Принципиальным средством достижения высокой надежности языка является система типизации данных.[57] В ходе проверки типов анализируется совместимость типов в программе. Разные языки обеспечивают разную полноту проверки типов. Достаточно слабой считают проверку типов в языке С. Языки с динамической типизацией вообще относят эту проверку только к периоду выполнения программы. Наиболее полную проверку гарантирует языка Ada: в процессе компиляции программы проверяются типы практически всех переменных и выражений. Такой подход фактически устраняет ошибки типов при выполнении программы. В языках Pascal, Ada и Java диапазон изменения индексов является частью объявления массива и тоже подвергается проверке.[58] Данная проверка очень важна для обеспечения надежности программы, поскольку индексы, которые выходят за пределы допустимого диапазона, часто создают серьезные проблемы.

Ещё один фактор – обработка исключений. Исключением называют аварийное событие, которое обнаруживается во время выполнения программы (аппаратом исключений). В результате авария устраняется, и программа продолжает работу. Подобный механизм значительно повышает надежность вычислений. Языки Ada, C++, C# и Java позволяют обрабатывать исключения, хотя во многих других языках этот механизм отсутствует.[59]

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

В завершение рассмотрения критерия надежности стоит отметить, что на неё прямо влияют читабельность и легкость создания. Чем выше значения этих показателей, тем надежнее будет программа.[60]

Далее рассмотрим критерий стоимости. Суммарная стоимость языка программирования складывается из нескольких составляющих.[61]

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

Вторая составляющая – это размер стоимости трансляции программы, которая зависит от возможностей используемого компилятора.[62] Чем совершеннее методы оптимизации, тем дороже стоит трансляция. В итоге создается эффективный код: резко сокращается размер программы и/или возрастает скорость ее работы.[63]

Следующая составляющая – стоимость создания, тестирования и использования программы. Этот фактор стоимости удобно проиллюстрировать на примере среды для языка Smalltalk. Данная среда состоит из окон, меню, механизма ввода данных с помощью мыши и набора средств, позволяющих свободно оперировать со Smalltalk-программой. Здесь программное решение может быть спроектировано, закодировано, протестировано, изменено и использовано с минимальными затратами времени и сил программиста. По современным представлениям, наличие в языке развитых конструкций и структур является лишь одним аргументом, влияющим на широту его использования. Наличие же подходящей среды программирования существенно усиливает применимость слабого языка. Прежде всего, в среде программирования должна присутствовать надежная, эффективная и хорошо документированная реализация языка программирования. Специализированные текстовые редакторы, средства моделирования и управления конфигурацией, а также утилиты тестирования, отражающие особенности как самого языка, так и порядка его использования, — это мощные ускорители всех этапов разработки программ. В итоге минимизируются время и затраты, требуемые программисту на решение какой-либо задачи.[64]

И последней составляющей является стоимость сопровождения программы. Исследования показали, что значительную часть стоимости используемой программы составляет не стоимость разработки, а стоимость сопровождения программы. Сопровождение — это процесс изменения программы после ее поставки заказчику.[65] Сопровождение включает в себя: исправление ошибок (17% времени и стоимости); изменения, связанные с обновлением операционного окружения (18% времени и стоимости); усовершенствование и расширение функций программы (65% времени и стоимости).[66]

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

Таким образом, в данной главе были рассмотрены несколько важных сторон разработки программ. В первом разделе были разобраны основные критерии выбора среды разработки программ. Второй раздел был посвящён критериям выбора языка разработки программ.

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

Глава 3. Выбор языков программирования при разработке кроссплатформенных приложений

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

Реальность XXI века такова: персональный компьютер уже не является единственным инструментом для выполнения программ и общения через интернет, зато появляется множество новых устройств – смартфонов, планшетов, умных часов и телевизоров. Большинство пользователей в своей повседневной жизни имеют несколько устройств и хотят использовать знакомые приложения на каждом из них.[68]

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

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

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

Компании, которые являются поставщиками операционных систем и платформ, предоставляют разработчикам свои средства для разработки приложений (так называемые «родные средства»). Эти средства базируются на каком-либо языке программирования и включают в себя набор системных библиотек.[71] Ключевое звено в данной курсовой работе – это язык программирования.

Известная всем компания Microsoft предоставляет набор языков программирования для разработки приложений для Universal Windows Platform. Данная платформа работает на персональных компьютерах, телефонах и планшетах.[72] В этот набор входят следующие языки: С++, С#, Visual Basic и Java Script. А компания Google предлагает использовать язык Java[73] для разработки программ для такой операционной системы, как Android.

Немного другая ситуация с созданием веб-приложений. У них есть две составляющие – клиентская (front-end) и серверная (back-end). Для каждой из них можно использовать свой язык программирования. Для клиентской части часто используется такой язык, как JavaScript. Для серверной части выбор языков велик: PHP, C#, Java, C++, Scala, Ruby, Python (Django), JavaScript (Node.js), Hack, Erlang, Haskell и Prolog. Такая многовариантность связана со стандартизацией общения между клиентской и сетевой частями. Реализация серверной части может происходить на любом языке, при условии, что она предоставляет интерфейс доступа, который соответствует стандарту.

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

3.2. Варианты решения проблем выбора языков программирования

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

Одним из самых распространённых фреймворков является Qt, позволяющий создавать приложения на языке С++ для большого количества платформ – Unix, Windows, macOS, Android, iOS.[75] Он обладает встроенными библиотеками для взаимодействия с платформой на языке С++, а также встроенным редактором интерфейса.

Ещё одним часто применимым вариантом кроссплатформенных фреймворков являются реализации, которые используют веб-технологии, в особенности язык JavaScript. По причине того, что платформы, предназначенные для широкого круга пользователей, не могут существовать без возможности отображения веб-содержимого, то программы, написанные на языке JavaScript и использующие HTML и CSS для отображения, могут быть запущены практически на всех платформах.[76] Также есть специальные библиотеки, упрощающие процесс создания таких приложений и расширяющие их возможности. К примеру, Apache Cordova для мобильных платформ и React для веб-сайтов и персональных компьютеров.

Другой пример кроссплатформенного фреймворка является комплекс пакетов Delphi RTL и FireMonkey. Существуют реализации для платформ Windows, Unix, macOS, iOS и Android. Данный фреймворк имеет две составляющие – среду выполнения (Delphi RTL) и кроссплатформенную библиотеку интерфейса (FireMonkey).

Отдельно стоит написать о средствах для создания игровых программ. Они зачастую уже базируются на фреймворке или кроссплатформенном движке. Пример – игровой движок Unity, предлагающий разработку на языке С#. Этот движок доступен для многих платформ, включая Windows, Unix, macOS, iOS и Android.[77]

Ещё одним возможным решением является разделение приложения на бизнес-логику и интерфейс, где бизнес-логика является кроссплатформенной частью. Для подобного разделения есть несколько доступных вариантов. К примеру, язык C# активно используется в программировании для Windows и Web, и обладает специальной интегрированной средой разработки (IDE) Xamarin, которая применяется для создания приложения для мобильных платформ Android и iOS.[78] Помимо этого, язык поддерживается на macOS и Unix. Если говорить иначе, то бизнес-логика, которая написана на языке C#, может быть применима на всех популярных платформах, и подключена с помощью специальных средств разработки, к родному интерфейсу системы.

Есть ещё один язык кроссплатформенного программирования, и это – С++. По причине того, что его первая версия была создана много лет назад, то при выходе обновлённых языков программирования (Java, Objective-C, C#) разработчикам приходилось оставлять возможность подключения модулей на С++. В каком-то смысле, это было вызвано тем, что при появлении этих языков очень много алгоритмов уже были реализованы на С++. К тому же, для языка С++ характерна более высокая производительность, чем у языков с автоматической сборкой мусора, поэтому части программ, требующие высокой производительности, по-прежнему было необходимо разрабатывать на С++.[79]

Как результат, в настоящее время программный код на языке С++ можно использовать на любой популярной платформе, при этом сочетая с другим языком программирования. Для Windows и Unix это производится через динамически подключаемые библиотеки (.dll и .so), для Android с помощью технологии Java Native Interface (JNI), а для macOS и iOS компилятор языка Objective-C полностью поддерживает компиляцию языка С++.[80] А новый язык Swift для разработки для платформ macOS и iOS поддерживает связь с языком Objective-C. Подключить С++ к языку JavaScript можно несколькими способами — с помощью инструментов Emscripten и WebAssembly, которые могут кросскомпилировать язык С++ в JavaScript и с помощью родных расширений для Node.js (Native Addons).[81]

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

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

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

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

Имеется 3 основных технологии реализации пользовательского интерфейса: 1) использование родных для платформы графических элементов; 2) использование языка JavaScript и технологий HTML и CSS (JavaScript-технологии); 3) использование промежуточного графического движка, заменяющего родные графические средства (OpenGL, FireMonkey, Qt).[84]

Рассмотрим первую технологию.

Родные технологии позволяют создавать интерфейс, который максимально полно отвечает рекомендациям разработчиков платформ.[85] Программы имеют более привычный вид для пользователей; пользователи знают, где найти нужные функции. Помимо прочего, есть доступ к большому дополнительному набору компонент, которые созданы производителями платформ и разработчиками со стороны. Родной интерфейс во время работы нуждается в малом количестве ресурсов и отличается хорошей реакцией. Один недостаток – для каждой новой платформы интерфейс программы нужно создавать заново по требованиям этой платформы, её редактора интерфейса и родного языка программирования.

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

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

Рассмотрим третью технологию.

Использование промежуточного графического движка, прежде всего, востребовано в приложениях, которые содержат сложные графические объекты, с элементами движения и наличием слоев. В особенности, идеально подходит для целей подобного рода библиотека OpenGL.[87] Использование же таких движков для написания общего пользовательского интерфейса хотя и решает задачу переносимости, делает интерфейс приложений непохожим на родной интерфейс устройства. Разработчикам промежуточных движков нужно постоянно успевать за разработчиками операционных систем, занимающихся реализацией всё новых и новых возможностей.[88] Зачастую поддержка новых функций в промежуточный слой включается с видимым опозданием. Всё это может привести к значительному усложнению разработки и уменьшению конкурентоспособности приложения, которое полностью написано с использованием промежуточного движка.

Как можно увидеть, любая из технологий обладает своими достоинствами и недостатками. Соответственно возникает вопрос о совмещении в одном проекте разных технологий. Технически это реализуется путём добавления специальных функций-обработчиков событий для графических элементов. При этом функции-обработчики событий и функции отображения графических элементов могут быть написаны на разных языках программирования.[89] В программе формы с родными графическими элементами могут существовать вместе с HTML-формами и формами, которые используют специфический графический движок.[90]

Есть ряд рекомендаций по средствам для реализации пользовательского интерфейса.

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

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

Если же говорить в общем, то в целях переносимости нужно стараться реализовать на JavaScript по возможности большую часть пользовательского интерфейса. Однако следует помнить, что JavaScript может не поддерживать специфические функции и не работать со всеми графическими элементами, доступными на устройстве, поэтому эта технология не подходит в случае, если данная функциональность действительно нужна.[92] К примеру, дизайн, который доступен в HTML-разметке, может не соответствовать принятому на устройстве дизайну. При наилучшем раскладе потребуется кодировать и отлаживать сложную логику взаимодействия частей программы, в худшем же случае это приведет к значительному торможению программы и связанных с этим неудобствам.[93]

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

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

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

Заключение

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

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

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

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

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

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

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

Список использованных источников

  1. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – 415 с.
  2. Гагарина Л. Г. Основы алгоритмизации и программирования: Учебное пособие / Л. Г. Гагарина – М.: ИНФРА-М, 2015 г. – 413 с.
  3. Бен-Ари М. Языки программирования. Практический сравнительный анализ / М. Бен-Ари – СПб.: Мир, 2000. – 366 с.
  4. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Орлов – СПб.: Питер, 2013. – 688 с.: ил.
  5. Фризен И. Г. Основы алгоритмизации и программирования (СРЕДА Pascal.NET) : учеб. пособие / И. Г. Фризен. – М. : ФОРУМ ИНФРА-М, 2017. -392 с.
  6. Москат, Н.А. Операционные системы и кроссплатформенное программирование: учебно-методическое пособие для курсовой работы / Н.А. Москат; ФГБОУ ВО РГУПС. – Ростов н/Д, 2017. – 23 с.
  7. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – 44 с.
  8. Майер Р. Android 4. Программирование приложений для планшетных компьютеров и смартфонов / Рето Майер ; [пер. с англ. ООО «Айдиономикс»] – М. : Эксмо, 2013. – 816 с.
  9. Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html
  10. Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform
  11. Критерии качества программного средства [Электронный ресурс]. URL: http://fkn.ktu10.com/?q=node/741/
  12. Основы алгоритмизации и программирования: учеб. пособие / Т. А. Жданова, Ю. С. Бузыкова. – Хабаровск: Изд-во Тихоокеан. гос. ун-та, 2011. – 56 с. Режим доступа:

http://pnu.edu.ru/media/filer_public/2013/02/25/book_basics.pdf

  1. Программирование и основы алгоритмизации : Для инженерных специальностей технических университетов и вузов. /А.Г. Аузяк, Ю.А. Богомолов, А.И. Маликов, Б.А. Старостин. Казань: Изд-во Казанского национального исследовательского технического ун-та - КАИ, 2013, 153 с. Режим доступа: http://au.kai.ru/documents/Auzyak_Progr_osn_alg_C_2013.pdf.
  2. Основы алгоритмизации и программирования : учебное пособие / Г. Р. Кадырова. – Ульяновск : УлГТУ, 2014. – 95 с. Режим доступа:

http://venec.ulstu.ru/lib/disk/2014/137.pdf

  1. Белов П.М. Основы алгоритмизации в информационных системах: Учебн. пособие. - Спб.: СЗТУ, 2003. – 85с. Режим доступа:

http://www.ict.edu.ru/ft/005406/nwpi225.pdf

  1. Основы алгоритмизации и программирования: Метод. указ. / Сост.: И.П. Рак, А.В. Терехов, А.В. Селезнев. Тамбов: Изд-во Тамб. гос. техн. ун-та. Режим доступа: http://www.ict.edu.ru/ft/004758/terehov.pdf.
  2. Макаров В. Л. Программирование и основы алгоритмизации.: учебн. пособие. - Спб., СЗТУ, 2003, - 110с. Режим доступа:

http://window.edu.ru/resource/126/25126/files/nwpi223.pdf

  1. Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy
  2. Алексеев Е. Г., Богатырев С. Д. Информатика. Мультимедийный электронный учебник. Режим доступа: http://inf.e-alekseev.ru/text/Classif_inf.html
  1. Кроссплатформенные приложения – это приложения, которые могут работать в различных операционных системах (например, в системах IOS, Android и т. п.)

  2. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 10

  3. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 33

  4. Фризен И. Г. Основы алгоритмизации и программирования (СРЕДА Pascal.NET) : учеб. пособие / И. Г. Фризен. – М. : ФОРУМ ИНФРА-М, 2017. – С. 5

  5. Кадырова Г. Р. Основы алгоритмизации и программирования : учебное пособие / Г. Р. Кадырова. – Ульяновск : УлГТУ, 2014. – С. 14

  6. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 36

  7. Гагарина Л. Г. Основы алгоритмизации и программирования: Учебное пособие / Л. Г. Гагарина – М.: ИНФРА-М, 2015 г. – С. 7

  8. Фризен И. Г. Основы алгоритмизации и программирования (СРЕДА Pascal.NET) : учеб. пособие / И. Г. Фри-зен. – М. : ФОРУМ ИНФРА-М, 2017. – С. 9

  9. Гагарина Л. Г. Основы алгоритмизации и программирования: Учебное пособие / Л. Г. Гагарина – М.: ИН-ФРА-М, 2015 г. – С. 7

  10. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 12

  11. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 36

  12. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 4

  13. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 13

  14. Алексеев Е. Г., Богатырев С. Д. Информатика. Мультимедийный электронный учебник. Режим доступа: http://inf.e-alekseev.ru/text/Classif_inf.html (Дата обращения: 01.07.2019)

  15. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 5

  16. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 33

  17. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Орлов – СПб.: Питер, 2013. – С. 34

  18. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 5

  19. Алексеев Е. Г., Богатырев С. Д. Информатика. Мультимедийный электронный учебник. Режим доступа: http://inf.e-alekseev.ru/text/Classif_inf.html (Дата обращения: 01.07.2019)

  20. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Орлов – СПб.: Питер, 2013. – С. 34

  21. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 6

  22. Алексеев Е. Г., Богатырев С. Д. Информатика. Мультимедийный электронный учебник. Режим доступа: http://inf.e-alekseev.ru/text/Classif_inf.html (Дата обращения: 01.07.2019)

  23. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 35

  24. Алексеев Е. Г., Богатырев С. Д. Информатика. Мультимедийный электронный учебник. Режим доступа: http://inf.e-alekseev.ru/text/Classif_inf.html (Дата обращения: 01.07.2019)

  25. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 7

  26. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 35

  27. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 31

  28. Алексеев Е. Г., Богатырев С. Д. Информатика. Мультимедийный электронный учебник. Режим доступа: http://inf.e-alekseev.ru/text/Classif_inf.html (Дата обращения: 01.07.2019)

  29. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 24

  30. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 41

  31.  Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 9

  32. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Орлов – СПб.: Питер, 2013. – С. 41

  33. Критерии качества программного средства. [Электронный ресурс]. URL: http://fkn.ktu10.com/?q=node/741/ (дата обращения 01.07.2019)

  34.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  35. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Орлов – СПб.: Питер, 2013. – С. 51

  36.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  37.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  38.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  39. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Орлов – СПб.: Питер, 2013. – С. 30

  40.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  41.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  42.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  43. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 31

  44.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  45. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 31

  46. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 45

  47. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 46

  48. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 32

  49.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  50. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 13

  51. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 33

  52.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  53. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 13

  54.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  55. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 34

  56. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 35

  57.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  58. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 47

  59.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  60. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 35

  61.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  62. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 37

  63. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 47

  64.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  65. Колдаев В. Д. Основы алгоритмизации и программирования / В. Д. Колдаев. – М.: ИД «ФОРУМ» - ИНФРА-М, 2012. – С. 49

  66.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  67. Орлов С. А. Теория и практика программирования : Учебник для вузов. Стандарт 3-го поколения / С. А. Ор-лов – СПб.: Питер, 2013. – С. 37

  68. Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy (Дата обращения: 01.07.2019)

  69. Москат, Н.А. Операционные системы и кроссплатформенное программирование: учебно-методическое пособие для курсовой работы / Н.А. Москат; ФГБОУ ВО РГУПС. – Ростов н/Д, 2017. – С. 6

  70. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 31

  71. Москат, Н.А. Операционные системы и кроссплатформенное программирование: учебно-методическое пособие для курсовой работы / Н.А. Москат; ФГБОУ ВО РГУПС. – Ростов н/Д, 2017. – С. 7

  72. Языки и технологии программирования : тестовые задания к изучению курса «Языки программирования высокого уровня и технологии программирования» для обучающихся по всем программам бакалавриата и специалитета всех форм обучения / сост. Ю. С. Бузыкова, Т. А. Жданова, М. А. Шувалова. Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2014. – С. 34

  73. Майер Р. Android 4. Программирование приложений для планшетных компьютеров и смартфонов / Рето Майер ; [пер. с англ. ООО «Айдиономикс»] – М. : Эксмо, 2013. – С. 24

  74. Майер Р. Android 4. Программирование приложений для планшетных компьютеров и смартфонов / Рето Майер ; [пер. с англ. ООО «Айдиономикс»] – М. : Эксмо, 2013. – С. 38

  75.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  76. Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy (Дата обращения: 01.07.2019)

  77.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  78.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  79. Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy (Дата обращения: 01.07.2019)

  80. Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy (Дата обращения: 01.07.2019)

  81.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  82.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  83.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  84. Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy (Дата обращения: 01.07.2019)

  85.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  86.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  87. Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy (Дата обращения: 01.07.2019)

  88.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  89.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)

  90.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  91.  Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy (Дата обращения: 01.07.2019)

  92. Захаров В. Б., Мальковский М. Г., Мостяев А. И. Проблемы выбора языков программирования при разработке кроссплатформенных приложений//International Journal of Open Information Technologies. – 2017 - №7. Режим доступа: https://cyberleninka.ru/article/v/problemy-vybora-yazykov-programmirovaniya-pri-razrabotke-krossplatformennyh-prilozheniy (Дата обращения: 01.07.2019)

  93.  Многоплатформенность [Электронный ресурс] // Unity [Официальный веб-сайт]. URL: https://unity.3d.com/ru/unity/multiplatform (Дата обращения: 01.07.2019)

  94.  Supported Platforms [Электронный ресурс] // Qt Documentation [Официальный веб-сайт]. URL: http://doc.qt.io/qt-5/supported-platforms.html (Дата обращения: 01.07.2019)