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

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

Содержание:

ВВЕДЕНИЕ

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

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

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

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

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

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

1. Исследование предметной области

1.1 Парадигмы программирования

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

Одной из характеристик языка является его поддержка определенных парадигм программирования. Например, Smalltalk имеет прямую поддержку программирования объектно-ориентированным способом, поэтому его можно назвать объектно-ориентированным языком. Программы OCaml, Lisp, Scheme и JavaScript имеют тенденцию активно использовать функции, поэтому они называются «функциональными языками», несмотря на наличие переменных и многих императивных конструкций. [5, 9, 15]

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

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

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

На более продвинутом уровне переходят к изучению динамических типов данных (что предполагает более глубокое знание информатики) или объектно-ориентированного программирования (большинство современных программ создаются с использованием этой парадигмы). [4]

Рассмотрим различные парадигмы программирования.

Управление потоком в императивном программировании является явным: команды показывают, как вычисление происходит, шаг за шагом.

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

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

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

  • императивная парадигма наиболее близко напоминает собственно машинный код, поэтому программист гораздо ближе к “железу”;
  • из-за такой близости императивная парадигма была единственной, достаточно эффективной для широкого использования до недавнего времени.

Преимущества императивного подхода:

  • эффективность;
  • близость к «железу»;
  • популярность;
  • знаком программистам. [5, 9, 15]

Недостатки императивного подхода:

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

На рисунке 1 показано распределение языков программирования по группам.

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

D:\author24\Основы алгоритмизации и программирования (тема на выбор)\Языки программирования.png

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

Логическая программа разделена на три раздела:

  1. ряд определений/деклараций, определяющих проблемную область;
  2. заявления соответствующих фактов;
  3. постановка целей в форме запроса.

Возвращается любое выводимое решение для запроса. Определения и декларации строятся целиком из отношений. т.е. X является членом Y или X находится внутри между a и b, и т. д. [9, 15]

Преимущества логико-ориентированного программирования многообразны:

  • система решает проблему, поэтому само программирование сводятся к минимуму;
  • доказательство действительности разработанных на нём программ является простым.

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

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

Имеются следующие преимущества функционального программирования:

  1. Высокий уровень абстракции, особенно когда используются чистые функции, которые исключают многие нюансы программирования и, таким образом, устраняют возможность совершения многих классов ошибок;
  2. Отсутствие зависимости от операций присваивания. Эта независимость в отношении оценки делает функционально-ориентированные языки хорошими кандидатами для программирования параллельных компьютерных систем;
  3. Отсутствие операций присваивания делает функционально-ориентированные программы гораздо более пригодными для математического доказательства и анализа, чем настольные программы, поскольку функциональные программы обладают ссылочной прозрачностью. [9]

К недостаткам можно отнести следующие:

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

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

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

1.2 Объектно-ориентированный подход в программировании

Истоки ООП берут начало с 60-х годов XX века. Однако окончательное формирование основополагающих принципов и популяризацию идеи следует отнести к 80-м годам. Большой вклад внес Алан Кей.

Объектно-ориентированное программирование (ООП) — это парадигма, в которой объекты реального мира рассматриваются как отдельные сущности, имеющие собственное состояние, которое модифицируется только встроенными процедурами, называемыми методами.

Объектно-ориентированное программирование — это подход программирования, который использует классы и объекты для создания моделей, основанных на реальной среде. Объектно-ориентированное программирование может использовать коллекцию объектов, которые будут передавать сообщения при запросе конкретной услуги или информации. Объекты могут передавать, получать сообщения или обрабатывать информацию в виде данных. [7, 9, 15]

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

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

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

Механизм моделирования программы как совокупности объектов различных классов и, кроме того, использование классов как в качестве модификаций других классов, обеспечивает высокую степень модульности. [9, 15]

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

Инкапсуляция, наследование и полиморфизм — фундаментальные свойства, которыми должен обладать язык, претендующий называться объектно-ориентированным (языки, не имеющие наследования и полиморфизма, но имеющие только классы, обычно называются основанными на классах). Различные ОО языки используют совершенно разные подходы. Мы можем различать ОО языки, сравнивая механизм контроля типов, способность поддерживать различные программные модели и то, какие объектные модели они поддерживают.

