Выбор и обоснование средств реализации проекта
В процессе разработки программных средств в той или иной мере используется компьютерная поддержка процессов разработки ПС. В качестве такого специального ПС можно указать компилятор с какого-либо языка программирования. Компилятор избавляет разработчика ПС от необходимости писать программы на языке компьютера, который для разработчика ПС был бы крайне неудобен, - вместо этого он составляет программы на языке программирования.
ПС, предназначенное для поддержки разработки других ПС, будем называть программным инструментом разработки ПС, а устройство компьютера, специально предназначенное для поддержки разработки ПС, будем называть аппаратным инструментом разработки ПС. Инструменты разработки ПС могут использоваться в течении всего жизненного цикла.
С точки зрения функций, которые инструменты выполняют при разработке ПС, их можно разбить на следующие четыре группы:
· Редакторыподдерживают конструирование (формирование) тех или иных программных документов на различных этапах жизненного цикла. Как уже упоминалось, для этого можно использовать один какой-нибудь универсальный текстовый редактор. Однако, более сильную поддержку могут обеспечить специализированные редакторы: для каждого вида документов. В частности, на ранних этапах разработки в документах могут широко использоваться графические средства описания (диаграммы, схемы и т.п.). В таких случаях весьма полезными могут быть графические редакторы. На этапе программирования (кодирования) вместо текстового редактора может оказаться более удобным синтаксически управляемый редактор, ориентированный на используемый язык программирования.
· Анализаторыпроизводят либо статическуюобработку документов, осуществляя различные виды их контроля, выявление определенных их свойств и накопление статистических данных (например, проверку соответствия документов указанным стандартам), либо динамический анализ программ (например, с целью выявление распределения времени работы программы по программным модулям).
· Преобразователипозволяют автоматически приводить документы к другой форме представления (например, форматеры) или переводить документ одного вида к документу другого вида (например, конверторы или компиляторы), синтезировать какой-либо документ из отдельных частей и т.п.
· Инструменты, поддерживающие процесс выполнения программ, позволяют выполнять на компьютере описания процессов или отдельных их частей, представленных в виде, отличном от машинного кода. Примером такого инструмента является эмулятор кода другого компьютера. К этой группе инструментов следует отнести и различные отладчики.
В настоящее время с каждой системой программирования связываются не отдельные инструменты (например, компилятор), а некоторая логически связанная совокупность программных и аппаратных инструментов поддерживающих разработку и сопровождение ПС на данном языке программирования или ориентированных на какую-либо конкретную предметную область. Такую совокупность будем называть инструментальной средой разработки и сопровождения ПСна английском IDE. Для таких инструментальных сред характерно, во-первых, использование как программных, так и аппаратных инструментов, и, во-вторых, определенная ориентация либо на конкретный язык программирования, либо на конкретную предметную область.
Инструментальная среда не обязательно должна функционировать на том компьютере, на котором должно будет применяться разрабатываемое с помощью ее ПС. Часто такое совмещение бывает достаточно удобным. Однако, если компьютер, на котором должно применяться ПС, недоступен для разработчиков этого ПС, например, он находится еще в стадии разработки либо неудобен для разработки ПС, либо мощность этого компьютера недостаточна для обеспечения функционирования требуемой инструментальной среды или это вообще микроконтроллер с крайне ограниченными ресурсами.
Различают три основных класса инструментальных сред разработки и сопровождения ПС.
Среда программирования предназначена в основном для поддержки процессов программирования (кодирования), тестирования и отладки ПС. Рабочее место компьютерной технологии ориентировано на поддержку ранних этапов разработки ПС (спецификаций) и автоматической генерации программ по спецификациям. Инструментальная система технологии программирования предназначена для поддержки всех процессов разработки и сопровождения в течение всего жизненного цикла ПС и ориентирована на коллективную разработку больших программных систем с длительным жизненным циклом. Для таких систем стоимость сопровождения обычно превышает стоимость разработки.
Рис. 16.1. Основные классы инструментальных сред разработки и сопровождения ПС.
Существует множество средств создания ПО, и каждый программист решает сам, какой из них выбрать – по соображениям удобства, производительности и т.д. Однако иногда кроме производительности важны и другие факторы.
1. Зависимость от выбора целевой платформы. Здесь можно выделить ещё два подвида: выбор обуславливается операционной системой на которой должна будет работать создаваемая программа или производителем и топологией чипа, если речь идёт об встраиваемых программах в микроконтроллеры. Наиболее популярными сейчас являются операционные системы Windows, MacOS, Linux, Android. Среди микроконтроллерных систем чаще всего встречаются STM32, AVR, PIC, Altera, Xilinx.
2. Мобильность целевой платформы. Некоторые из операционных систем, как например Linux могут работать не только на полноразмерных компьютерах, но и на мобильных устройствах, ресурсы которых значительно скромнее. IDE должна учитывать этот факт и предлагать соответствующие решения.
3. Поддержка кроссплатформенности может пригодиться в том случае если приложение должно работать на разных платформах, т.е. компилятор должен уметь строить разные дистрибутивы в зависимости от выбранной платформы. Например, если стоит задача сделать приложение, которое будет работать на Windowsкомпьютерах и Androidустройствах. Конечно можно создать 2 приложения с одинаковым функционалом в разных средствах программирования, но придётся потратить в 2 раза больше времени, т.к. код между ними не будет совместим. Примерами таких IDEможно назвать Xamarin Studio и Delphiлинейки XE, а также большинство современных игровых движков, например Unity, UnrealEngine 4 и др.
4. Зависимость от решаемой задачи. Существуют среды общего назначения и узкоспециализированные языки. Так например для создания средств автоматизации скорей всего понадобиться микроконтроллер и конкретная IDE. Для написания сайта может хватить и простейшего текстового редактора. А создать приложение для Androidбез хорошего компилятора и отладчика не получиться.
5. Требуется компилятор или интерпретатор. Первые позволяют создавать высокопроизводительные и оптимизированные приложения, вторые вносить изменения в код приложения на лету.
6. Удобство работы с фреймворком, наличие необходимых визуальных компонентов, поддержка технологии RAD, подсветки синтаксиса, авто дописывания кода и других вспомогательных систем позволяющих упростить работу программиста. Например сайт можно создать и с помощью блокнота, но гораздо удобнее использовать что-то типа AdobeBrackets.
7. Интеграция с CASE-технологиями, что позволяет экономить время при получении рабочего приложения по моделям и документам созданным на этапе проектирования, т.е. автоматическая генерация программы или документации к ней. Например Delphiи MSVisualStudioProсодержать встроенные средства UML, позволяющие производить конвертацию диаграмм классов в код и обратно.
8. Стоимость. Важный аспект, т.к. существуют бесплатные версии и достаточно дорогие пакеты. Так например MsVisualStudioexpressи многие другие IDE созданные на её основе, например AVRStudio являются бесплатными с ограничения. В противоположность полная версия DelphiXE7 Architectureстоит около 4 000$, а за игровой движок CryEngine просят 10000$.
9. Наличие поддержки работы с драйверами баз данных.
10. Возможность создания графического интерфейса пользователя для работы в современных операционных системах.
11. Поддерживаемые языки программирования. Так например MsVisualStudioкроме стандартных для С и С++ может работать с С#, visualbasic, ASP.NETи прочим. Главное, чтобы присутствовали нужные модули компилятора.
12. Знание программистом языка программирования. Если придётся для решения задачи учить новый язык программирования, то это не очень хорошо, как с точки зрения сроков сдачи проекта, его стоимости, дополнительно потраченного времени на изучения, возможной сырости продукта из-за плохого знания особенной языка.
13. Эффективность компилятора. Этот фактор имеет большее значение при выборе версии IDE. Так как правило новые версии дают более оптимизированный код. Однако сравнение разных компиляторов из разных IDEтак же порой уместно. Зачастую критерием здесь становиться скорость выполнения приложения и его вес.
14. Поддержка необходимых для проекта дополнительных библиотек и SDK от нужной технологии. Например, DirectXSDK, создано с ориентацией на C++ и подключи его к другому языку будет проблемно.
15. Наличие документации на нужном языке, например русском, и активность сообщества (обычно используют термин community), где можно получить справку и помощь. Сюда также можно отнесли наличие литературы, так например книг по VHDLнет на русском языке.
16. Наличие встроенных средств тестирования и возможность добавлять им функционал.
17. Возможность поддержки разных стадий жизненного цикла ПО. Комплексность компьютерной поддержки означает, что она охватывает все процессы разработки и сопровождения ПС и что продукция этих процессов согласована и взаимоувязана. Тем самым, система в состоянии обеспечить, по крайней мере, контроль полноты (комплектности) создаваемой документации (включая набор программ) и согласованности ее изменения (версионности). Тот факт, что компьютерная поддержка охватывает и фазу сопровождения ПС, означает, что система должна поддерживать работу сразу с несколькими вариантами ПС, ориентированными на разные условия применения ПС и на разную связанную с ним аппаратуру, т.е. должна обеспечивать управление конфигурацией ПС.
18. Ориентированность на коллективную разработку означает, что система должна поддерживать управление (management) работой коллектива и для разных членов этого коллектива обеспечивать разные права доступа к различным фрагментам продукции технологических процессов.
Введение
При планировании программного проекта имеется огромный выбор языков программирования, в лабиринтах которых легко заблудиться. Выбор языка зависит от многих факторов. Если это личный проект или хобби, можно выбрать знакомый вам язык. Если выбор зависит от имеющихся ресурсов, результат может быть весьма неочевидным. Можно также потратить много времени на разработку повторно используемых компонентов, так что документация превратится в кошмар.
В данной статье не приводится подробное сравнение процедурных, объектно-ориентированных или функциональных языков. В ней на практических примерах и сценариях показывается, как выбрать для разработки проекта максимально эффективный и простой язык. Она поможет исследовать ряд факторов, которые следует учитывать при выборе языка программирования, независимо от того, будет ли это маленький проект для личного использования или большой корпоративный проект.
Факторы выбора
При выборе языка программирования нужно учитывать множество факторов. Например, если при разработке динамической 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-сервис для операции сложения.
- Простая программа чтения фидов.
- Корпоративные приложения.
- Исследовательские проекты.