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

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

Содержание:

Введение

Актуальность темы исследования

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

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

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

Эта цель будет раскрываться через следующие задачи:

  1. Общая классификация языков программирования;
  2. Проблемы выбора языков программирования при разработке кроссплатформенных приложений

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

1. Общая классификация языков программирования

1.1. Эволюция языков программирования

По мере того как технология становится все более и более доступной широкой публике, растет и потребность в программистах. Написание компьютерных кодов и программ, оно же кодинг (от англ. "Coding"), - это навык, который приобретается и совершенствуется на протяжении долгого времени, но даже самый опытный программист когда-то был новичком.

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

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

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

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

На заре компьютеризации (в начале 1950-х г.г.), машинный язык был единственным языком, большего человек к тому времени не придумал. Языки низкого уровня мало похожи на нормальный, привычный человеку язык. Большие, громоздкие программы на таких языках пишутся редко. Зато если программа будет написана на таком языке, то она будет работать быстро, занимая маленький объем и допуская минимальное количество ошибок. Чем ниже и ближе к машинному уровень языка, тем меньше и конкретнее задачи, которые ставятся перед каждой командой.

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

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

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

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

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

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

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

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

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

Таблица 1.1 – характеристика современных языков программирования

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

Обзорная информация

Язык Dart (компания Google)

Объекты в Dart определяются с помощью классов и интерфейсов, как в C++ или Java. Идея его создания основана на том, чтобы сделать язык таким же привычным, гибким и динамичным как JavaScript.

Go (компания Google)

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

Ора

Создан для того, чтобы связать в себя интерфейс пользователя, логику сервера и базу данных ввода-вывода. Компилятор самостоятельно решает, где запушена программа и выполняет написанный код. Среда выполнения Opa объединяет собственный веб-сервер и систему управления базой данных, которые не могут быть заменены самостоятельными альтернативами. Opa поставляется бесплатно и на данный момент доступен для 64-х битных Linux и Mac OS X платформ, другие же порты пока разрабатываются.[3]

Sketch

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

Wolfram Alpha

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

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

На сегодняшний день существуют несколько языков программирования, которые имеют перспективные направления для развития. К их числу относятся: Elm, Rust, Kotlin, Crystal, Elixir. Они доказали свою состоятельность путем создания сильных сообществ, но они до сих пор не используются большинством консервативных IT-компаний.

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

Рисунок 1- Популярность Elm, Rust, Kotlin, Elixir (на основе данных StackOverflow и GitHub)[4]

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

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

Список основных языков программирования, которые используют большинство программистов

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

Ада • АПЛ • Ассемблер • ActionScript • ABAP/4 • AutoIt • AWK • BASIC • C • Кобол • C++ • C# • Cω • Clarion • Clojure • ColdFusion • Common Lisp • D • dBase • Delphi • Eiffel • Erlang • F# • Forth • Фортран • Gambas • Go • Groovy • HAL/S • Haskell • Icon • Java • JavaScript • Limbo • Lua • MATLAB • Object Pascal • Objective-C • OCaml • Oz • Оберон • Parser • Паскаль • Perl • PHP • PowerBASIC • PureBasic • Python • ПЛ/1 • Пролог • Ruby • Scala • Scheme • Smalltalk • SQL • PL/SQL • Tcl • Vala • Visual Basic • VB.NET

Академические:

Clean • Curry • Лого • ML • Модула-3 • РЕФАЛ • Симула • IEC61131-3 Instruction List • ST • FBD • Ladder Diagram (LD) • SFC

Эзотерические:

HQ9+/HQ9++ • INTERCAL • Brainfuck • Brainfork • Befunge • Malbolge • Piet • Spoon • Unlambda • Whitespace • FALSE

Прочие:

Алгол • Алгол 68 • Модула-2 • Miranda • Hope

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

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

Код на С:

#include

int main(void)