Одной из причин использования объектно-ориентированного программирования является то, что оно упрощает сохранение и изменение существующего кода при создании новых объектов, наследующих характеристики от существующих. Это значительно сокращает время разработки и упрощает настройку программы. [9]

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

2. Низкоуровневые и процедурные языки программирования

2.1 Машинно-ориентированный язык Assembler

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

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

Каждый процессор или семейство процессоров имеет свой собственный набор инструкций машинного кода. Инструкции являются паттернами битов, которые в силу физического устройства соответствуют различным командам машины. Говорят, что процессор A совместим с процессором B, если процессор A полностью «понимает» машинный код процессора B. Если процессоры A и B имеют некоторое подмножество инструкций, по которым они взаимно совместимы, то говорят, что они одной архитектуры. Таким образом, набор команд является специфическим для одного класса процессоров. Новые процессоры одной архитектуры часто включают в себя все инструкции предшественника и могут включать дополнительные. Иногда новые процессоры прекращают поддержку или изменяют значение какого-либо кода команды (как правило, потому, что это необходимо для новых целей), влияя на совместимость кода до некоторой степени; даже почти полностью совместимые процессоры могут показать различное поведение для некоторых команд, но это редко является проблемой. [1]

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

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

Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла); повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др. [21]

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

Достоинства и недостатки ассемблера следующие:

  • минимальное количество избыточного кода (использование меньшего количества команд и обращений в память). Как следствие — большая скорость и меньший размер программы;
  • большие объемы кода, большое число дополнительных мелких задач;
  • плохая читабельность кода, трудность поддержки (отладка, добавление возможностей);
  • трудность реализации парадигм программирования и любых других сколько-нибудь сложных конвенций, сложность совместной разработки;
  • меньшее количество доступных библиотек, их малая совместимость;
  • непосредственный доступ к аппаратуре: портам ввода-вывода, особым регистрам процессора;
  • возможность написания самомодифицирующегося кода (т.е. метапрограммирования, причем без необходимости программного интерпретатора);
  • максимальная «подгонка» для нужной платформы (использование специальных инструкций, технических особенностей «железа»);
  • непереносимость на другие платформы (кроме двоично совместимых). [1, 3]

2.2 Программирование на языке Fortran

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

FORTRAN — один из самых ранних языков программирования. В оригинальных версиях использовались перфокарты для написания программ. С одной стороны, FORTRAN имеет огромное количество доступных библиотек. Тем не менее, Fortran также имеет много архаичных функций, особенно в более ранних версиях. [4]

