ОСОБЕННОСТИ ВЫБОРА ЯЗЫКОВ ПРОГРАММИРОВАНИЯ

ДЛЯ РАЗРАБОТКИ ПРИЛОЖЕНИЙ

,

(Иркутск, ИрГУПС)

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

Ключевые слова: языки программирования; парадигмы; скриптовые; компилируемые; методологии и технологии программирования.

1. Исторические заметки о выборе языка программирования. Проблема выбора языка программирования (ЯП) для разработки прикладного программного обеспечения за 50-летний период активного использования программных технологий стала актуальной в последние 10-15 лет. Это связано, прежде всего, с эволюционным развитием технологий программирования, ЯП, архитектурных решений и др. Например, для нашей страны активное применение ЯП можно рассматривать с конца 1960-х годов. Вплоть до конца 1980-х основными применяемыми ЯП (с различными компиляторами для разных ЭВМ) были: Algol, Fortran, PL/1. Поэтому, в то время проблема стояла не с выбором языка, а в наиболее эффективной технологии их использования для построения программных систем различного назначения. С внедрением персональных компьютеров появились трудности в эффективном сопряжении программ, реализованных на различных ЯП, таких как: C, Pascal, Basic, Fortran, Prolog. Но проблема выбора не стояла, фактически, до конца столетия, т. к. на внутреннем рынке, по-прежнему, было ограниченное количество эффективных компиляторов (даже внедрение 32-разрядной платформы Windows повлекло лишь появление более сложных интегрированных сред с переориентацией на объектно-ориентированные ЯП, в основном: C++, Delphi, Visual Basic).

НЕ нашли? Не то? Что вы ищете?

Ситуация резко изменилась в начале этого столетия, когда закончилась монополия программных продуктов фирмы Microsoft, Borland и др. после широкого внедрения отрытых систем (прежде всего, ОС Linux) и разработкой кросс-платформенных технологий. В настоящее время появились сайты с информацией (о технологиях использования ЯП [1], о их популярности, и многое др). Следует отметить в исторической ретроспективе первую половину 90-х годов, ставшую толчком в разработке совершенно новых ЯП, например, Java, Lua, Python, Euphoria и многих других (к сожалению, в нашей стране идеи разработки новых ЯП были загублены глубоким экономическим кризисом).

2. О парадигмах программирования. В работах [2-8] проводится подробный анализ технологий программирования, опирающихся на три базовые пары составляющих (рис.1): методология + технология; ЯП + системы программирования; операционные + архитектурные платформы. Именно, многоплатформенность и организация сетевого взаимодействия существенно усложнили методологии программирования.

Рис.1. Три базовых составляющих программирования

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

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

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

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

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

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

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

·  методология императивного программирования;

·  методология объектно-ориентированного программирования;

·  методология функционального программирования;

·  методология логического программирования;

·  методология программирования в ограничениях.

Методология императивного программирования – подход, характеризующийся принципом последовательного изменения состояния вычислителя пошаговым образом. При этом управление изменениями полностью определено и полностью контролируемо. Императивное программирование – это исторически первая поддерживаемая аппаратно методология программирования. Она ориентирована на классическую фон Неймановскую модель, остававшуюся долгое время единственной аппаратной архитектурой, получившей широкое практическое применение. Наиболее известные и распространенные императивные языки программирования, большинство из которых было создано в конце 50-х – середине 70-х годов XX века (Fortran-1954, Algol-1960, Pascal-1970, C-1972).

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

·  Чистые языки, в наиболее классическом виде поддерживающие объектно-ориентированную методологию. Такие языки содержат небольшую языковую часть и существенную библиотеку, а также набор средств поддержки времени исполнения (Simula-67, Smalltalk, Beta, Self).

·  Гибридные языки, которые появились в результате внедрения объектно-ориентированных конструкций в популярный императивный язык программирования (C++, Object Pascal).