{

int month;

month = 13;

while (month != 0)

{

puts("Введите номер месяца (для выхода, введите 0): ");

scanf("\n%d", &month);

if ((month == 12) || (month == 1) || (month == 2))

{

printf("Зима \n \n");

}

if ((month == 3) || (month == 4) || (month == 5))

{

printf("Весна \n \n");

}

if ((month == 6) || (month == 7) || (month == 8))

{

printf("Лето \n \n");

}

if ((month == 9) || (month == 10) || (month == 11))

{

printf("Осень \n \n");

}

if (month > 12)

{

printf("Такого месяца нет.\n \n");

}

}

printf("Программа завершена. :)\n");

return 0;

}

Код на Python (вариант 1):

# -*- coding: utf-8 -*-

months = 13

while months:

print("Введите номер месяца (для выхода, введите 0): ")

months = int(input())

if (months == 12 or months == 1 or months == 2):

print('Winter')

elif (months == 3 or months == 4 or months == 5):

print('Spring')

elif (months == 6 or months == 7 or months == 8):

print('Summer')

elif (months == 9 or months == 10 or months == 11):

print('Autumn')

else:

print('To exit, enter "0"')

Код на Python (вариант 2):

# -*- coding: utf-8 -*-

month = {12 : 'Winter', 1 : 'Winter', 2 : 'Winter',

3 : 'Spring', 4 : 'Spring', 5 : 'Summer',

6 : 'Summer', 7 : 'Summer', 8 : 'Summer',

9 : 'Autumn', 10 : 'Autumn', 11 : 'Autumn'}

i = 13

while i:

print("Введите номер месяца (для выхода, введите 0): ")

i = int(input())

if ((i > 0) and (i < 13)):

print(month[i])

elif (i > 12):

print('Такого месяца не существует. Для выхода из программы введите "0".')

else:

print('Программа завершена.')

Код на Python (вариант 3):

print("Введите номер месяца (для выхода, введите 0): ")

m = 13

while m != 0:

m = int(input())