Первоначально Fortran включал не очень понятный синтаксис с фиксированными полями (5-значный номер строки, маркер продолжения и область оператора (плюс область номера последовательности карт в некоторых версиях). Однако новые спецификации для FORTRAN, такие как Fortran 90, 95, 2003 и 2008, не требуют такого странного форматирования. Кроме того, многие компиляторы имеют дополнительные улучшения для нестандартного кода. Новые стандарты добавляют функциональность и полностью совместимы со старыми версиями. При необходимости различия между этими устаревшими версиями и современным стандартом будут выделены, так как существует значительная база кода, написанная в более старых версиях, особенно FORTRAN 77.

FORTRAN, язык программирования, созданный в 1957 году Джоном Бэкусом, который сократил процесс программирования и сделал компьютерное программирование более доступным. [8, 9]

Создание FORTRAN, дебютировавшее в 1957 году, ознаменовало собой значительный этап в развитии языков компьютерного программирования. Предыдущее программирование было записано на языке машинного (первого поколения) языка или сборки (второго поколения), что требовало от программиста писать инструкции в двоичной или шестнадцатеричной системе. Неээфективность такого программирования привело к поиску более простого и доступного способа общения с компьютерами. В течение трехлетнего этапа развития Бэкус возглавил команду из 10 сотрудников International Business Machines (IBM) для создания языка, сочетающего форму английского сокращения с алгебраическими уравнениями.

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

Позволяя создавать программы на естественном языке, которые работают так же эффективно, как и ручные, FORTRAN стал языком программирования, который был выбран в конце 1950-х годов. Он был обновлен несколько раз в 1950-х и 1960-х годах, чтобы оставаться конкурентоспособным с более современными языками программирования. FORTRAN 77 был выпущен в 1978 году, за ним последовал FORTRAN 90 в 1991 году и дальнейшие обновления в 1996 и 2004 годах. Однако языки четвертого и пятого поколений в значительной степени вытеснили FORTRAN за пределы академических кругов, начиная с 1970-х годов. [4, 9, 15]

2.3 Процедурный язык программирования Pascal

Паскаль — это процедурный язык программирования, разработанный в 1968 году и изданный в 1970 году Никлаусом Виртом и названный в честь французского математика и философа Блейса Паскаля. Pascal работает на различных платформах, таких как Windows, Mac OS и различных версиях UNIX/Linux.

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

Паскаль — это язык на основе Алгола и включает в себя множество конструкций Алгола. Алгол 60 является подмножеством Паскаля. Паскаль предлагает несколько типов данных и структуры программирования. Легко понять и поддерживать программы Pascal. [1, 2]

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

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

Особенности языка Pascal. Паскаль имеет следующие функции:

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

Ниже приведен простой код паскаль (листинг 1), который будет печатать слова «Hello, World!». 

Листинг 1 — Простая программа на Pascal

program HelloWorld;

uses crt;

begin

writeln('Hello, World!');

readkey;

end.

Определение переменной помещается в блок, начинающийся с ключевого слова var , с последующим определением переменных следующим образом: «var A_Variable, B_Variable ... : Variable_Type;»

Переменные Pascal объявляются вне тела кода функции, что означает, что они не объявлены в парах начала и конца, но они объявляются после определения процедуры/функции и перед ключевым словом begin. Для глобальных переменных они определяются после заголовка программы. [3]

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

Листинг 2 — Определение процедур

Function Func_Name(params...) : Return_Value;

Procedure Proc_Name(params...);

Многострочные комментарии заключены в фигурные скобки и звездочки как {* ... *}. Паскаль допускает однострочный комментарий, заключенный в фигурные скобки {...} (листинг 3).

Листинг 3 — Комментарии

{* Это многострочный

комментарий *}

{ Это однострочный комментарий }

Объявление типа используется для объявления типа данных идентификатора. Синтаксис объявления типа: type-identifier-1, type-identfier-2 = type-specifier;

Например, следующее объявление определяет переменные days и age как integer type, yes и true как Boolean type, name и city как тип строки, сборы и расходы как реальный тип (листинг 4). [3]

Листинг 4 — Определение переменных

type

days, age = integer;

yes, true = boolean;

name, city = string;

fees, expenses = real;

Основные переменные в Паскаль показаны ниже:

  1. Символ. Обычно один байт. Это целочисленный тип.
  2. Целое число. Самый естественный размер целого для машины.
  3. Числа с плавающей запятой. Значение с плавающей запятой с одиночной точностью.
  4. Логический. Задает истинные или ложные логические значения. Это также целочисленный тип.
  5. Перечислимый. Определяет пользовательский список.
  6. Поддиапазон. Представляет переменные, значения которых лежат в пределах диапазона.
  7. Строка. Сохраняет массив символов. [2, 3]

Язык программирования Pascal также позволяет определять различные другие типы переменных, таких как «Указатель», «Массив», «Записи», «Наборы и файлы» и т. д.

Все переменные должны быть объявлены до их использования в программе Pascal. За всеми объявлениями переменных следует ключевое слово var . Объявление определяет список переменных, за которым следует двоеточие (:) и тип. Синтаксис объявления переменной показан на листинге 5.

Константа — это объект, который остается неизменным во время выполнения программы. [2] Паскаль позволяет объявлять только константы следующих типов:

  • порядковые типы;
  • установочные типы;
  • типы указателей;
  • реальные типы;
  • строка.

Синтаксис для объявления констант показан на листинге 5.

Листинг 5 — Объявление констант

const

identifier = constant_value;

В таблице 1 показаны все арифметические операторы, поддерживаемые Pascal. Предположим, что переменная A имеет место 10, а переменная B имеет 20, тогда результаты будут таким как в таблице ниже.

Необходимо соблюдать форматирование в выводе программы. Переменная c должна быть отформатирована с общим числом цифр 7 и 2 цифрами после десятичного знака. Pascal допускает такое форматирование вывода с числовыми переменными. [1, 2, 3]

Таблица

Арифметические операторы

Оператор

Описание

Пример

+

Добавляет два операнда

A + B даст 30

-

Вычитает второй операнд с первого

A - B даст -10

*

Умножает оба операнда

A * B даст 200

/

Делит числитель на знаменатель

B / A даст 2

%

Оператор модуля и остаток после целочисленного деления

B% A даст 0

В данной главе были рассмотрены процедурные и низкоуровневые языки такие, как Fortran, Pascal и Assembler. Были рассмотрены их особенности и изучены элементы синтаксиса.

3. Объектно-ориентированные языки программирования

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

C# — это язык программирования с несколькими парадигмами, включающий сильную типизацию, императивность, декларативность, функциональность, объектно-ориентированность (основанный на классах) и различные другие дисциплины программирования, компонентно-ориентированного логики. Он был разработан Microsoft в рамках своей инициативы .NET, а затем одобрен в качестве стандарта Ecma (ECMA-334) и ISO (ISO/IEC 23270: 2006). C # — один из языков программирования, предназначенных для общей языковой инфраструктуры. [12]

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

  1. Модернизированный язык.

C# - модернизированная версия C++. Первоначально был язык C, который широко использовался. C++ стал добавлять объектную ориентацию к C, а C++ стал языком построения «реальных» приложений для Windows (согласно разработчикам, на C++). C++ использовался для написания инфраструктуры и приложений низкого уровня, в то время как разработчики Visual Basic писали бизнес-приложений.

C # привносит парадигму быстрого развития VB в мир разработчиков C++ с некоторыми очевидными изменениями. C # использует .NET Framework, что означает, что уже есть доступ к мощному движку форм, который был у разработчиков VB в течение многих лет. В него добавлены новые типы данных, такие как десятичный тип данных для выполнения финансовых расчетов.

  1. Безопасность.

C# является строго типизированным, что даёт ряд преимуществ. Например, невозможно использовать неинициализированные переменные. В C++ легко объявить переменную, а затем проверить ее значение; все, что было в адресе памяти, указанном этой переменной, будет показано, и это может привести к падению приложения. C# complier уведомит, если разработчик попытается использовать переменную, прежде чем инициализировать ее до некоторого допустимого значения. [9, 12]

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

  1. Объектно-ориентированный.

Хотя многие утверждают, что C++ объектно-ориентирован, C# переходит на другой уровень. Даже простые типы данных могут рассматриваться как объекты, а это означает, что INT имеет методы, связанные с ним. Например, вы можете использовать метод ToString для получения строкового значения для int.

Кроме того, символьные строки можно рассматривать как объекты и поддерживать различные методы, такие как ToUpper , ToLower , и многие другие. [9]

  1. Упрощенный синтаксис.

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

Файлы заголовков также были удалены из C#. Операторы имен и ссылочные операторы, “::” и “->” соответственно, были заменены одним оператором.

Возможно, одним из самых больших изменений является то, что типы данных int и bool теперь совершенно разные. Это означает, наконец, становится возможным закончить сопоставления и сравнения в if условиях. [12] Другими словами, следующий код даже не компилируется под C#:

int Counter = 14;

if (Counter = 14) {// сделать что-то}

Попытка скомпилировать этот код вернет сообщение об ошибке: “невозможно неявно преобразовать тип int в bool”.

C# также решает проблемы управления памятью, с помощью схемы сборщика мусора .NET. Элементы, на которые больше не ссылаются объекты, отмечаются, и сборщик мусора её очистит.

  1. Комментарии XML.

C# поддерживает введение комментариев XML. Отнюдь это не просто еще один способ добавить комментарии к коду. Комментарии XML могут фактически превратиться в документацию. Комментарии помещаются в формат XML и затем могут использоваться по мере необходимости для документирования кода. Эта документация может включать пример кода, параметров и ссылок на другие темы. Наконец, разработчик имеет смысл документировать свой код, потому что эти комментарии могут стать документацией, независимой от исходного кода. [8]

  1. Не только Microsoft.

C# - это не просто Microsoft. Microsoft выпустила C# для ECMA и она была опубликована в качестве стандарта. Кроме того, проект Mono - это попытка создать версию .NET Framework (часть под названием CLI) с открытым исходным кодом и версию C # с открытым исходным кодом для Linux.

  1. Все о компонентах.

Создание компонентов является простой задачей, так как программа ссылается на эти компоненты в коде. Пространства имен в C# заменяют множество головных болей из мира COM (Component Object Model), в которых приходилось выполнять поиск в реестре, и создавать объекты, и беспокоиться о таких вещах, как IUnknown и IDispatch. Используя C#, вы просто импортируете пространство имен, а затем начинаете использовать классы в этом компоненте.

  1. Сила быть небезопасной.

Многое связано с безопасностью типов в C#, но если вы хотите “водить без ремня безопасности”, вы можете это сделать. Если вам действительно нужно использовать указатели, например, вы можете использовать небезопасное ключевое слово, чтобы отметить блок кода. Это позволяет этому коду обходить проверку безопасности типа Framework и означает, что вы можете напрямую манипулировать памятью. Это делает C# невероятно мощным и является одним из преимуществ C # над VB.NET. [9]

  1. Возможности кроссплатформенного языка.

C# позволяет вам взаимодействовать с любым другим языком на платформе .NET. Многое было сказано о том, как вы можете создать компонент на одном языке и наследовать, и расширять этот компонент на другом языке, что было бы сложным, если не невозможным, с COM. [16]

3.2 Статически типизированный язык программирования общего назначения C++

C++ — это язык объектно-ориентированного программирования общего назначения (OOP), является расширением языка C. Это даёт возможность программировать на C++ в стиле «C» или же в «объектно-ориентированном стиле». В некоторых случаях он может использовать оба варианта, что показывает эффективным примером гибридного языка. [6, 16]

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

C++ — один из самых популярных языков, в основном используется в системном и прикладном программном обеспечении, при написании драйверов, и при разработке клиент-серверных приложений.

Основная особенность языка C++ в наборе шаблонных классов, в которых имеются самые часто используемые алгоритмы и контейнеры. Они уже написаны и могут много раз использоваться разработчиками при написании своих программ. Язык также облегчает объявление пользовательских классов. Классы используют функции для реализации определенных требований. Можно создавать множество объектов класса, у которых будут все свойства определенные для данной сущности. Объекты могут быть определены как экземпляры, и созданы прямо во время выполнения. Эти классы также могут быть унаследованы другими новыми классами, которые по умолчанию используют публичные свойства своих предков и реализует их в своих объектах. [17]

C++ включает в себя большое количество операторов, таких как:

  • арифметически операторы;
  • операторы сравнения;
  • операторы составного присваивания;
  • побитовые операторы;
  • логические операторы;
  • операторы работы с указателями и членами класса.

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

К основным концепциям С++ относятся полиморфизм, инкапсуляция и наследование. Они вместе составляют основную концепцию объектно-ориентированного программирования. [17]

C++ является одним из самых популярных языков программирования и работает на самых разных платформах оборудования и операционных систем. В качестве эффективного компилятора для собственного кода он реализует себя в таких областях, как системное программное обеспечение, прикладное программное обеспечение, драйверы устройств, встроенное программное обеспечение, высокопроизводительные серверные и клиентские приложения и развлекательное программное обеспечение, такие как видеоигры. Несколько групп разработчиков предоставляют как бесплатное, так и проприетарное программное обеспечение для компилятора C++, включая GNU Project, LLVM, Microsoft и Intel.

C++ сильно повлиял на многие другие популярные языки программирования, в первую очередь на C # и Java. [3, 16]

Язык программирования C++ имеет историю, восходящую к 1979 году, когда Бьёрн Страуструп работал над своей кандидатской диссертацией. Одним из языков, который был создан Страуструпом, был язык под названием «Simula», который, как следует из названия, является языком, в основном предназначенным для моделирования. Язык Simula 67, который был вариантом, с которым работал Страуструп, рассматривается как первый язык для поддержки парадигмы объектно-ориентированного программирования. Страуструп обнаружил, что эта парадигма очень полезна для разработки программного обеспечения, однако язык Simula был слишком медленным для практического использования.

С++ не слишком популярный язык среди начинающих программистов и существенно проигрывает таким языкам, как C# или Java. Тут можно выделить несколько причин. [23]

1. Высокий порог вхождения.

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

2. Слабое продвижение.

Ни для кого не секрет, как продвигаются такие языки как C# или Java корпорациями-владельцами: Microsoft и Oracle, со стороны Microsoft продвижения весьма заметно. Большинство технологий Microsoft затачиваются именно под C#. Хакатоны, проводимые Microsoft, опять же проходят с использованием C#.

Для C++ такой поддержки нет. Да, для него выпускаются различные инструменты, позволяющие облегчить работу и процесс создания приложений. Тут стоит вспомнить тот же Qt, недавно вышедший ReSharper C++ от JetBrains. В Visual Studio 2015 ввели поддержку некоторых нововведений из последних стандартов, плюс некоторые дополнительные функции — работать стало удобнее. Но с масштабом вышеупомянутых продвижений это всё же в сравнение не идёт. [23]

3. Специализация.

Несмотря на то, что C++ — язык, дающий разработчику, как говорится, все карты в руки, область его применения не всеобъемлюща и занимает определённую нишу. Конкуренты есть, это тоже оказывает свое влияние. Взять, например, мобильную разработку. Основные платформы заняты теми или иными языками: Windows Phone — C#, Android — Java, iOS — Objective-C. И это вовсе не означает, что под эти платформы нет возможности писать на C++, вопрос лишь в том, насколько это будет удобно и будет ли также эффективно. Для веба, разработка под который с каждым годом становится популярнее и популярнее, C++ тоже не очень подходит. Возможность работы с сокетами есть, библиотеки, наподобие Wt, есть. С учётом того, что мобильная и веб-разработка стали очень популярны и только набирают обороты, понятен выбор начинающих в пользу других языков.

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

Как видно из рисунка 2, по сравнению с прошлым годом C++ немного сбавил позиции, но на январь 2019 года всё-таки находится в лидерах, на четвертом месте. [22, 23]

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

Рисунок 2 — Рейтинг языков программирования от TIOBE [22]

3.3 Строго типизированный объектно-ориентированный язык программирования Java

Язык Java разработан компанией Sun Microsystems, создателем которого был Джеймс Гослинг, и выпущен в 1995 году в качестве основных компонентов компании Sun Microsystems — Java платформ (Java 1.0 [J2SE]). [6]

К его преимуществам можно отнести следующие:

  1. Объектно-ориентированный. В Java все является объектом. Дополнение может быть легко расширено, так как он основан на объектной модели.
  2. Платформонезависимый. В отличие от многих других языков, включая C и C++, Java, когда был создан, он не компилировался в платформе конкретной машины, а в независимом от платформы байт-коде. Этот байт код распространяется через интернет и интерпретируется в Java Virtual Machine (JVM), на которой он в настоящее время работает.
  3. Простой. Процессы изучения и введение в язык программирования Java остаются простыми.
  4. Безопасный. Методы проверки подлинности основаны на шифровании с открытым ключом.
  5. Архитектурно-нейтральный. Компилятор генерирует архитектурно-нейтральные объекты формата файла, что делает скомпилированный код исполняемым на многих процессорах, с наличием системе Java Runtime.
  6. Портативный. Архитектурно-нейтральный и не имеющий зависимости от реализации аспектов спецификаций — все это делает Java портативным. Компилятор в Java написан на ANSI C с чистой переносимостью, который является подмножеством POSIX. [10, 15]
  7. Прочный. Выполняет усилия, чтобы устранить ошибки в различных ситуациях, делая упор в основном на время компиляции, проверку ошибок и проверку во время выполнения.
  8. Многопоточный. Функции многопоточности, можно писать программы, которые могут выполнять множество задач одновременно. Введение в язык Java этой конструктивной особенности позволяет разработчикам создавать отлаженные интерактивные приложения.
  9. Интерпретированный. Java байт-код переводится на лету в машинные инструкции и нигде не сохраняется. Делая процесс более быстрым и аналитическим, поскольку связывание происходит как дополнительное с небольшого весом процесса.
  10. Высокопроизводительный. Введение Just-In-Time компилятора, позволило получить высокую производительность.
  11. Распространенный. Предназначен для распределенной среды интернета.
  12. Динамический. Программирование на Java считается более динамичным, чем на C или C++, так как он предназначен для адаптации к меняющимся условиям. Программы могут выполнять обширное количество во время обработки информации, которая может быть использована для проверки и разрешения доступа к объектам на время выполнения. [14]

4. Характеристика критериев выбора языка и среды разработки

4.1 Критерии выбора языка разработки

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

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

Ключевыми параметрами при выборе языка программирования являются:

  • Кроссплатформенность;
  • мультипарадигменность;
  • эффективность;
  • безопасность;
  • выразительность;
  • поддержка;
  • расширяемость;
  • поддержка методов параллельного программирования.

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

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

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

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

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

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

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

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

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

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

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

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

За структурным программированием появились объектно-ориентированное, декларативное и др. При всем этом разнообразии рассматриваемые далее языки, за исключением C, относятся к объектно-ориентированному типу, но при этом поддерживают и императивную и функциональную парадигмы, однако большинство кода на таких языках пишется в объектно-ориентированном стиле. ООП парадигма прочно, заняла свое место в разработке сложных программных систем благодаря основным принципам: наследованию, инкапсуляции, полиморфизму и абстрагированию. Так же как все структурные языки имеют реализации цикла, ветвления и следования, так и все ООП языки, так или иначе, реализуют языковые средства для организации сокрытия функционала за некоторым интерфейсом, полиморфного поведения объектов языка, и обеспечения низкой связанности компонентов. Однако все языки делают это по-своему. Набор конкретных языковых инструментов может сильно отличаться. [13]

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

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

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

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

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

Исходя из всего вышесказанного, следует, что писать высокопроизводительный код следует на C\C++, для написание крупного настольного или серверного ПО разумно использовать JAVA или C#, так как код на этих языках относительно просто писать и поддерживать, хотя С++ и C может использоваться для ускорения работы и поддержки аппаратных особенностей платформы, для прототипирования и проведения прикладных расчетов разумно использовать Python. При этом Python разумно использовать даже там, где требуется большое количество сложных вычислений, например, в научных расчетах. Это происходит из-за того, что профессиональная разработка ПО на этапе научного исследования затруднительна и, как правило, занимает продолжительное время, в то же время Python может использоваться достаточно просто, обеспечивая большой набор готовых инструментов, сокращая время необходимое для реализации алгоритма.

4.2 Критерии выбора среды разработки

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

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

1. Code Blocks. Подойдет для языков программирования: C, C ++, Fortran

Уровень навыка: отлично подходит для начинающих программистов

Code Blocks выделил ключевые слова, чтобы разработчик знал, правильно ли печатает встроенные функции. Интерфейс имеет интеллектуальный отступ, сворачивание кода и настраиваемое выделение, чтобы код был аккуратным и удобным для чтения. Отладчик имеет условные точки останова, точки останова данных и точки останова кода для легкого изучения кода во время выполнения. Поддерживаются множественные компиляторы, такие как GCC и MSVC++. Code Blocks работает на Linux, Mac и Windows и является Open Source. [19]

2. Eclipse. Подойдёт для языков программирования: C, C++, Python, Perl, PHP, Java, Ruby и т. д. Уровень навыка: у Eclipse есть много возможностей как для продвинутых, так и для начинающих программистов.

Эта IDE может использоваться со многими языками благодаря обширной библиотеке плагинов. В ней также есть много полезных дополнений для ускорения разработки проектов. Рабочие пространства и иерархия папок помогают сохранить различные проекты и части кода, организовать их, чтобы их можно было легко найти. Eclipse можно использовать кроссплатформенно, но для компиляции и запуска кода на Java требуется Java Runtime Environment (JRE), а также Java Development Kit (JDK).

3. Visual Studio. Подойдёт для языков программирования: Ajax, javascript, Visual Basic, Visual C#, Visual C++ и т. д. Уровень навыка: большинство уровней умения программировать.

Visual Studio существует уже очень давно, и есть много дополнительных функций, которые действительно делают ее отличной IDE. Она использует Xamarin, которая имеет кроссплатформенную разработку для приложений на Android, IOS и Windows. Использование опции совместного проекта делает код доступным для разных консольных приложений. Кроме того, редактор кода помогает найти ненужный или избыточный код, чтобы разработчик мог удалить все ненужное. [19]

4. IntelliJ IDEA. Подойдёт для языков программирования: HTML, javascript, Node JS и т. д. Уровень навыка: это самая ориентированная на разработчиков среда IDE в этом списке.

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

Таким образом, в рамках данной главы были рассмотрены конкретные критерии для выбора языка и среды разработки.

ЗАКЛЮЧЕНИЕ

В рамках данной работы были решены следующие задачи:

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

Таким образом, можно сделать следующие выводы. Если перед нами стоит задача разработки корпоративного программного продукта, такого как, десктопное приложение, то наиболее правильным выбором будет выбор таких языков программирования, как Java или C#. Также эти языки могут использоваться и при построении серверных частей веб-приложений.

Клиентская часть таких приложений, в любом случае, будет разрабатываться на HTML, CSS и JavaScript, потому что эти технологии являются господствующими при разработке клиентских частей веб-приложений. С++ сейчас является господствующим во многих областях коммерческого развития. Java тоже не отстаёт и используется очень активно. Можно бесспорно сказать, что два этих языках на сегодняшний день являются очень мощными инструментами, занимающие первые строчки рейтингов языков программирования.

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

В качестве среды разработки, наиболее лучшим вариантом будет Intellij Idea. Она подойдёт для разработки на огромном количестве языков программирования, в том числе и для веб-разработки.

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

  1. Алиев, Ю.А. Практикум по алгоритмизации и программированию на языке Паскаль/ Ю.А. Алиев. – В. – Питер: 2007. – 527с
  2. Алексеев, Е.Р. Турбо Паскаль 7.0/ Е.Р. Алексеев, О.В. Чесноков а.- М.: НТ Пресс, 2007.– 83с.
  3. Аронов, В.В. TurboPascal/В.В. Аронов. – БХВ - Петербург, 2004 . – 156с.
  4. Артемов, И. Л. Fortran: основы программирования. – М.: Диалог-МИФИ, 2007. – 304с.
  5. Буч Гради Объектно-ориентированное проектирование с примерами применения. — Конкорд, 2014. — 519 с.
  6. Васильев А. Java. Объектно-ориентированное программирование. — Питер, 2013. — 397 с.
  7. Мартин Роберт Идеальный программист. Как стать профессионалом разработки ПО. — Питер, 2011. — 240 с.
  8. Орлов С. А. Теория и практика языков программирования. — Питер, 2017. — 688 с.
  9. Прохоренок Н. Основы Java. — БХВ-Петербург, 2017. — 688 с.
  10. Робисон У. С# без лишних слов. – ДМК Пресс, 2017 — 344 с.
  11. Шуляев А. В. Критерии выбора языка программирования для разработки комплекса программных решений. — Аспирант, Южный университет (ИУБиП) №9, 2016. — 133-137 с.
  12. Herbert Schildt Java: A Beginner's Guide, Seventh Edition. — McGraw-Hill Education, 2017. — 752 p.
  13. Jeffrey A. Hoffer Modern Database Management. — Pearson, 2015. — 601 p.
  14. Joshua Bloch Effective Java. — Addison-Wesley Professional, 2018. — 412 p.
  15. Michael Coughlan Beginning COBOL for Programmers. — Apress, 2014. — 588 p.
  16. Справочник Java [Электронный ресурс] Подробнее о технологии Java Режим доступа: http://www.java.com/ru/about/ Дата обращения (28.08.2019)
  17. Digitrode [Электронный ресурс] Обзор популярных интегрированных сред разработки. Режим доступа: http://digitrode.ru/articles/973-obzor-populyarnyh-integrirovannyh-sred-razrabotki-ide-chast-i.html Дата обращения (28.08.2019)
  18. Программирование [Электронный ресурс] Понятие «программирование». Режим доступа:
    https://sites.google.com/site/wwwprogrammirovaniecom/home/ponatie Дата обращения (28.08.2019)
  19. Сайт с образовательными программами [Электронный ресурс] История программирования и алгоритмических языков перспективы развития средств автоматизации. Режим доступа: http://emirb.org/zadacha-avtomatizacii-sostoit-v-osushestvlenii-avtomaticheskog.html?page=9 Дата обращения (28.08.2019)
  20. Справочник Java [Электронный ресурс] Подробнее о технологии Java Режим доступа: http://www.java.com/ru/about/ Дата обращения (28.08.2019)
  21. itWeek [Электронный ресурс] Перспективы Java на 2018 год. Режим доступа: https://www.itweek.ru/foss/article/detail.php?ID=199284 Дата обращения (28.08.2019)
  22. TIOBE [Электронный ресурс] TIOBE Index for January 2019. Режим доступа: https://www.tiobe.com/tiobe-index/ Дата обращения (28.08.2019)
  23. Habr [Электронный ресурс] C++ в современном мире Режим доступа: https://habr.com/company/pvs-studio/blog/259777/ Дата обращения (28.08.2019)