В июне компания Sun Microsystems представила на суд общественности новую бесплатную версию интегрированной среды разработки для языков Си, С++ и Фортран — для ОС Solaris и Linux.
На что же это похоже?
Те, кто незнаком с Sun Studio, наверняка захотят понять, на что же похож этот продукт, а те, кто работал с предыдущими версиями, вероятно, пожелают выяснить, насколько изменилась знакомая им среда.
Чтобы удовлетворить любознательность пользователей, достаточно установить Sun Studio. Сделать это несложно — нужно только запустить графический инсталлятор, ответить на простые вопросы и дождаться завершения процедуры установки. Дальше остается лишь набрать
> sunstudio &
Что же получилось? На первый взгляд это напоминает Microsoft Visual Studio или Eclipse, на второй — NetBeans и очень отдаленно — Sun Studio 11.
Новая интегрированная среда разработки 12-й версии построена на базе NetBeans 5.5 — популярной бесплатной IDE для Java с открытым кодом. Более того, некоторые читатели, возможно, уже знакомы с NetBeans C/C++ Development Pack, а значит, найдут много общего у этих двух продуктов.
Действительно, Sun Studio включает в себя пакет NetBeans C/C++ Development Pack, и в проектной системе или, скажем, редакторе найти различия невозможно. Однако внимательный разработчик заметит существенную разницу:
-
Sun Studio поставляется с компиляторами, утилитой dmake и отладчиком DBX от Sun, тогда как NetBeans потребует отдельно установить компиляторы, make и gdb.
-
Sun Studio использует отладчик DBX, а NetBeans C/C++ Development Pack — gdb.
-
Sun Studio имеет встроенный профилировщик, Thread Analyzer (анализатор потоков) и монитор памяти времени выполнения.
-
Sun Studio не предназначена для работы с Windows и Java (последнее не совсем верно, но это останется за рамками данной статьи).
Следовательно, если вы ведете разработку на нескольких платформах и gcc является вашим любимым компилятором, если вы не боретесь за производительность приложений, не ищете проблемы, связанные со взаимодействием потоков, не анализируете ошибки
доступа к памяти, то NetBeans C/C++ Development Pack — ваш надежный помощник. А заядлым Unix-программистам, зачастую вынужденным бороться со сложными проблемами вроде тех, что описаны выше, стоит всерьез задуматься о Sun Studio.
Кстати, прелесть решений, предлагаемых Sun и NetBeans, заключается в том, что у них одинаковые файлы проектов.
NetBeans и C/C++ Development Pack входят в состав пакета Sun Studio, и там, где он установлен, нет необходимости устанавливать оба продукта. NetBeans может быть использован отдельно от Sun Studio и всегда есть возможность выбрать наиболее понравившийся и подходящий для решения нужной задачи продукт. Запустить NetBeans можно с помощью команды
> netbeans &
Заметим, что оба продукта распространяются бесплатно. Менее всего 12-я версия Sun Studio похожа на свою предшественницу под номером 11. Конечно, ни компиляторы, ни отладчик не стали принципиально другими, но общий вид IDE радикально изменился благодаря переходу с платформы NetBeans 3.5.1 на 5.5, а также в результате серьезной переработки редактора.
Редактор и навигация
Тех, кто раньше работал в Sun Studio 11, ожидает немало приятных сюрпризов, а поклонники Visual Studio обнаружат много привычных вещей.
Итак, Sun Studio 12 предлагает следующие средства редактирования и навигации по Си- и С++-коду:
-
автодополнение;
-
сворачивание блоков редактируемого кода;
-
гиперссылки (переход к определениям функций, классов и переменных);
-
список классов (полный список классов с методами и членами, а также все функции и глобальные переменные, определенные в проекте) с возможностью навигации к их декларациям;
-
быстрая навигация — полный список функций и структур данных, определенных в текущем файле с навигацией к ним;
-
множество удобных мелочей, знакомых пользователям NetBeans.
В целом редактор вызывает положительные эмоции, работает быстро и выглядит приятно. К его недостаткам следует отнести отсутствие даже базового рефакторинга, слабую подсветку синтаксических ошибок и ограниченные возможности по настройке форматирования кода.
Что нам стоит код построить
Проекты
В Sun Studio 12 используется абсолютно новая проектная система, перешедшая из NetBeans C/C++ Development Pack. Прежде всего, она содержит развитые настройки создания проектов, отдельных логических каталогов и файлов. Удачным нововведением по сравнению с Java-проектами является возможность определения «Конфигураций». По сути такая концепция не нова. В одном проекте можно иметь несколько конфигураций с разными настройками компиляции и запуска приложения. Не революционно, но весьма удобно.
При создании проекта Sun Studio генерирует Makefile, позволяющий впоследствии собрать приложение, не запуская IDE.
Необычные возможности предлагает мастер Discovery Wizard. Если имеется набор файлов с исходным текстом и Makefile, мастер сумеет самостоятельно скомпоновать из них проект, задав лишь несколько вопросов. Наиболее удачно Discovery Wizard работает в случае, когда уже есть построенный исполняемый файл или библиотека. Но и при отсутствии необходимых файлов он может быть полезен.
Интересно, что этот мастер способен даже запустить утилиту configure для проекта, если его об этом попросят. Такая возможность да и вся функциональность импорта Makefile’ов скорее всего придется по душе разработчикам приложений с открытым кодом. Во всяком случае импорт DDD и MySQL осуществился без каких-либо проблем. Discovery Wizard настроил все include-пути и директивы препроцессора. Он даже подсветил серым файлы, содержащиеся в проекте, но не задействованные в сборке.
Кстати, можно запустить данный мастер и повторно, уже после создания проекта. Это имеет смысл делать тогда, когда уже появился исполняемый файл или нужно изменить кое-какие настройки.
Кроме того, проектная система поддерживает GNU-компиляторы и различные make-утилиты, в частности gmake. Однако если нет особых причин использовать gcc или gmake, то стоит работать с тем, что поставляется в пакете Sun Studio 12.
Dmake
Стандартная утилита сборки в Sun Studio — dmake. Она совместима со стандартом POSIX, но, к сожалению, понимает не все расширения gmake.
По сравнению с предыдущими версиями особых изменений в утилите не отмечается. Как и прежде, dmake бодро раскидывает задания на компиляцию отдельных файлов по имеющимся процессорам или ядрам, стремясь ускорить процесс сборки.
Dmake — это distributed make, что означает распределенный сборщик. То есть dmake предоставляет возможность распределения задач по сборке приложения между несколькими компьютерами. От такого распараллеливания можно получить еще более ощутимый выигрыш в производительности.
Компиляторы
Компиляторы традиционно представляли собой сильную сторону Sun Studio. Собственно, единственная новая возможность, которую Sun добавила в этой версии к своим и без того отличным компиляторам, — их способность генерировать код под Linux.
Проведенные сравнения показали, что генерируемый код стал выполняться на 10—15% быстрее. Кстати, в 2005—2006 гг. Sun Studio 11 установила несколько мировых рекордов в различных тестах производительности.
Однако не стоит фокусироваться только на новых возможностях компиляторов фирмы Sun: старые исчерпали себя еще далеко не полностью. Тем, кто не чувствует себя уверенно, подбирая опции в командной строке или редактируя Makefile, Sun Studio 12 предлагает несколько легких способов воспользоваться всей мощью компиляторов.
Для примера напишем маленькую программу, вычисляющую число π. Построим ее и выполним, измеряя время исполнения на сервере Sun Fire V490 — 4×UltraSPARC IV dual-core, 1,35 ГГц.
Теперь в свойствах проекта, в разделе настроек компилятора Си, изменим Development Mode с Debug на Performance Release. И снова измерим время выполнения.
Ого! Неплохой выигрыш в производительности. Но это еще не все. Параллелизм! Под этим лозунгом выходит почти каждый новый продукт от фирмы Sun, будь то процессор или сервер приложений. А что же произойдет, если в настройках компилятора заменить Multithreading Level с None на Automatic.
И не забудем в секции Running добавить переменную окружения PARALLEL и установить ее значение равным восьми. Во время выполнения программы это укажет ей, на сколько потоков следует разбить цикл вычислений. Так как платформа, на которой проводился эксперимент, имела восемь виртуальных процессоров UltraSPARC (четыре ЦП по два ядра), то значение «восемь» вполне понятно. Итак:
Обратите внимание на сообщения компилятора. В процессе построения приложения он «рассказывает» о результатах анализа циклов и принятых им решениях о параллелизации. Конечно, следует отметить, что время выполнения значительно сократилось. Причем user time примерно в 5—6 раз больше, чем real time. Это свидетельствует о том, что при расчете программа задействовала никак не меньше шести процессоров.
Таким образом можно ускорить программу в 17 раз, не приложив никаких усилий, а лишь грамотно используя возможности компиляторов.
Для сравнения можно измерить тот же код, построенный с помощью gcc.
Программа, собранная Sun Studio, даже без параллелизации работает примерно на 30% быстрее, чем собранная GNU-компилятором с максимальной оптимизацией. С учетом же параллелизации Sun Studio выигрывает в 7 раз.
И наконец, следует отметить, что Sun Studio поддерживает стандарт OpenMP, предназначенный для написания переносимого многопоточного кода и помогающий делать чрезвычайно изящные программы, свободные от частокола вызовов pthread_create, pthread_join и т. п.
И как теперь искать ошибки?
Процесс отладки всегда был и остается наиболее мучительной частью работы программиста. Ничто так не ценится в любой IDE, как хороший графический отладчик. В Sun Studio такой есть. Но также имеются еще два инструмента, способных помочь разработчику заставить программу работать как положено: Run-Time Memory Checking (Контроль памяти времени выполнения) и Thread Analyzer (Анализатор потоков исполнения).
Отладчик
Этот инструмент вполне традиционен, так что время на его освоение тратить не придется.
Точку останова можно установить в любой момент, просто щелкнув мышкой на поле слева от интересующей строки текста. Затем надо нажать кнопку Debugging, и если точка останова определена правильно, то скоро выполнение программы прервется в желаемом месте и появятся различные окна отладчика.
Их легко закрыть или переместить. В меню Windows • Debugging можно открыть те, что по умолчанию не открываются: Sessions, Threads, Memory, Registers и др.
Наиболее интересно, пожалуй, окно Sessions, позволяющее переключаться между несколькими сессиями отладки. Оно особенно полезно при отладке сложных многопроцессных систем, к примеру систем типа клиент—сервер.
Окно Threads дает возможность наблюдать за состоянием потоков исполнения и переключаться между ними. Отладчик «понимает» и уже упомянутые OpenMP-директивы, и автоматическую параллелизацию. Чтобы удовлетворить любопытство, рекомендуется запустить под отладчиком пример с вычислением числа π.
Установка «наблюдений» (Watches) не слишком удобна. Особую досаду вызывает то, что невозможно отредактировать наблюдение.
Зато вызывает уважение разнообразие точек останова, в частности остановки по изменению или доступу к памяти, выполнению различных условий, возникновению «исключения» и многим другим параметрам. Приятной неожиданностью оказалась возможность не останавливаться на точке прерывания, а распечатать трассировку стека и пойти дальше.
Возможность выполнения сценариев отладчиком Sun Studio опять же заслуживает отдельной статьи. Впрочем, можно смело предположить, что эта весьма интересная функция найдет крайне ограниченное применение. А жаль.
Та же участь, видимо, постигнет и уникальную возможность создания либо своего пункта меню, либо кнопки на панели инструментов, чтобы выполнялся сценарий для отладчика, определенный пользователем.
Контроль памяти
Одна из самых неприятных и с трудом обнаруживаемых проблем — утечка памяти. Не менее неприятная ситуация — применение неинициализированных переменных. У Sun Studio есть оружие против этих бед.
Рассмотрим простой пример:
Запустим контроль памяти (меню Advanced Tools • Runtime Memory Checking) и рассмотрим результат:
Пакет Sun Studio выдает три отчета с описанием найденных проблем и гиперссылками на соответствующие строки программы. Например, отчет по ошибкам использования памяти содержит три сообщения.
А вот отчет об утечках памяти включает лишь одно.
Следует заметить, что утилита lint из Sun Studio способна обнаружить большинство из этих проблем, да и компилятор С++ также выдаст два предупреждения.
Кстати, во время осуществления контроля существенно замедляется исполнение кода, так что с большими программами придется набраться терпения.
Анализатор потоков исполнения
Этот новый инструмент впервые появился в Sun Studio 12.
Он замечателен тем, что позволяет выявить незащищенные конкурентные попытки доступа к данным (race conditions) и взаимные блокировки (deadlocks) потоков. Причем все эти события, хотя и отслеживаются в динамике, совершенно не должны реально произойти для того, чтобы анализатор выявил потенциальную проблему.
Нужно отметить такие особенности работы с анализатором:
-
в опциях компилятора в проекте необходимо указать выражение «xinstrument=datarace», иначе анализатор выдаст предупреждение о том, что не покажет ничего разумного;
-
использование указанного выше флага замедляет выполнение программы, и потому, возможно, его стоит применять лишь к отдельным модулям, что допускается.
А теперь рассмотрим программу поиска простых чисел, в которой предпринята наивная попытка обеспечить ускорение за счет параллелизации:
Добавим опцию компилятора и запустим Advanced Tools • Thread Analysis. Через некоторое время появится отчет об анализе. В данной программе он содержит четыре обнаруженных попытки конкурентного доступа. Выделив любую из них, переходим на вкладку Dual Source и видим места, где происходит доступ, а подходящий синхронизационный объект не захватывается.
Похожая ситуация имеет место и с блокировками. Возьмем пример программы, которая моделирует классическую задачу о пятерых обедающих философах, сидящих за круглым столом. В каждый момент времени каждый из них либо размышляет, либо ест. Для еды одновременно требуются две вилки. Поэтому, прежде чем в очередной раз перейти от размышлений к приему пищи, философу надо дождаться, пока освободятся обе вилки — слева и справа от него, и взять их в руки. Немного поев, философ кладет вилки на стол и опять начинает думать.
Запустим и получим отчет:
Здесь имеются две взаимные блокировки. Одна, заметим, была потенциальной и вовлекла в себя всех пятерых философов и все пять вилок! Что же, совсем неплохо — новый инструмент работает не слишком быстро, но зато надежно.
Хотим, чтобы было быстро!
Есть и такие программисты, которые желают, чтобы их алгоритм работал быстрее. А иногда заказчик требует от программиста, чтобы приложение перестало быть таким угнетающе медленным.
Забавно, что многие разработчики в таких случаях заявляют, что сами знают тот участок, где программа «подтормаживает», и давно хотят его переписать. И им бывает очень обидно, когда они, потратив много дней на переделывание алгоритма, выясняют, что быстрее не стало.
Так что же нужно делать? В первую очередь рекомендуется просто проверить, в каком режиме Development Mode и с каким значением Multithreading Level собирается приложение. Если они далеки от тех, которые были использованы в разделе «Компиляторы», то попробуйте их поменять. Позвольте компилятору выполнить работу за вас.
Если же это не поможет или по какой-либо причине такой способ не подходит, то нужно выяснить, какие места в коде съедают основное время. И здесь придет на помощь профилировщик Sun Studio. Искать его следует в меню Advanced Tools • Advanced Profiling.
Он работает быстро и совместим с приложениями, собранными любым компилятором. Кроме того, не требуется перестраивать приложение в каком-либо специальном режиме.
Детальное освоение всех возможностей профилировщика Sun Studio достойно, пожалуй, целой книги. Но в самом простом случае нужно щелкнуть мышью и подождать, пока на экране не появится отчет. В предложенном ниже примере, где выполнялось аффинное преобразование графического изображения, удалось быстро найти самую проблемную строку кода.
А вот на вопрос, что делать с этим узким местом, универсального ответа нет. Стоит подумать, посмотреть на другие формы отчета профилировщика, возможно, провести еще ряд экспериментов.
И хотя Sun Studio не способен переписать текст, он пытается быть максимально полезным. Обратите внимание на синие строчки в отчете. Это комментарии оптимизатора. Читать их не очень удобно, но все же они помогают понять, что именно оптимизатор проделал с кодом, чтобы он стал работать быстрее. С этим надо разобраться, чтобы, если потребуется, самостоятельно вносить эти изменения. Это обеспечит следующее:
-
после внесения оптимизаций вручную компилятор, возможно, проделает еще какие-либо улучшения;
-
код, оптимизированный вручную, будет работать быстро и на более низких уровнях оптимизации и при сборке другими компиляторами;
-
оптимизация вручную может навести на мысль о том, как упростить алгоритм (в случае с аффинным преобразованием именно так и вышло);
-
оптимизация вручную порой приводит к перемещению узкого места, что дает новую пищу для размышлений.
* * *
Sun Studio 12 представляет собой действительно профессиональный набор инструментов для системного разработчика в Unix-системах, разработчика сложных многозадачных систем с нетривиальным взаимодействием, систем, активно эксплуатирующих параллельные многопоточные вычисления, систем моделирования и расчета сложных физических, химических, геологических, метеорологических процессов и других ресурсоемких вычислений. Поскольку Sun Studio 12 бесплатна даже для коммерческого использования и имеется Linux-версия продукта, то можно предположить, что разработчики аналогичных систем для Microsift Windows и прочих платформ будут иногда использовать аналитические инструменты Sun Studio для улучшения своих приложений. Программистам, работающим на Solaris и особенно на архитектуре SPARC, имеет прямой смысл использовать Sun Studio как основной рабочий инструмент.
Тем же, кому нужно что-нибудь попроще для работы под управлением Windows, стоит попробовать NetBeans C/C++ Development Pack. Особенно тогда, когда не предвидится сложных проблем в разработке системы.
Если же нужен «рефакторинг», поддержка UML или какой-нибудь дизайнер графических интерфейсов, то все это, увы, следует поискать в других продуктах. По крайней мере, пока. Впрочем, модульная архитектура и открытый код NetBeans дают возможность создавать свои расширения для этой среды разработки и пользоваться теми, что уже размещены на www. netbeans. org.
В целом же Sun Studio 12 оставляет приятное впечатление. Но разработчикам продукта надо еще серьезно поработать над эргономичностью и интуитивностью интерфейса, дабы усилить позитивный эффект от технологических достижений, заложенных в этот инструментальный пакет.
Ресурсы для разработчиков
Страница Sun Studio: http://developers.sun.com/sunstudio/ http://ru.sun.сom/developers/sunstudio/
Страница Solaris Express, Developer Edition: http://ru.sun.com/developers/sxde/
Страница NetBeans C/C++ Development Pack: http://www.netbeans.org/products/cplusplus/
Рекорды Sun Studio: http://developers.sun.com/sunstudio/products/benchmarks.html
Новшества
Что же нового появилось в этой версии пакета? Как и прежде, вы сможете редактировать, отлаживать приложение или библиотеку, настраивать его производительность. Приятно, что в новой версии делать все это стало значительно удобнее. Помимо того, Sun Studio 12 предлагает:
-
компиляторы и другие инструменты, ранее доступные только для OS Solaris;
-
новый инструмент Thread Analyzer, предназначенный для поиска взаимных блокировок и одновременного доступа к данным в многопоточных приложениях;
-
наконец-то заработавший на процессорах Intel и AMD контроль памяти во время выполнения;
-
интегрированный в IDE профилировщик (раньше поставлялся как отдельный инструмент со своим графическим интерфейсом).