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

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

Содержание:

Введение

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

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

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

В более широком смысле под программированием следует понимать полный спектр деятельности, который связан с созданием и дальнейшим поддержанием в рабочем состоянии программного обеспечения. Эта инженерно-техническая дисциплина носит название «программная инженерия» [4, c.21]. Она включает в себя анализ и постановку задачи, проектирование программы, построение алгоритмов, проектирование структур данных, написание текстов программ, отладку и тестирование программы, спецификацию, настройку, доработка и последующее сопровождение.

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

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

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

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

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

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

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

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

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

  1. Привести классификацию языков программирования.
  2. Определить критерии выбора языка программирования.
  3. Рассмотреть современные среды разработки программного обеспечения.
  4. Сделать выводы по проделанной работе.

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

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

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

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

В более узком смысле слова, программирование может быть представлено как кодирование – реализация одного или нескольких связанных между собой алгоритмов на некотором языке программирования [6, c.44]. В более широком смысле, программирование представляет собой процесс создания программ, то есть процесс разработки программного обеспечения.

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

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

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

В некоторых языках, вместо машинного кода генерируется интерпретируемый двоичный код «виртуальной машины», также называемый байт-кодом (byte-code). Такой подход применяется в Forth, Lisp, Java, Perl, Python а также в языках платформы Microsoft .NET

Компьютерная программа является связкой многочисленных строк специального текста – программного кода. Он является специальным, потому что создан таким образом, чтобы машине было понятно, какие действия должны быть выполнены (с помощью машинного языка). Самые простые приложения содержат около ста строк кода, а в сложных и масштабных приложениях количество строк кода доходит до миллиарда [2, c.45].

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

Инструментарий типичного программиста чаще всего состоит из следующих вещей:

  • компьютер;
  • интернет (прежде всего он нужен для поиска всего неизученного и неизвестного в любом из известных поисковых сервисов);
  • редактор кода (или IDE – комплекс программных средств, используемый программистами для разработки программного обеспечения), который поможет упорядочить все, что вы создаете;
  • компилятор или интерпретатор. Это программа, которая читает ваш код и пытается найти в нем ошибки. Затем он собирает ваш код в единый пакет и передает компьютеру для выполнения.

Языки программирования зачастую описываются своей парадигмой, которая является способом категоризации видов функций. Например, JavaScript – язык, который может быть запущен в любом веб-браузере, также он заслуженно занимает лидирующие позиции в рейтинге популярности. Он имеет разнообразный набор функций: поддерживает императивные, структурируемые, объектно-ориентированные и управляемые событиями парадигмы.

У языков программирования есть одна особенность – если два языка имеют сходство в парадигмах, то, как правило, они схожи и в синтаксисе. После изучения JavaScript, например, можно понять до 75 % кода на Python или Ruby, поскольку они похожи [9, c.62].

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

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

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

Язык программирования в большинстве случаев обладает более чем одним языком-предком. Многие языки формируются как сочетание элементов разнообразных языков. В одних случаях подобное сочетание проходит математический анализ на предмет непротиворечивости (к примеру, Standard ML), в других – язык создается исходя из практических потребностей, для решения проблем с целью получения коммерческой выгоды, но при этом без соблюдения математической строгости и с включением в язык идей, исключающих друг друга (к примеру, C++).

Языки низкого и высокого уровня

Формально понятие «язык программирования» не имеет такого критерия как «уровень». Данный термин условное означает некую степень отличия семантики языка от машинного кода целевой архитектуры процессора – иными словами, самый малый масштаб преобразований, необходимых для кода программы перед тем, как этот код сможет выполняться. Тем не менее, известны случаи, когда низкоуровневый язык компилировался как низкоуровневый на одной платформе, при этом на другой платформе он компилировался как «высокоуровневый» (программы на ассемблере VAX на DEC Alpha), или, когда язык, который является «высокоуровневым», реализовывался аппаратно (Лисп-машина, Java Optimized Processor) [3, c.73].

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

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

