Выбор оптимального языка программирования

Факторы выбора

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

Джерри Регунад, инженер по тестированию интеграции, IBM

Джерри Регунад (Jerry Reghunadh) – фотографияДжерри Регунад (Jerry Reghunadh) работает инженером-программистом IBM в Бангалоре, Индия. Он является сотрудником группы WebSphere Service Registry and Repository. Джерри имеет шестилетний опыт работы в отрасли и специализируется на технологиях WebSphere DataPower SOA Appliances, XML и автоматизации. До прихода в WSRR был членом группы разработки DataPower для устройств XB60 и XI50, а также группы WebSphere Quick Connect Appliance. Он также работал архитектором развертывания DataPower.



Неха Джайн, разработчик WebSphere, IBM

Неха Джейн (Neha Jain) – фотографияНеха Джайн (Neha Jain) два года является инженером-разработчиком группы WebSphere Service Registry and Repository в Бангалоре, Индия. Также работала тестировщиком. Имеет степень бакалавра в области компьютерных наук и вычислительной техники и сертификат IBM SOA Associate.



14.09.2012

Введение

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

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

Факторы выбора

При выборе языка программирования нужно учитывать множество факторов. Например, если при разработке динамической Web-страницы вы в качестве наилучшего варианта выберите JavaServer Pages (JSP)/сервлеты, другие могут предпочесть PHP или аналогичный язык сценариев. Не существует какого-то одного языка, который является наилучшим выбором. Можно отдать предпочтение определенным факторам, таким как производительность и безопасность корпоративных приложений, по сравнению с другими факторами, такими как количество строк кода. Любое решение сопряжено с какими-то компромиссами.

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

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

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

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

  • Целевая платформа.
  • Гибкость языка.
  • Время исполнения проекта.
  • Производительность.
  • Поддержка и сообщество.

Целевая платформа

Самым важным фактором является платформа, на которой программа будет работать. Рассмотрим для примера Java™ и C. Если программа написана на C и должна работать на машинах с Windows® и Linux®, потребуются компиляторы для платформ и два разных исполняемых файла. В случае с Java сгенерированного байт-кода будет достаточно для выполнения программы на любом компьютере, на котором установлена виртуальная Java-машина.

Аналогичный аргумент применим и для Web-сайтов. Они должны выглядеть и работать одинаково во всех браузерах. Использование тегов CSS3 и HTML5 без проверки совместимости с браузерами приведет к разному отображению и поведению сайта в разных браузерах.

Гибкость

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

  • Можно ли использовать новую функциональность без подключения новой библиотеки?
  • Если нет, доступна ли эта функциональность в библиотеке языка?
  • Если эта функциональность не встроена в язык и не доступна в библиотеке, какие усилия нужно приложить для ее создания с нуля?

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

Хотя сравнение этих языков технически некорректно, рассмотрим Perl и Python. Perl имеет встроенную поддержку регулярных выражений. В Python необходимо импортировать модуль re из стандартной библиотеки.

Время исполнения проекта

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

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

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

Производительность

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

Рассмотрим два варианта Web-приложения, написанных на Java и на Python. На основании данных тестирования можно прийти к заключению, что в одинаковой среде приложение, написанное на Java, должно работать быстрее, чем приложение, написанное на Python. А как насчет самой среды? Если средой является одноядерная x86 Ubuntu Intel Q6600, это справедливо, поскольку вычислительная мощность ограничена. А если взять Web-приложение, работающее в облачной среде на Google App Engine? Такое приложение может использовать практически неограниченную процессорную мощность, и обе программы возвратят результаты почти за одно и то же время. Теперь основным фактором выбора будет количество строк кода и удобство обслуживания.

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

Поддержка и сообщество

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

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

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


Сценарии

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

  • REST-сервис для операции сложения.
  • Простая программа чтения фидов.
  • Корпоративные приложения.
  • Исследовательские проекты.

REST-сервис для операции сложения

В этом сценарии рассматривается REST-сервис, выполняющий сложение. Сервис вызывается по URL, http://<url>?num1=number1&num2=number2, а результат должен содержать сумму двух чисел, переданных сервису. Эту программу можно написать на разных языках. В нашем примере используются JSP (см. листинг 1) и PHP (см. листинг 2). JSP-программа написана в Eclipse IDE.