print (["Зима", "Весна", "Лето", "Осень"][((m+1) % 11) // 3])

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

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

Количество языков велико и их становится больше с каждым годом. Технологии шагают семимильными шагами и быстро устаревают, а с ними и некоторые языки программирования. По этой причине программистам приходится изучать новые языки с новыми технологиями. Есть языки, которые существуют и развиваются уже 20-25 лет. Например, С и Python.

Прикладное (системное) программирование - это программирование железа, систем на достаточно низком уровне. В этом направлении очень многое зависит от окружающей среды (ОС - операционной системы). Можно разрабатывать, начиная от ОС, драйверов до простых и сложных пользовательских программ. Другими словами, можно написать все, что захочется. В связи с тем, что зависимостей очень много, необходимо изначально продумать, под какую ОС будет разрабатываться ПО. Основные языки для системного программирования - это Assembler, С, С++, Python, Perl, Java.

Веб-программирование - в основном, подразумевается разработка всего, что связано с интернетом. Это сайты, блоги, скрипты, конструкторы, системы управления контентом и т.д. Здесь практически нет зависимости от ОС, но есть ряд других зависимостей связанных, например, с браузерами и другими программами. В большинстве случаев, когда речь идет о веб-программировании, используется ОС Linux, на которой выполняется код программы. Браузеры, в которых выводится результат выполненной программы, может быть любым и на любой ОС, которая сейчас существует. Таким образом, можно разработать один код, который будет работать только на одной ОС, но выполняться и использоваться любым пользователем на любой ОС. Основные языки веб-программирования - это Python, PHP, Perl, JS, Ruby, Java.

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

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

2.1. Сложности разработки кроссплатформенных приложений

Перед разработчиками приложений встает проблема разработки кроссплатформенных приложений, способных работать на разных устройствах и операционных системах. Например, на персональных компьютерах под управлением операционных систем Windows, Linux или macOS, на телефонах, планшетах, телевизорах и умных часах под управлением мобильных операционных систем Android и iOS или в веб - браузерах. Хорошим примером такой универсальной программы может служить программа облачного хранения файлов Dropbox, имеющая приложения для персональных компьютеров, мобильных устройств и веб-браузера.

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

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

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

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

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

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

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

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

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

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

Так, компания Microsoft предоставляет набор языков программирования для разработки приложений для Universal Windows Platform (единая платформа, работающая на персональных компьютерах, телефонах и планшетах) - C++, C#, Visual Basic и JavaScript[7]. Компания Apple предлагает разработчикам использовать языки программирования Objective-C и Swift для создания программ для операционных систем macOS, iOS, watchOS and tvOS[8]. А компания Google предлагает использовать язык Java[9] для разработки программ для операционной системы Android.

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

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

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

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

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

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

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

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

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

• Для каждой платформы можно использовать её родной язык программирования.

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

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

2.3. Совмещение нескольких языков программирования

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

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

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

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

Другим языком кроссплатформенного программирования является С++. Так как первая его версия была создана давно (относительно других языков, предлагаемых для разработки на современных платформах), то при выходе более новых языков программирования (Java, Objective-C, C#) создателям приходилось оставлять возможность подключения модулей на С++. Отчасти, это было вызвано тем, что при появлении этих языков большое количество алгоритмов уже были реализованы на С++. К тому же, язык С++ отличается лучшей производительностью, нежели языки с автоматической сборкой мусора, поэтому части программ, требующие высокой производительности, по-прежнему было необходимо разрабатывать на С++.

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

В качестве примера кроссплатформенного использования языка С++ можно привести алгоритмы кодирования и декодирования мультимедиа (JPEG, mp3, ffmpeg), реализованные на языке С++, которые используются почти ежедневно любым человеком, работающим с компьютером.

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

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

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

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

2.4. Выбор средств реализации пользовательского интерфейса

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

Можно выделить 3 основных технологии реализации пользовательского интерфейса:

A. Использование родных для платформы графических элементов.

B. Использование языка JavaScript и технологий HTML и CSS. Для краткости будем их далее называть JavaScript-технологиями.

C. Использование промежуточного графического движка, заменяющего родные графические средства (OpenGL, FireMonkey, Qt).

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

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

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

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

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

Можно дать следующие рекомендации по средствам для реализации пользовательского интерфейса.

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

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

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

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

2.5. Оценка практического опыта реализации кроссплатформенных приложений

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

Первый опыт применения кроссплатформенных технологий получен при создании мобильного приложения «Шахматная Планета» для платформы Android в 2011 году. Он заключался в применении веб-технологий для создания пользовательского интерфейса приложения. Бизнес- логика была реализована родными средствами на языке Java. В качестве достоинства выбранного подхода следует отметить, что процесс разработки шел относительно быстро, потому что у команды был опыт работы с веб-технологиями, а приложение для Android создавалось впервые, и родные технологии создания интерфейса не были хорошо освоены. Также веб-технологии хорошо себя зарекомендовали для реализации элементов интерфейса, с низким уровнем взаимодействия с пользователем. То есть, те элементы, которые нужны для отображения информации, а не для взаимодействия. Например, в приложени есть элемент «Нотация», необходимый для отображения ходов в шахматной партии, его реализация через веб-технологии не вызывает неудобства у пользователя. Совершенно противоположная ситуация возникла с элементом «Шахматная доска» - пользователю необходимо быстро получать реакцию на свои действия. Например, при игре на время или при перемещении фигуры. Реализация этого элемента с использованием веб-технологий плохо показала себя в плане производительности, после чего данный элемент был сделан с использованием родных средств.

В процессе разработки были выявлены и следующие неудобства:[11]

1) Основной проблемой стала скорость работы и отзывчивость интерфейса на действия пользователя.

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

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

3) Возникали проблемы с разными версиями браузеров на разных версиях операционных систем. Часто возникали ситуации, что одна функция работала на одной версии, но не работала на другой. Или в одной версии программа работала корректно, а в другой возникала ошибка либо в форматировании, либо в работе

Следующим шагом стало выделение части бизнес- логики в кроссплатформенный модуль в 2013 году. В качестве языка реализации был выбран язык C++, как широко распространенный и знакомый команде разработчиков. С языка Java на язык С++ был перенесен модуль, отвечающий за хранение и представление шахматной партии. В его функции входит хранение текущей позиции и ходов партии, добавление и удаление ходов, проверка шахматных правил, а также загрузка и сохранение партии в текстовый формат (PGN). В модуль было перенесено значительное количество функций, а суммарный размер исходных файлов модуля получился около 200 кб. После перенесения части бизнес-логики с языка Java на язык С++ скорость работы приложения визуально мало изменилась. С одной стороны код на С++ выполняется быстрее, с другой стороны, при вызове функций С++ из Java есть накладные расходы. Основным минусом такого подхода стала возросшая сложность структуры проекта, но плюсы от перехода все равно гораздо значительнее.

Большой опыт кроссплатформенного программирования был получен при создании в 2014 году приложения «Таблицы Ломоносова», используемого для доступа через сервер к таблицам семифигурных шахматных окончаний. У приложения есть реализации для платформ Android, iOS, Web и Windows. В таблицах шахматных окончаний хранятся точные оценки (ничья или выигрыш/проигрыш в указанное число ходов) всех позиций с семью и меньшим количеством шахматных фигур. Особая сложность возникает из-за того, что финальный размер файлов таблиц составляет более 100 терабайт, из-за чего их невозможно предоставить в полном объеме для локального доступа обычным пользователям. Поэтому было принято решение, что часть таблиц может использоваться локально, а часть удаленно через веб-сервер.

Шахматные таблицы хранятся в особом формате, алгоритм чтения которого был реализован на языке С++. Алгоритм был подключен к родным приложениям для платформ разработки Android, iOS и Windows, а также к веб-серверу для удаленного доступа. При этом, приложение для Android было реализовано на языке Java, для iOS на Objective-C, для Windows на Delphi, а веб-сервер на C#. Подключение кроссплатформенного модуля к родному приложению для Android было реализовано с помощью технологии JNI, для iOS - Objective-C++, для Windows код на языке С++ был скомпилирован в виде dll библиотеки и подключен к программе на языке Delphi с помощью метода статического связывания, и к веб-серверу на языке C# с помощью метода динамического связывания. Приложения могли работать как с локальными файлами таблиц, так и с веб-сервером, протокол общения с которым был реализован с использованием формата XML. Таким образом, приложение «Таблицы Ломоносова» получило наибольшее количество реализаций для нескольких платформ и подтвердило оправданность использования языка С++ в качестве базового для кроссплатформенной части проекта.

Другим примером является шахматная обучающая программа «Пешка», имеющая реализации для платформ Android, iOS, Web и Windows. Программа предоставляет пользователю возможность решать шахматные задачи, а также читать теоретические уроки в удобном интерактивном виде. База задач и уроков хранится в программе в особом формате cke. Алгоритм чтения этого формата реализован на языке С++, а визуальное представление - с помощью родных средств для каждой платформы. Технология подключения кроссплатформенного модуля к родным приложениям такая же, что и при локальном доступе к файлам в «Таблицах Ломоносова». Но показательным примером использования кроссплатформенного кода в этой программе является компонент "XMLPlayer". Данный компонент предоставляет возможность разыгрывания обучающих сценариев по шахматной партии. В его функции входит: автоматическое проигрывание ходов в партии, запрос правильного хода в позиции, отображение подсказок при ошибках, подсчет набранных очков, разыгрывание нескольких вариантов ходов в партии. Все эти функции требуют показа информации пользователю, а некоторые (вопросы) еще и непосредственного взаимодействия.

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

Кроссплатформенные средства также были использованы в веб-приложении «Игровая зона Chess King», с помощью них была реализована игра в шахматы против компьютера. Алгоритм игры в шахматы написан на языке C++ и используется в приложениях для платформ Android и iOS с использованием технологий, описанных выше. Чтобы подключить его к веб-приложению был использован инструмент Emscripten, также известный как WebAssembly, являющийся кросс - компилятором языка C++ в подмножество языка JavaScript. Для вызова функций, реализованных на C++, из кода на языке JavaScript, необходимо добавить в C++ проект отдельный модуль с перечислением внешних функций, никаких особых преобразований в коде C++ при этом делать не нужно. Единственной проблемой такого способа является высокая сложность отладки полученного веб-модуля, потому что он является результатом автоматического преобразования программы на языке C++.

Также к кроссплатформенным технологиям можно отнести вынесение части бизнес-логики программы на сторону сервера. Причем, благодаря единому стандарту доступа к веб-приложениям, реализацию программы можно делать практически на любом языке программирования. Эту особенность можно использовать для подключения готовой кодовой базы команды программистов, написанной на другом языке программирования. Например, в веб-приложении «Игровая зона Chess King» используются модули, написанные на языке Delphi, использовавшиеся в более ранних продуктах. Одним модулем является "Игровая компонента", реализующая алгоритм онлайн-игры в шахматы двух соперников. Общение с "Игровой компонентой" реализуется через веб-сокеты, а информация передается в формате JSON.

Другим модулем, реализованным на языке Delphi, является алгоритм жеребьевки игроков турнира по швейцарской системе. Алгоритм был реализован на языке Delphi много лет назад, и активно используется в программе "Шахматная Планета". Так как в нем довольно много тонких моментов, а программа использует много особенностей языка и информацию о низкоуровневом представлении структур данных, то было принято решение использовать готовый модуль, добавив в него специальные функции для веб-доступа по технологии ISAPI.

Заключение

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

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

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

Главными чертами этого языка должны быть как простота и поддержка современных конструкций языков программирования, так и, самое главное, беспроблемная стыковка с такими языками, как JavaScript, Java, Swift, C++.

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

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

  1. «Конституция Российской Федерации» (принята всенародным голосованием 12.12.1993) (с учетом поправок, внесенных Законами РФ о поправках к Конституции РФ от 30.12.2008 N 6-ФКЗ, от 30.12.2008 N 7-ФКЗ, от 05.02.2014 N 2-ФКЗ, от 21.07.2014 N 11-ФКЗ)
  2. Головин И. Г., Захаров В. Б., Мостяев А. И. Влияние тенденций современного общества на процесс создания, распространения и поддержки программ для мобильных устройств // Научный взгляд в будущее. - 2016. - Т. 4, № 2. - C. 41-51.
  3. Баклин Д. Профессиональное программирование приложений для iPhone и iPad / Джин Баклин ; [пер. с англ. ООО "Айдиономикс"]. - М. : Эксмо, 2013. - 672 с.
  4. Выбор языка программирования [Электронный ресурс] // Центр разработки для Windows [Официальный веб-сайт]. URL: https://docs.microsoft.com/ru-ru/windows/uwp/porting/getting- started-choosing-a-programming-language. Дата обращения: 11.02.2018
  5. Захаров В., Мальковский М., Мостяев А. Java или альтернативы? Опыт переноса приложений на платформу Android // Сборник научных трудов SWorld. - 2015. - Т. 5, №1(38). - C. 15-27.
  6. Захаров В., Мостяев А. Особенности переноса приложений на мобильные платформы // Программные системы и инструменты / Под ред. А. Н. Терехин. - Т. 15. - Издательский отдел факультета ВМК МГУ Москва, МГУ, 2017. - C. 16-24.
  7. Майер Р. Android 4. Программирование приложений для планшетных компьютеров и смартфонов / Рето Майер; [пер. с англ. ООО "Айдиономикс"]. - М. : Эксмо, 2013. - 816 с.
  8. Развитие языков программирования. Эволюция вычислительных систем [Электронный ресурс]. URL: http: //referatwork.ru (дата обращения: 10.01.2018).
  9. Симакова В.Е., Бедняк С.Г. Новые информационные технологии. Виртуализация // Научное сообщество студентов XXI столетия. Технические науки: сб. ст. по мат. VII междунар. студ. науч.-практ. конф. № 7. URL: http://sibac.info/archive/technic/7.pdf (дата обращения: 03.02.2018)
  10. Основы алгоритмизации и программирования: учеб. Пособие / Т.А. Жданова, Ю.С. Бузыкова. – Хабаровск: Изд – во Тихоокеан. Гос. Ун – та, 2011 – 567 с.
  11. Языки программирования [Электронный ресурс]. URL: http://life- prog.ru (дата обращения: 11.02.2018).
  12. Язык Wolfram Alpha - революция в области программирования // DailyTechInfo [Электронный ресурс]. URL: http://www.dailytechinfo.org/mfotech/5709-yazyk-wolfram-alpha- revolyuciya-voblasti-programmirovaniya.html (дата обращения:1.06.2017).
  13. McALLISTER N. InfoWorld. «10 языков программирования, которые могут перевернуть мир IT» // Компьютерные вести [Электронный ресурс]. URL: http://www.kv.by/content/325498-10- yazykovprogrammirovaniya-kotorye-mogut-perevernut-mir-it (дата обращения: 05.02.2018).
  14. The RedMonk Programming Language Rankings: January 2015 [Электронный ресурс]. URL: http://redmonk.com/sogrady/2015/01/14/language-rankings-1-15/ (дата обращения: 05.02.2018).
  15. Sketch - новый язык программирования, способный самостоятельно оптимизировать и завершать незаконченные участки кода // DailyTechlnfo [Электронный ресурс]. URL: http://www. dailytechinfo.org/infotech/5691-sketch-novyy-yazyk-programmirovaniya- sposobnyy-samostoyatelnooptimizirovat-i-zavershat-nezakonchennye- uchastki-koda.html (дата обращения: 1.06.2017).
  1. Языки программирования [Электронный ресурс]. URL: http://life- prog.ru (дата обращения: 11.02.2018).

  2. Развитие языков программирования. Эволюция вычислительных систем [Электронный ресурс]. URL: http: //referatwork.ru (дата обращения: 10.01.2018).

  3. McALLISTER N. InfoWorld. «10 языков программирования, которые могут перевернуть мир IT» // Компьютерные вести [Электронный ресурс]. URL: http://www.kv.by/content/325498-10- yazykovprogrammirovaniya-kotorye-mogut-perevernut-mir-it (дата обращения: 05.02.2018).

  4. The RedMonk Programming Language Rankings: January 2015 [Электронный ресурс]. URL: http://redmonk.com/sogrady/2015/01/14/language-rankings-1-15/ (дата обращения: 05.02.2018).

  5. Симакова В.Е., Бедняк С.Г. Новые информационные технологии. Виртуализация // Научное сообщество студентов XXI столетия. Технические науки: сб. ст. по мат. VII междунар. студ. науч.-практ. конф. № 7. URL: http://sibac.info/archive/technic/7.pdf (дата обращения: 03.02.2018)

  6. Головин И. Г., Захаров В. Б., Мостяев А. И. Влияние тенденций современного общества на процесс создания, распространения и поддержки программ для мобильных устройств // Научный взгляд в будущее. - 2016. - Т. 4, № 2. - C. 41-51.

  7. Выбор языка программирования [Электронный ресурс] // Центр разработки для Windows [Официальный веб-сайт]. URL: https://docs.microsoft.com/ru-ru/windows/uwp/porting/getting- started-choosing-a-programming-language. Дата обращения: 11.02.2018

  8. Баклин Д. Профессиональное программирование приложений для iPhone и iPad / Джин Баклин ; [пер. с англ. ООО "Айдиономикс"]. - М. : Эксмо, 2013. - 672 с.

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

  10. Захаров В., Мальковский М., Мостяев А. Java или альтернативы? Опыт переноса приложений на платформу Android // Сборник научных трудов SWorld. - 2015. - Т. 5, №1(38). - C. 15-27.

  11. Захаров В., Мостяев А. Особенности переноса приложений на мобильные платформы // Программные системы и инструменты / Под ред. А. Н. Терехин. - Т. 15. - Издательский отдел факультета ВМК МГУ Москва, МГУ, 2017. - C. 16-24.