Языки четвертого и пятого поколения направлены в основном на выражение того, что именно должна делать программа, это основа декларативного программирования. На таких языках чаще всего достаточно просто перекомпилировать программу под ту или иную компьютерную архитектурную и операционную систему. Помимо этого, для них не явялется редкостью компиляция в язык третьего поколения (чаще всего Си, но иногда это может быть Java, JavaScript, Ada и др.).

Языки высокого уровня зачастую порождают машинный код куда большего размера и выполняются несколько медленнее. Однако, для алгоритмически и структурно сложных программ, те или иные языки высокого уровня могут быть заметно эффективнее, уступая низкоуровневым только на маленьких и несложных программах. Проще говоря, потенциальная эффективность языка может изменяться с повышением его «уровня» нелинейно, а порой в принципе неоднозначно. Скорость разработки и трудоемкость модификации, стабильность и прочие показатели качества в сложных системах зачастую куда важнее предельно возможной скорости исполнения – они гарантируют наличие различий между рабочей и нерабочей программой, так что экономически более целесообразной является эволюция аппаратного обеспечения и методов оптимизирующей компиляции [6, c.56].

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

Безопасные и небезопасные языки

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

Системы типов языков могут быть разделены на динамические (потомки Lisp, Smalltalk, APL) и статические, которые также делятся на неполиморфные (потомки Алгола и BCPL) и полиморфные (потомки ML). Помимо этого, они делятся на явные (explicit) и неявные (implicit) – иными словами, такие, которые требуют манифестной декларации типов или статически выводящие их самостоятельно [4, c.93].

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

В целом, язык можно назвать безопасным, если программы, написанные на нем, могут быть приняты компилятором как построенные правильно, в динамике эти программы никогда не выйдут за рамки ожидаемого поведения. Это не означает, что такого рода программы не содержат в себе ошибок в принципе. Термин «хорошее поведение программы» (good behavior) дает понять, что даже том случае, когда программа имеет логическую ошибку, то она все же не может нарушить целостность данных и обрушиться (crash).

Хотя приведенные термины неформальны, безопасность некоторых языков (например, Standard ML) может быть обоснована математически. Безопасность других языков (например, Ada) была гарантировано ad hoc-образом, без гарантии концептуальной целостности, что может обернуться катастрофами, если в ответственных задачах положиться на них. Это раскрывает принцип концептуальной целостности языков.

Например, Standard ML не допускает над данными проведения операций, не разрешенных явно и формализованных; тем не менее, программы на нем все же могут заканчиваться порождением необработанного исключения (деление на 0). Потомок Standard ML – MLPolyR – гарантирует отсутствие необработанных исключений. Такие языки носят название «типобезопасными». Например, Java и C# менее строги и осуществляют лишь контроль утечки памяти, поэтому в контексте этих языков чаще применяют более специфический термин «безопасность типов в отношении доступа к памяти» (memory type safety) [1, c.83].

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

Языки Си и C++ являются небезопасными. В программах, которые написаны на них, часто встречаются ситуации снижения типизации (приведение типов) и ее нарушения (каламбур типизации), таким образом, ошибки доступа к памяти в них представляют собой статистическую норму. Самые мощные системы статического анализа для этих языков могут обнаружить всего 70-80 % ошибок (PVS-Studio), их использование стоит очень дорого. У Си есть и безопасные потомки, типа Cyclone или Rust.

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

Компилируемые и интерпретируемые языки

Выделим три основных и принципиально разных способа реализации языков программирования, такие как: компиляция, интерпретация и встраивание. Считается, что способ реализации является присущим данному конкретному языку свойством, однако это заблуждение. В реальности, это деление до некоторой степени является условным. Чаще всего язык обладает формальной семантикой, которая ориентирована на интерпретацию, однако все или же почти все его реальные реализации представляют собой компиляторы, иногда довольно эффективно оптимизирующими (Standard ML, Haskell). Существуют языки, в которых граница между интерпретацией и компиляцией весьма размыта – например, Forth [10, c.73].

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

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

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

