Религиозные войны между поклонниками популярных объектно-ориентированных языков C++, C# и Java не прекратятся, наверное, никогда. Более-менее объективную картину востребованности этих языков можно получить, например, в сервисе трендов Google, отслеживающем число запросов соответствующей тематики. Интерес к C#, плавно возраставший в течение двух-трех лет, выровнялся и практически сравнялся с интересом к C++, который уже давно остается стабильным. Запросов “Java” почти в четыре раза больше, нежели “C++”, — здесь, возможно, сказывается тот факт, что Java не только язык, но и платформа. Больше всего обращений к теме Java из Индии как одной из ведущих офшорных держав — по количеству их практически столько же, сколько и из всех других стран, вместе взятых (Россия в этом перечне на втором месте, далее следуют Тайвань, Сингапур и Китай). По интересу к C++ ситуация заметно ровнее, однако порядок стран, проявляющих к этой теме интерес, сохраняется таким же.
Java как система программирования остается сегодня одной из ключевых технологий разработки, и какие-то ее серьезные конкуренты в ближайшие годы вряд ли появятся. Косвенно это подтверждает тематика осенней международной конференции по объектно-ориентированному программированию OOPSLA '2008, состоявшейся в городе Нэшвилл (шт. Теннеси, США). Абсолютное большинство выступлений было связано с платформой Java и свободной средой разработки Eclipse.
Методологические аспекты
Как известно, оптимизацией кода можно сэкономить 5% ресурсов, оптимизацией алгоритма — 50%, а оптимизацией архитектуры — 500%. Но и соответствующие технологии эффективного проектирования обычно сложны для освоения. Каждый коллектив самостоятельно решает, что лучше — рискнуть и потратить время на изучение передовых решений, получив при этом шанс на резкое увеличение производительности, или же продолжать эксплуатировать традиционные эмпирические подходы, которые хоть и неторопливы, но как минимум хорошо измерены и предсказуемы.
Ребекка Вирфс-Брок, консультант по проектированию сложных объектных архитектур, рассказала о методологии Responsibility-Driven Design (проектирование, управляемое способностями: объекты трактуются не как данные и код, а как роли и способности). Традиционное обучение объектному построению системы обычно основано на практике и примерах, но плохо объясняет, какие конкретно факторы определяют качество мышления проектировщика и по каким принципам таких специалистов надо учить. Ребекка рекомендует акцентироваться в ходе обучения на умении максимально абстрагироваться от технических деталей, стремиться думать об объектах системы на самом высоком уровне, стараться разделять особенности реализации от общей модели системы, а строить такую модель на концепции распределенного поведения объектов.
Действительно, многие разработчики, применяющие объектно-ориентированное программирование (ООП), начинают свою практику с изучения универсального объектного языка низкого уровня, чаще всего С++ или Java, но при этом упускают из виду более важные вещи, связанные с глобальным построением архитектуры системы. Массачусетский технологический институт предложил для обучения ООП язык формального моделирования Alloy. Он поддерживает декларативный синтаксис, сложные структуры данных, бесконечный размер модели и сопровождается средством автоматического анализа и модулем визуализации.
Схожий подход к созданию сложного ПО выдвинули специалисты технологического института шт. Джорджия. Современные универсальные языки программирования и моделирования плохо подходят для построения систем, где одновременно функционирует множество программных агентов, которым приходится проявлять некоторый интеллект при действиях в динамически меняющемся окружении. Программы, автоматически адаптирующие свое поведение под текущее окружение, удобнее создавать на предложенном институтом языке Adaptive Behavior Language (A2BL). Он содержит примитивы адаптивного программирования, с помощью которых разработчик задает только конкретные особенности поведения объекта, а само их взаимодействие реализует среда поддержки выполнения. Непосредственно в A2BL включены также элементы, реализующие автоматическое обучение.
Национальный университет Сингапура несколько лет совершенствует расширение XVCL для среды Eclipse, позволяющее описывать группы схожих по структуре программ, представляя их общим шаблоном. Декомпозиция кода на мета-уровне осуществляется с помощью языка XML-based Variant Configuration Language, который задает текстовое описание взаимных преобразований программ в наглядном виде, привычном программисту. Технология XVCL полезна в проектах с большим объемом повторной реализации сходных требований. Она также позволяет управлять ежедневными и долгосрочными изменениями проекта, поддерживает повторное использование моделей, кода и документации, дает возможность создавать шаблоны документирования и быстро строить прототипы на основе существующих наработок.
Об автоматической сборке программы из готовых объектов рассказали представители научного подразделения IBM Research. В общем виде такую задачу решить сложно, поэтому в конкретных проектах предложено вручную вводить ограничения с помощью свободных тегов (принцип фолксономии): они задают возможности тех или иных компонентов и шаблонов. Программа-планировщик, использующая технологии искусственного интеллекта, собирает готовое приложение, реализуя высокоуровневые цели. Они конструируются разработчиками с помощью инструментов поиска, навигации и выбора тегов. Уже удалось разработать компоненты, подходящие для автоматической сборки приложений прикладной направленности. Первые эксперименты по построению финансового ПО не только оказались удачными, но и продемонстрировали высокую эффективность в сравнении с ручной разработкой.
Технология мейнстрима
Множество докладов было посвящено конкретным программистским проектам, чаще всего всевозможному инструментарию, упрощающему или облегчающему кодирование и отладку Java-приложений в Eclipse. Так, проект бразильских разработчиков FLiP содержит свободно подключаемые к среде Eclipse расширения: инструмент рефакторинга FLiPEx, модуль FLiPG, обновляющий модель системы после рефакторинга кода, и FLiPC, предназначенный для построения финальной версии продукта. Еще одно Eclipse-расширение, eMoose, созданное в университете Карнеги — Меллона, позволяет отслеживать обработку объектов в памяти, снабжать их собственным описанием и контролировать вызовы внешних и внутренних интерфейсов.
Целый комплект подключаемых Eclipse-модулей предложен Даниэлем Садилеком, сотрудником Берлинского университета им. А. Гумбольта. EProvide позволяет задавать семантику и метамодели предметно-ориентированных языков с помощью QVT, Java, Prolog или Scheme. Система ESemantics на основе этих моделей формирует работоспособные интерпретаторы с поддержкой отладки, а также трансляторы — например, в код на языке Scheme. Преобразование моделей по набору правил возможно с помощью Пролог-программ и модуля EPromote. А готовый и общедоступный предметно-ориентированный язык WebDSL для создания сложных веб-приложений, активно работающих с данными, предложили исследователи из голландского технологического института города Дельфт. Этот декларативный язык позволяет заменить значительные объемы низкоуровневого Java-кода, формируемого вручную, готовыми моделями рабочих процессов и контроля доступа, а программа на нем транслируется в JSF-страницы.
Свободная система Checker Framework Массачусетского технологического института реализует пожелание JSR 308 к грядущей версии Java 7, подразумевающее аннотации к типам данных. С ее помощью можно создавать собственные информативные типы и автоматически предупреждать типичные ошибки — например, обращения по нулевым указателям.
В январе 2009-го обещаны исходные тексты Java-проекта Melt Техасского университета г. Остин. Melt уточняет реализацию концепции управляемого кода, безопасных типов и сборки мусора — эти принципы обычно декларируются создателями виртуальных платформ, однако далеко не всегда эффективно реализуются. Так, попытки повторного освобождения объектов подчас вызывают ошибки времени выполнения; утечка памяти и висячие ссылки приводят к зависанию системы и т. д. Melt старательно идентифицирует неиспользуемые объекты и выгружает их на диск. Если впоследствии доступ к ним каким-то хитрым способом возобновляется, они вновь аккуратно помещаются в оперативную память.
Экспериментальная среда разработки VM Maxine исследовательского подразделения Sun доступна под лицензией GPLv2. Она представляет собой виртуальную Java-машину (ВМ), написанную на Java, и содержит мощный инструмент Maxine Inspector, упрощающий отладку сложных и системных проектов. Этот инструмент, в частности, позволяет просматривать объекты в динамике и вести многоуровневую отладку с привязкой к внутренним структурам данных и механизмам ВМ. Полезна Maxine и разработчикам ВМ для конкретных платформ.
Оригинальную ВМ предложил и научный центр IBM им. Т. Дж. Уотсона. Ошибки в уже установленном ПО подчас выявляются лишь на этапе его промышленной эксплуатации. При этом точно сымитировать ситуацию, в которой возникает ошибка, бывает крайне сложно. Но без этого и устранить ее вряд ли возможно. Данная проблема обычно решается ведением протоколов работы, но они дают довольно приблизительное представление о местоположении ошибки в исходных текстах. Виртуальная машина контроля качества IBM Quality Virtual Machine (QVM) поставляется заказчикам вместе с продуктом и осуществляет непрерывный мониторинг работы ПО. Она позволяет настраивать степень детальности контроля — например, отслеживать преобразования типов, различные прерывания, интенсивность использования ресурсов и т. д. Таким образом удается выстраивать баланс между выделением дополнительных мощностей на работу QVM и оперативным выявлением и устранением ошибок. Эта ВМ реализована в виде надстройки над IBM J9 Java VM.
Не Java единой...
Технологии ООП, альтернативные Java, обсуждались лишь в единичных выступлениях. Наиболее солидно выглядели здесь решения Microsoft — точнее, ее научного подразделения Microsoft Research. Докладчики сообщили о выходе в октябре набора средств анализа кода .NET — Managed Contract Tools, в который включена, в частности, утилита Clousot. Она выполняет условную интерпретацию кода, выявляя точки некорректной работы с памятью в небезопасных участках кода. Используя ее рекомендации, этот код можно сделать гарантированно защищенным от соответствующих ошибок. С помощью Clousot были протестированы все системные сборки .NET, и результат оказался не менее успешен, нежели при эксплуатации “тяжелых” и дорогих решений. Набор распространяется как дополнение к среде Visual Studio 2008.
Еще одна новинка Microsoft, касается, конечно, языка Basic. Она представляет собой расширение Visual Basic 9.0 конструкциями асинхронного параллельного выполнения и называется Concurrent Basic (CB). Этот диалект, во-первых, нацелен на поддержку многоядерных аппаратных архитектур, а во-вторых, упрощает создание насыщенных веб-приложений, выстраиваемых в клиент-серверных архитектурах с большим временем отклика сервера. При этом авторам CB удалось сохранить событийно-ориентированную схему формирования исходного кода, привычную программистам, работающим с Visual Basic.
Супервозможности ООП
Одним из наиболее интересных в плане перспектив объектно-ориентированных языков стало рабочее обсуждение группы smalltalk-superpowers.org. Ее участники обсуждали обоюдоострые мета-возможности наиболее мощных языков ООП наподобие Smalltalk, которые позволяют, например, менять структуру объектов во время работы программы или динамически добавлять метод, протоколирующий обращения к массиву, — соответствующий код занял всего 55 строк на языке Ruby. Подобные методы дают разработчику развитые инструменты оптимизации алгоритмов и кода, но при этом увеличивают риск внесения сложно выявляемых ошибок. Для массового производства ПО они вряд ли подойдут, однако при создании экспериментальных проектов, требующих особой эффективности, могут оказаться незаменимыми. Да и само их изучение позволяет сформировать свежий взгляд на процесс кодирования, абстрагироваться от деталей реализации и одновременно углубляет понимание различных тонких механизмов конкретных языков. Участники пообещали сформировать каталог подобных супервозможностей и подготовить их безопасные реализации в виде шаблонов, которые затем можно будет задействовать в популярных объектно-ориентированных языках.