·  Урезанные языки, которые появились в результате удаления из гибридных языков наиболее опасных и ненужных с объектно-ориентированной точки зрения конструкций (Java, C#).

Методология функционального программирования – способ составления программ, на основе концепций аппликативности, рекурсивности и настраиваемости. Аппликативность подразумевает применение функции к аргументам. Рекурсивность заключается в самоповторяющемся поведении. Настраиваемость состоит в порождении новых объектов по образцу. Функциональная методология является одной из старейших и используется для исследований искусственного интеллекта. Основные функциональные языки: Lisp-1960, РЕФАЛ-1968, ML-1978, Miranda-1985, StandartML-1987, Haskell-1990.

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

·  Модификации языка (использование более мощных логических средств, внесение модульности и т. п.).

·  Функциональное направление (комбинация с функциональными языками).

·  Параллельное направление (логическое программирование по сути своей параллельно).

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

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

На рис. 2 представлена схема выбора парадигм и ЯП в проектах различного уровня (малые, средние, крупные).

Рис. 2. Схема выбора парадигм и языков программирования в проектах

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

Немаловажно выделение ЯП по способу исполнения, когда языки делятся на компилируемые, интерпретируемые (скриптовые) и с промежуточным байт-кодом. Программа на компилируемом языке (С, С++, Pascal, Delphi, Visual Basic, Fortran) при помощи компилятора преобразуется в набор инструкций для данного типа процессора и записывается в исполняемый файл, который может быть запущен на выполнение как отдельная программа. Если программа написана на интерпретируемом языке, то интерпретатор непосредственно выполняет ее текст без предварительного перевода.

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

Широкое развитие разнообразных скриптовых языков (PHP, Perl, Python, JavaScript, Ruby, Lua) вызвано не только возможностями современных технологий, но и чисто практическими требованиями разработки. Основное их достоинство в том, что исходный текст программы можно изменить в любой момент, что значительно облегчает и экономит время. Кроме того, программа может быть выполнена на разных операционных платформах без дополнительных настроек. За счет рациональной технологии программирования и реализации среды исполнения, скорость исполнения кода на скриптовом языке оказывается вполне сопоставимой с классическими компилируемым языками.

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

3. Использование CASE-средств для разработки приложений. Для разработки крупных проектов, как правило, используются специальные средства поддержки в виде Computer Aided Software Engineering (CASE), как средства автоматизации разработки программного обеспечения. В настоящее время предлагается инструментарий для системных аналитиков, разработчиков и программистов, позволяющий автоматизировать процесс проектирования и разработки программного обеспечения. Первоначально под CASE-средствами понимались средства, применяемые на ранних процессах жизненного цикла. В первую очередь - на наиболее трудоемких процессах анализа и проектирования. Международный стандарт [ISO/IEC 14102:1995] определяет CASE-средства более широко - как программное средство, поддерживающее процессы жизненного цикла программного обеспечения. CASE-средства характеризуются наличием мощных средств визуального моделирования.

Особенности средств автоматизации разработки программ:

·  поддерживают единственную методологию;

·  ориентируются на определенную технологию;

·  предназначаются для команд, работающих над единственным проектом (так сложилось исторически);

·  используются для разработки информационных систем;

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

Примеры CASE-средств:

·  Oracle Designer (компании Oracle, http://www. );

·  ERwin (компании Computer Associates International, Inc., http://www. );

·  Rational Rose (компании Rational Software Corporation, http://www. ).

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

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

Модель (model) - абстракция физической системы, рассматриваемая с определенной точки зрения и представленная на некотором языке или в графической форме.

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

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

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

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

В рамках ООАП исторически рассматривались три графических нотации:

·  диаграммы "сущность-связь" (Entity-Relationship Diagrams, ERD),

·  диаграммы функционального моделирования (Structured Analysis and Design Technique, SADT),

·  диаграммы потоков данных (Data Flow Diagrams, DFD).

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

На рынке CASE-средств представлены десятки программных инструментов, поддерживающих нотацию языка UML 1.4-1.5 и обеспечивающих интеграцию, включая прямую и обратную генерацию кода программ, с наиболее распространенными языками и средами программирования, такими как MS Visual C++, Java, Object Pascal/Delphi, Power Builder, MS Visual Basic, Ada, Smalltalk.

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

4. О рейтинге языков на основе Tiobe-индекса. Учитывая сложность сравнения парадигм и конкретных ЯП, в настоящее время разработаны различные подходы к их классификации на основе рейтингов [9]. Примером такого подхода может служить “TIOBE Programming Community Index” (TIOBE-индекс), который ежемесячно рассчитывается для наиболее популярных ЯП и парадигм. Рейтинг вычисляется путем подсчета количества запросов по профессиональным аспектам программирования в наиболее популярных поисковых системах, таких как Google, MSN и Yahoo. В рейтинге TIOBE учитываются около 150 ЯП, являющихся полными по Тьюрингу. В рейтинге не рассматриваются такие языки, как HTML, XML, ASP, AJAX, SQL (исключение PL/SQL для СУБД Oracle) и др.

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

Табл. 1. Пример TIOBE-индекса и его изменения для парадигм программирования

Парадигма

Рейтинг

за март 2008

Изменение рейтинга после марта 2007

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

54.9%

+3.0%

Процедурные языки

42.8%

-1.4%

Функциональные языки

1.6%

-0.6%

Логические языки

0.7%

-1.0%

В табл. 2 приведены TIOBE-индексы 20-ти наиболее популярных ЯП (с некоторыми исключениями), с выделением четырех групп и указанием их базовых парадигм. Рейтинг рассматривался за периоды: август 2006 г., март 2008 г., май 2008 г. (для отражения долгосрочных тенденций и текущих колебаний). Первая группа, включающая ЯП Java и C, имеет наивысший рейтинг (причем Java почти на 5% опережает C). ЯП второй группы, объединяющей Visual Basic, PHP, C++ и имеющие близкие между собой рейтинги, почти в 2 раза отстают от ЯП Java. Третья группа включает шесть ЯП с рейтингом от 2.4 до 5.9, с лидерами Perl, Python и характеризуется явной разнородностью. Следует отметить довольно большой скачок рейтинга объектно-ориентированного ЯП Ruby по сравнению с 2006 г. на фоне постепенного падения рейтингов ЯП Delphi и C#. В четвертой группе с рейтингами меньше 1% находятся ЯП: PL/SQL, Pascal, Ada, Lisp/Scheme, FoxPro/xBase, Lua. Среди этой группы, имеющей в основном тенденции на понижение рейтинга, можно выделить ЯП Lua с постепенным повышением рейтинга. Остальные (более ста ЯП) имеют значительно более низкие рейтинги.

Табл. 2. TIOBE-индекс 20 наиболее популярных ЯП

Позиция на 04.08

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

Парадигма

Рейтинг авг. 2006,

%

Рейтинг
март 2008,

%

Рейтинг
май 2008,

%

Группа

1

Java

ООП

22.37

20.61

20.18

I

2

C

ИМП

17.43

15.59

15.29

3

(Visual) Basic

ООП

11.20

10.79

10.78

II

4

PHP

ИМП

9.64

10.13

10.64

5

C++

ООП

10.25

9.77

10.48

6

Perl

ИМП

5.31

5.78

5.87

III

7

Python

ООП

3.07

4.59

4.61

8

C#

ООП

2.68

4.14

3.96

9

Delphi

ООП

2.16

2.69

2.85

10

Ruby

ООП

0.80

2.66

2.64

11

JavaScript

ООП

2.02

2.42

2.41

13

PL/SQL

ИМП

1.15

0.74

0.63

IV

16

Pascal

ИМП

0.51

0.55

0.50

17

Ada

ИМП

0.55

0.48

0.43

18

Lisp/Scheme

ФУНКЦ

0.59

0.43

0.45

19

FoxPro/xBase

ООП

0.63

0.42

0.39

20

Lua

ИМП

0.35

0.38

0.39

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

Существуют и другие способы определения рейтинга, например по признакам «I love», «I hate» [10]. Приоритетными для определения рейтинга в данном случае является личное отношение программиста к ЯП (например, многие программисты C/C++ отрицательно относятся к ЯП Java).

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

ЛИТЕРАТУРА

1.  132 языка в примерах [Электронный ресурс] - http://www. ntecs. de/old-hp/uu9r/lang/html/lang. en. html

2.  Лавров . Математические основы, средства, теория. - Спб.: БХВ-Петербург, 2002. —317 с.

3.  Основные концепции языков программирования. — М.: «Вильямс», 2001. — 672 с.

4.  Одинцов программирование. Системный подход. - Спб.: БХВ-Петербург, 2006. —624 с.

5.  Легалов программирование [Электронный ресурс] / - http://www. *****

6.  Макконелл Дж. Основы современных алгоритмов. –М.: Техносфера, 2004. —368с.

7.  Разработка программного обеспечения. – Спб.: Питер, 2004. —592с.

8.  Бен- Языки программирования. Практический сравнительный анализ. –М.: Мир, 20с.

9.  TIOBE Programming Community Index [Электронный ресурс] - www.

10.  Programming Language Popularity [Электронный ресурс] - www. welton. it/articles/language_popularity. html