Для любого традиционно компилируемого языка можно реализовать интерпретатор. Однако многие интерпретируемые языки дают определенные дополнительные возможности, в виде динамической генерации, и их компиляция должна быть динамической. Так, термин «язык + реализация» в ряде случаев вполне уместен. Помимо этого, большинство современных «чистых» интерпретаторов не выполнятют конструкции языка непосредственно, а осуществляют компиляцию их в некоторое высокоуровневое промежуточное представление. Большинство традиционно интерпретируемых или компилируемых языков могут реализовываться как встраиваемые, хотя метаязыков, которые были бы способны охватить другие языки как свое подмножество, не так много (например, Lisp) [12, c.65].

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

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

Некоторые языки, такие как, Java и C#, находятся где-то между компилируемыми и интерпретируемыми. Программа, написанная на этих языках, компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Байт-код же выполняется виртуальной машиной.

Для выполнения байт-кода чаще всего используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету» (Just-in-time compilation, JIT). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# – Common Language Runtime.

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

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

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

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

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

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

История и философия

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

Синтаксис

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

  • Целостность. Отсутствие целостности в синтаксисе некоторого языка программирования делает его более трудным для изучения и повышаетвероятность появления ошибок в программах, написанных на этом языке.
  • Избыточность конструкций. Язык программирования, в котором имеется избыточность конструкций или частично перекрывающие друг друга(функционально) конструкции, позволяет выполнять одни и те же действия различными способами. При правильном проектировании новогоязыка программирования число концепций в нем могло бы быть меньшим.
  • Выразительность. Хорошо написанная программа отражает структуру лежащего в ее основе алгоритма. Чем выразительнее язык программирования, тем легче программисту решать стоящую перед ним задачу. 
  • Многословие и безопасность. Существует неформальное правило (или рекомендация): все программы должны умещаться на одной странице. Длинные программы менее "удобочитаемы", чем короткие программы. Многословный язык программирования может привести к тому, что записанный на нем короткий алгоритм превращается в длинную программу. С другой стороны, необходимо отметить, что использование похожего на шифрограмму синтаксиса (т.е. слишком краткого) также нежелательно. Корректность синтаксиса легко проверяется трансляторами с различных языков программирования. Диагностируемые трансляторами с различных языков программирования синтаксические ошибки представляют собой первый барьер на пути ошибок, делаемых программистом при написании и вводе программ [8, c.53].

Философия типов и типы данных

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

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

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

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

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

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

Операции

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

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

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

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

Управление последовательностью действий

В соответствии с концепциями структурного программирования последовательное выполнение программ ограничивается только двумя случаями последовательным выполнением операторов и операторами циклов. 

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

Существуют различные типы операторов цикла. Основными моментами, характеризующими операторы циклов, являются следующие. Легко ли с помощью соответствующего оператора цикла записать выполнение определенных действий n раз? А n*1/2 раз [106]? Каково значение управляющей переменной после выхода из оператора цикла (нормального и/или преждевременного)? Какие существуют ограничения на конструирование выражений, обеспечивающих управление действиями – завершением или продолжением выполнения операторов циклов? 

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

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

Подпрограммы и области действия

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

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

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

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

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

Средства организации параллельной обработки

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

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

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

2. При использовании многопроцессорных ЭВМ (например, двухпроцессорных или однопроцессорных комплексов, в которых используются интеллектуальные контроллеры внешних устройств) параллельные программы, выполняются более эффективно, чем последовательные [13, c.83]. 

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

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

Средства организации ввода-вывода

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

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

Раздельная трансляция

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

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

2.2 Особенности процедуры выбора языка программирования

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

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

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

Ниже приведена часть списка таких средств для научно-технических расчетов [15, c.63]:

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

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

Обеспечивает ли этот язык программирования возможность использования соответствующих средств? 