Листинг 1. REST-сервис, использующий JSP
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Sum</title>
</head>
<body>
	<% if (request.getParameter("num1") == null || 
	request.getParameter("num2") == null) { %>
		<p>
			<b>Wrong URL!!!</b>
		</p>
		<p>
			<b>Enter URL in this format: </b>
			<i>
			http://&lt;url&gt;?num1=number1&amp;num2=number2</i>
		</p>
   <% } else { %>
       <b>Number 1:</b>
	   <i><%= request.getParameter("num1") %></i>
	   <br>
       <b>Number 2:</b>
	   <i><%= request.getParameter("num2") %></i>
	   <br>
       <b>Sum:</b>
	   <i><%= Integer.parseInt(request.getParameter("num1")) + 
	   Integer.parseInt(request.getParameter("num2")) %></i>
	   <br>
   <% } %>
</body>
</html>

В листинге 2 приведена та же программа, написанная на PHP.

Листинг 2. REST-сервис, использующий PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Sum</title>
</head>
<body>
	<?php if ($_GET["num1"] == NULL || $_GET["num2"] == NULL) { ?>
	<p><b>Wrong URL!!!</b></p>
	<p>
		<b>Enter URL in this format: </b>
		<i>http://&lt;url&gt;?num1=number1&amp;num2=number2</i>
	</p>
	<?php } else { ?>
		<b>Number 1:</b>
		<i><?= $_GET["num1"] ?></i>
		<br>
		<b>Number 2:</b>
		<i><?= $_GET["num2"] ?></i>
		<br>
		<b>Sum:</b>
		<i><?= $_GET["num1"] + $_GET["num2"] ?></i>
		<br>
	<?php } ?>
</body>
</html>

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

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

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

Простая программа чтения фидов

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

Фрагмент кода, приведенный в листинге 3, взят из O'Reilly и написан на Java.

Листинг 3. Программа чтения фидов, использующая Java
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.commons.io.IOUtils;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;

public class JsonParser {
	public static void main(String[] args) throws Exception {
		String urlString = 
"http://pipes.yahoo.com/pipes/pipe.run?_id=df36e60df711191549cf529e1df96884&
_render=json&
textinput1=and&urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex";
		URL url = new URL(urlString);
		URLConnection urlCon = url.openConnection();
		InputStream is = urlCon.getInputStream();
		String jsonTxt = IOUtils.toString(is);
		JSONObject json = (JSONObject) JSONSerializer.toJSON(jsonTxt);
		JSONObject value = json.getJSONObject("value");
		JSONArray items = value.getJSONArray("items");
		String title;
		for (Object item : items) {
			title=((JSONObject)item).getString("title");
			System.out.println("\n" + title);
		}
	}
}

В листинге 4 приведена программа, написанная на Python.

Листинг 4. Программа чтения фидов, использующая Python
#!/usr/bin/python
import urllib.request
url = "http://pipes.yahoo.com/pipes/pipe.run?
   _id=df36e60df711191549cf529e1df96884&_render=json&
   textinput1=and&urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex"
HTTPdata = urllib.request.urlopen(url)
json_data = eval(HTTPdata.read())
for item in json_data['value']['items']:
	print (item['title'])

Python-программу можно сократить еще больше – всего до трех строк. Оставьте в листинге 4 первые две строки и замените остальной код строкой из листинга 5.

Листинг 5. Сокращенная третья строка
for item in eval((urllib.request.urlopen("http://pipes.yahoo.com/pipes/pipe.run?
   _id=df36e60df711191549cf529e1df96884&_render=json&textinput1=and&
   urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex"))
   .read()))['value']['items']:print (item['title'])

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

Корпоративные приложения

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

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

Представьте себе, что предприятие, использующее свои реализованные на Java-коде Web-сервисы, хочет в качестве надежной платформы добавить WebSphere® MQ. Нет никакого смысла использовать для написания приложения C-интерфейсы системы WebSphere MQ; следует выбрать Java.

Исследовательские проекты

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

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

В такой ситуации на помощь могут прийти такие языки, как MATLAB и LISP. Если вы начнете создавать прототип на C, то погрузитесь в дебри переменных и указателей и не получите реальных результатов исследования. MATLAB интегрируется с C/C++ и Fortran, что позволяет вызывать C-код из MATLAB и наоборот.


Заключение

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

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

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


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

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



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

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Web-архитектура
ArticleID=835272
ArticleTitle=Выбор оптимального языка программирования
publish-date=09142012