Если нет, то может ли возможность использования соответствующих средств быть легко реализована в этом языке программирования? 

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

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

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

Хороший пример значения сообщества дает язык Perl. Архив Comprehensive Perl Archive Network (CPAN) поддерживается усилиями сообщества. Главная цель CPAN – помочь программистам в поиске модулей и программ, не включенных в стандартный дистрибутив Perl. По своей структуре он децентрализован; авторы обслуживают и улучшают свои собственные модули. Обычной практикой является создание ответвлений и конкурирующих модулей для одной и той же задачи или цели.

3. Особенности и критерии выбора среды разработки

3.1. Понятие и особенности современной IDE

Интегрированная среда разработки (Integrated development environment – IDE), также единая среда разработки, ЕСР – комплекс программных средств, используемый программистами для разработки программного обеспечения (ПО).

Среда разработки включает в себя:

  • текстовый редактор,
  • компилятор и/или интерпретатор,
  • средства автоматизации сборки,
  • отладчик.

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

IDE обычно предназначены для нескольких языков программирования – такие как IntelliJ IDEA, NetBeans, Eclipse, Qt Creator, Geany, Embarcadero RAD Studio, Code::Blocks, Xcode или Microsoft Visual Studio, но есть и IDE для одного определённого языка программирования – как, например, Visual Basic, Delphi, Dev-C++.

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

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

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

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

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

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

Большинство современных ИСР являются графическими. Но первые ИСР использовались ещё до того, как стали широко применяться операционные системы с графическим интерфейсом – они были основаны на текстовом интерфейсе с использованием функциональных и горячих клавиш для вызова различных функций (например, Turbo Pascal, созданный фирмой Borland) [9, c.45].

3.1 Критерии выбора IDE (на примере языка Java)

Современная IDE Java-разработчика должна поддерживать Java 8, Scala, Groovy, а также другие языки виртуальной машины Java, которые тот регулярно использует. Также может пригодиться поддержка основных серверов приложений и наиболее популярных веб-структур, в том числе – Spring MVC, JSF, Struts, GWT, Play, Wicket, Grails и Vaadin. IDE должна быть совместима с любыми билдами систем контроля версий, например, Ant, Maven или Gradle, вместе с Git, SVN, CVS, Mercurial или Bazaar. Дополнительно для среды разработки важно уметь работать с базами данных и клиентским слоем вашего стека, обладать поддержкой встроенного JavaScript, TypeScript, HTML, SQL, JavaServer Pages, Hibernate, а также API Java Persistence.

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

Рассмотрим два основных претендента на роль IDE для разработки на Java.

IntelliJ IDEA

IntelliJ IDEA с точки зрения возможностей и цены поставляется в двух вариантах: бесплатного Community edition, и платного Ultimate edition с расширенной функциональностью. 

Community edition предназначена для JVM- и Android-разработки. Бесплатная версия поддерживает Java, Kotlin, Groovy и Scala; Android; Maven, Gradle и SBT; работает с системами контроля версий Git, SVN, Mercurial и CVS.

Ultimate edition приспособлена для веб- и enterprise-разработки. Эта версия IDE работает не только с Git, SVN, Mercurial и CVS, но также с Perforce, ClearCase и TFS; в ней вы сможете писать на JavaScript и TypeScript; естественно, есть поддержка Java EE, Spring, GWT, Vaadin, Play, Grails и ряда других фреймворков.

Рисунок 3.1 – Warnings IntelliJ IDEA из статистического анализа Java-кода.

Подсветка синтаксиса и простое автодополнение кода – обычное дело для любых современных Java-редакторов. IDEA пошла дальше, предлагая «умное автодополнение». Этот термин означает, что среда разработки показывает список наиболее релевантных символов, применимых в данном контексте. Список символов зависит не только от контекста как такового, «общепринятого», но от стиля программирования разработчика, от того, насколько часто он использует те или иные операторы.

Код Java часто включает фрагменты из других языков в виде строк. IDEA может вводить код SQL, XPath, HTML, CSS или JavaScript в строковые литералы Java. В этом смысле IDE может проводить рефакторинг кода на нескольких языках. Например, если вы переименуете класс в JPA-отображении, IDEA обновит соответствующий класс сущностей и выражений JPA.

IntelliJ IDEA анализирует код при загрузке и непосредственно при вводе. Она указывает на предполагаемые проблемы (как на нашем рисунке выше) и, по желанию, предлагает список вероятных быстрых правок к обнаруженным проблемам. 


Рисунок 3.2 – Эргономика среды разработки

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

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

IntelliJ IDEA обеспечивает единый интерфейс взаимодействия с большинством систем контроля версий, включая Git, SVN, Mercurial, CVS, Perforce и TFS. Также IDEA оснащена инструментами для сборки, средой выполнения тестов, инструментами покрытия (coverage tools) и встроенным терминальным окном. У IntelliJ нет собственного профайлера, но с помощью плагинов к ней можно подсоединить сторонние.

Серверное программирование на Java предполагает частое взаимодействие с базами данных, так что программисты IDEA версии Ultimate оценят удобство инструментов для работы с SQL и БД. Но если кому-то их возможностей будет мало, можно приобрести версию IDEA Ultimate с встроенной SQL IDE (DataGrip).

IntelliJ IDEA поддерживает все основные серверы приложений JVM, и позволяет разворачивать и проводить отладку на этих серверах, что нивелирует хорошо знакомые всем программистам Java Enterprise трудности. IDEA также поддерживает Docker (с помощью плагина, который добавляет к среде разработки специальное окно инструментов Docker.

Eclipse IDE

Eclipse долгие годы уверенно держал пальму первенства по популярности среди Java IDE. Эта среда полностью бесплатная, с открытым исходным кодом, написанным преимущественно на Java. Тем не менее, её модульная архитектура позволяет использовать Eclipse и с другими языками. Проект Eclipse, инициированный IBM, появился в 2001 году. Им хотели заменить семейство сред разработки IBM Visual Age, основанных на Smalltalk. 

Портативность Java помогает Eclipse быть кроссплатформенной средой: эта IDE работает на Linux, Mac OS X, Solaris и Windows.
Хорошо это или плохо, Java Standard Widget Toolkit (SWT), по крайней мере частично, отвечает за внешний вид Eclipse. 

Своей производительностью (или, как говорят некоторые доброжелатели, её отсутствию) Eclipse обязана JVM. Eclipse работает довольно медленно, поскольку упирается корнями в довольно старое «железо» и древние версии JVM. Даже сегодня она кажется медлительной, особенно если нацепить на неё много плагинов. 

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

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

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


Рисунок 3.3 – Панели инструментальных средств Eclipse: Проводник пакетов, редактор Java, структура классов Java и список задач

Поначалу необходимо настроить Eclipse и привыкнуть к её концептуальной архитектуре рабочих пространств, ракурсов и видов. Всё это определяется плагинами, которые вы установили. Для серверной разработки на Java, вы, вероятно, будете использовать ракурсы Java, Java EE и Java browsing, вид, отображающий структуру пакета (Package Explorer), ракурс отладки, ракурс командной синхронизации веб-инструментов, ракурс разработки баз данных и ракурс отладки базы данных. На практике все обретает смысл, когда вы откроете нужные вам окна.
Eclipse практически всегда предлагает несколько способов решения той или иной задачи. Например, вы можете просматривать код с помощью ракурса просмотра Java (Java browsing perspective).

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

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

Eclipse поддерживает отладку как локально, так и удаленно, при условии, что вы используете JVM, которая поддерживает удаленную отладку. Отладка довольно стандартна: вы определяете контрольные точки, а затем просматриваете переменные в закладке отладки. Конечно, можно пошагово выполнять свой код и вычислять выражения.

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

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

Начинающим Java-разработчикам не стоит использовать Eclipse. Невзирая на то, что это всё еще самая популярная IDE для Java, новичкам с ней тяжело – во время развертывания системы, и во время выполнения повседневной работы.

У Eclipse самая развернутая экосистема плагинов среди всех IDE, а также наибольшая вероятность «слететь» из-за установки несовместимого набора этих самых плагинов. Для начинающих Java-разработчиков, у которых пока нет средств для покупки инструментария, рекомендуется использовать IntelliJ IDEA Community Edition в зависимости от их задач. Первую стоит выбирать тем, кто занимается кодированием серверов Java, но только если вы не попадаете в категорию тех, кто может получить IntelliJ IDEA Ultimate бесплатно или с огромной скидкой (студенты или те программисты, которые разрабатывают проект open source).

\

Заключение

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

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

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

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

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

  1. Александреску, А. Язык программирования D / А. Александреску. – М.: Символ, 2013. – 536 c.
  2. Баженова, И.Ю. Языки программирования: Учебник для студентов учреждений высш. проф. образования / И.Ю. Баженова; Под ред. В.А. Сухомлин. – М.: ИЦ Академия, 2012. – 368 c.
  3. Бьянкуцци, Ф. Пионеры программирования: Диалоги с создателями наиболее популярных языков программирования / Ф. Бьянкуцци, Ш. Уорден; Пер. с англ. С. Маккавеев. – СПб.: Символ-Плюс, 2011. – 608 c.
  4. Гавриков, М.М. Теоретические основы разработки и реализации языков программирования: Учебное пособие / М.М. Гавриков, А.Н. Иванченко, Д.В. Гринченков. – М.: КноРус, 2010. – 184 c.
  5. Гергель, В.П. Современные языки и технологии паралелльного программирования: Учебник / В.П. Гергель. – М.: МГУ, 2012. – 408 c.
  6. Гергель, В.П. Современные языки и технологии параллельного программирования: Учебник/ предисл.: В.А. Садовничий. / В.П. Гергель. – М.: Изд. МГУ, 2012. – 408 c.
  7. Голицына, О.Л. Языки программирования: Учебное пособие / О.Л. Голицына, Т.Л. Партыка, И.И. Попов. – М.: Форум, НИЦ ИНФРА-М, 2013. – 400 c.
    Головин, И.Г. Языки и методы программирования: Учебник для студентов учреждений высшего профессионального образования / И.Г. Головин, И.А. Волкова. – М.: ИЦ Академия, 2012. – 304 c.
  8. Довек, Ж. Введение в теорию языков программирования / Ж. Довек, Ж.-Ж. Леви. – М.: ДМК, 2016. – 134 c.
  9. Касторнова, В.А. Структуры данных и алгоритмы их обработки на языке программирования Паскаль: Учебное пособие / В.А. Касторнова. – СПб.: BHV, 2016. – 304 c.
  10. Кауфман, В.Ш. Языки программирования. Концепции и принципы / В.Ш. Кауфман. – М.: ДМК, 2011. – 464 c.
  11. Керниган, Б. Язык программирования C. 2-е изд. / Б. Керниган, Д.М. Ритчи. – М.: Вильямс, 2016. – 288 c.
  12. Монахов, В.В. Язык программирования Java и среда NetBeans. 3-е изд., пер. и доп. + DVD / В.В. Монахов. – СПб.: BHV, 2012. – 704 c.
  13. Фридман, А.Л. Основы объектно-ориентированного программирования на языке Си++ / А.Л. Фридман. – М.: Гор. линия-Телеком, 2012. – 234 c.
  14. Хейлсберг, А. Язык программирования C#. Классика Computers Science / А. Хейлсберг, М. Торгерсен, С. Вилтамут. – СПб.: Питер, 2012. – 784 c.
  15. Шохирев, М.В. Язык программирования Perl 5 / М.В. Шохирев. – М.: Интуит, 2014. – 279 c.