воскресенье, 27 сентября 2009 г.

Переход на Linux: взгляд разработчика под Windows

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


Предыстория

Проект, над которым я работаю, написан на C++ с использованием небольшого числа утилит на Python. В начале я работал в Visual Studio 2005 на Windows XP. Это уже стало само по себе проблемой - обновление Visual Studio или системы не является тривиальной задачей, так как и ОС и среда разработки требуют покупки новых лицензий, а особенно в офисной работе новые версии покупаются не так уж и часто.
Эта проблема встала особенно остро, когда я начал распараллеливать части своего приложения. В своем ядре программа выполняет большие объемы численных вычислений, которые могут быть независимо обработаны в множестве маленьких блоков кода. Так как я не мог использовать OpenMP (сторонняя библиотека не могла быть слинкована, если задействован OpenMP), я управлял потоками вручную. К сожалению приложению требовалось выделение небольшого объема памяти для каждого потока, и как оказалось, такое масштабирование на XP выполнялась просто катастрофически. В то время как я получал прирост производительности при переходе от одного ядра к трём, всё явно замедлялось при задействовании четвертого ядра. Я столкнулся с проблемами либо диспетчера потоков, либо подсистемы управления памятью, так в моём коде вообще не было ввода-вывода.
Просто попробовав запустить это же приложение на Windows Vista, я обнаружил, что там оно более чем в два раза быстрее. Но, к сожалению, я не мог установить свою Studio на эту ОС - вопрос о разработке на XP и тестировании на Vista даже не стоял. Опять таки, с бесплатной средой, проблем бы не возникло, если бы... (express edition не имеет поддержки ни x64, ни OpenMP - смотри дополнение в конце!).
С другой стороны достать новый Linux с новым компилятором не составляло для меня никакой проблемы. При помощи Wubi можно запустить Linux на том же компьютере, где стоит Windows даже без переразбивки жесткого диска. Это особенно удобно в корпоративном окружении, где нельзя просто удалить раздел и установить на него Linux, не вызвав праведного гнева администратора.

Linux

Я использовал Wubi и установил с его помощью Kubuntu,так какKDE мне нравится больше – особенно потому что сейчас я использую Qt для разработки интерфейса с пользователем. То есть я использовал Kubuntu 9.04 x64, до этого я пользовался x86 Windows XP.

Портирование

Я начал с загрузки кода из SVN, и, естественно, с этим не возникло никаких проблем. Но, хотя приложение и было написано на стандартном C++ и не полагалось на специфические для Windows вызовы, оно было сохранено в проектных файлах Visual Studio и использовало несколько вызовов WinAPI. Первым делом я перенёс все на CMake - в принципе это следовало сделать еще находясь на Windows. При помощи CMake, я смог быстро конвертировать один подпроект за другим и сразу же проверить из на наличие ошибок компиляции. Этот путь хорошо себя зарекомендовал - я ни разу не оказывался в ситуации, когда бы я получал множество ошибок компилятора или линковщика сразу. Такая ситуация возникала у меня, когда я переводил проект уже на CMake с Windows на Linux и попробовал сделать всё одним махом. Во время переноса лучше двигаться поступательно от одного подпроекта к другому, даже если весь проект использует изначально портируемую систему.
Как я уже говорил, на Windows я использовал явное управление потоками, которое я заменил на OpenMP на Linux. Теперь я мог выбросить и множество конфигурационного кода для потоков, например мне не надо было понижать приоритет своего приложения, чтобы оно просто не зависло, как это было на XP. Конечно, можно было использовать и Boost.Threads, но OpenMP хорошо работает с циклическим параллелизмом, который использовал я, и общая модель даже упростилась по сравнению с той, которую я создал полностью сам.
Для графики я уже использовал OpenGL. Так у меня без проблем получилось запустить бинарные драйвера от nVidia, то и с этим не возникло никаких проблем. В общей сложности портирование заняло у меня полдня, включая время на установку и настройку Linux.

Результаты

Общие результаты весьма интересны: то же самое приложение теперь работает в 5-10 раз быстрее, используя все четыре ядра, то есть перенос на Linux определённо того стоил. Я думаю, что с Visual Studio 2010 на Windows 7 я получил бы такую же производительность, но ключевой момент здесь в том, что заставить работать ваш код на Linux не стоит вам ничего кроме времени, и очень немного, если делать это аккуратно. Использование CMake (или другой портируемой системы сборки), написание более или менее чистого C++ и использование портированных библиотек делают перенос на Linux осуществимым без особых проблем, а сам переход на другую систему несложен. В настоящий момент, средства разработчика на Linux вполне удобны и "болезненного перехода" от Visual Studio на, к примеру, KDevelop или Eclipse CDT больше нет.
На самом деле, переход настолько прост, что фирме Microsoft стоит серьёзно задуматься. Например, я последние несколько лет писал код исключительно под Windows, и только время от времени пробовал Linux, но никогда не переключался на него полностью из тех или иных больших или маленьких проблем. И вот, в последние год или два, Linux-desktop, вместе со всеми программами, доступными на нём, может предоставить некоторые реальные преимущества перед Windows, особенно если у вас нет доступа к самым последним продуктам от Microsoft. До недавнего времени последние предоставляли самые лучшие средства разработки и стабильные API, что, на мой взгляд, и являлось краеугольным камнем их успеха. Теперь же, они меняют интерфейсы достаточно быстро (WinForms? WPF? WinAPI?), они создают платформы, которые требуют полного переписывания существующего кода (Я всё еще жду приложение, подобного AutoCAD, которое бы состояло из интерфейса на C# и бэкэнда на C++), да и цикл выпуска новых приложений просто слишком долгий - ждать два года, чтобы получить исправление компилятора, просто смешно.
С другой стороны, разработка на Linux означает, что у вас есть очень стабильный API (например, POSIX не собираются заменять на PoseFX), создание интерфейсов просто и понятно (на выбор GTK или Qt), и средства разработки движутся вперёд семимильными шагами (GCC и LLVM становятся день ото дня краше, и установка нового компилятора не требует покупки еще одной лицензии). Если Microsoft не одумается со своей политикой продажи Visual Studio 2010 и не даст четких и ясных ответов на вопросы о своём API, я думаю, всё больше разработчиков найдут, что Linux может быть замечательной средой для создания приложений.

[Добавление] Надо что-то сказать в связи с тем, что эта статья привлекла большое внимание и многие понимают её несколько неправильно. Относительно библиотеки - у меня был доступ к исходному коду, я мог собрать её на Windows - это просто заняло бы очень и очень много времени, так как она зависит от множества библиотек, как например zlib, которые мне бы тоже пришлось собирать с новыми настройками на Windows. Используя Linux удовлетворить все эти зависимости гораздо легче.
OpenMP против ручного управления потоками: производительность по сравнению с явным управлением многопоточностью не улучшилась, но это дало очень милый бонус в виде более чистого кода. На Windows я не мог использовать OpenMP в связи с проблемами линковки. Еще один бонус получился от перехода с x86 на x64. И наконец, управление памятью в Linux гораздо лучше для многопоточных приложений, и из этого получился самый большой прирост производительности. В целом, приложение работает в несколько раз быстрее, без изменений с моей стороны.
Итог: В данном конкретном случае, переход на Linux занял у меня всего несколько часов, в то время как результат того стоил: улучшение производительности, меньше мороки с зависимостями. Минусы - надо привыкнуть к Linux и другим средствам разработки - для меня полностью перекрываются плюсами. Это главная мысль этого поста. Я был поражён насколько легко было полностью перевести этот проект с Windows на Linux, так как я ожидал массу проблем (например, вообще невозможность запустить хоть что-нибудь из проекта!).
Всё могло бы быть по-другому, если бы на Windows было бы проще собрать все библиотеки и зависимости, и у меня бы был доступ к новому компилятору, но всё получилось, как получилось, и я совершенно не скучаю по Windows у себя на работе.
[Добавление 2] x64 версия Visual C++ Express требует некоторой настройки, чтобы поддерживать x64, но это возможно, если вручную добавить компиляторы из Windows SDK. Можно обратить к официальной документации или одному из пособий, как это сделать.

15 комментариев:

  1. смахивает на пиар того же линукса

    ОтветитьУдалить
  2. мды... переводил Промптом? Очень плохой перевод.

    ОтветитьУдалить
  3. Анонимный, толсто.

    ОтветитьУдалить
  4. Спасибо за критику)) Если можно поконкретнее - не нравится грамматика, подбор слов, общий стиль или что-то еще?
    А вообще перевод полностью ручной.

    ОтветитьУдалить
  5. Да это действительно пиар, самый откровенный пиар, причем такой же пиар, как если бы вам сказали что мерседес лучше жигули и расписали все его прелести. Микрософт действительно выпускает платформы настолько бысто, что не успеваю запоминать их названия, silverlight, c#, Vb, MFC, .NET 4.0, ASP.NET, LINQ, кто все эти люди? Директ ИКС который якобы призван стандартизацию вводить - все равно не снимает работы по проверки конкретной его версии и включение или выключения конкретных фич. Студии новые выходят - надо покупать, виндовс новый вышел надо покупать, все надо покупать, причем пока не готов отдавать 30-40 т.р. каждые два года, а работать за экспрес студий - так лучше vim выучу, экспрес чуть удобнее чем в блокнот с подсветкой. Ко всему прочему, под линукс действительно проще найти библиотеку и компиллятор, стоит добавить что кроме эклипса и кдевелоп, есть ещё замечательные иде Code::Bloks, QT Creator, NetBeans. в каких-то только С++ в каких-то все что только можно. GUI там уже давно редакторами форм всевозможными делается. И добавить ещё сюда практически полную защищенность от вирусов. В общем сам сейчас нахожусь на пороге перехода, часть своего домашнего заопарка(сервер и ноут) перевел на линукс - теперь дело за рабочей машиной. И ещё заметил что люди часто любят мифы, типа - ой линукс не поддерживает железо, на ноут встали все драйвера сами, ничего даже настраивать не пришлось. Миф номер два - нету програм, там их столько что глаза разбегаются и любая програма ставится в два щелчка мышью, первый щелчок - выбрать категорию, второй поставить галочку напротив имени.

    ОтветитьУдалить
  6. > Миф номер два - нету програм

    Это вполне реально. Например, выпустили школьный Linux, а программ по предметам (кроме математики и информатики) под него нет! А под Windows есть. Хотя бы теже 1C репетиторы.

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

    ОтветитьУдалить
  7. >а програм по предметам... под него нет!

    Ну вы бы еще сказали - "я написал прогу под винду, перехожу на Линукс, а аналога то нет!" :)

    И опять же, школьные проги достаточно просты - это не системные утилиты с завязкой на Exchange и ActiveDirectory или там на DirectX. Скорее всего они легко запустятся под Wine.

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

    ОтветитьУдалить
  8. Про перенос приложение и лёгкость управления с версиями и либами - соглашусь
    а вот пусть бы он попробовал наоборот

    ОтветитьУдалить
  9. > Несколько недель назад я перешёл со среды разработки на Windows к другой на Linux.

    Дальше я не читал. Теперь, вместо того, чтобы работать и учиться, автор сего пеара будет "настраивать свой линукс".

    ОтветитьУдалить
  10. > В начале я работал в Visual Studio 2005 на Windows XP

    Facepalm. Давно пора переходить со старой икспи и уж тем более 2005'ой студии.

    > Но, к сожалению, я не мог установить свою Studio на эту ОС - вопрос о разработке на XP и тестировании на Vista даже не стоял

    Криворукий идиот.

    > так какKDE мне нравится больше

    И чувство вкуса никакого.

    > Общие результаты весьма интересны: то же самое приложение теперь работает в 5-10 раз быстрее, используя все четыре ядра

    Что мешает в той же windows использовать 4 ядра, мм, сучка?

    Дальше идет перенос своего проекта на прыщекод. Это печально, видимо, проект автора никому и не нужен. Как и сам автор.

    ОтветитьУдалить
  11. "Дальше я не читал. Теперь, вместо того, чтобы работать и учиться, автор сего пеара будет "настраивать свой линукс"."
    И очень зря, линукс НЕ НАДО настраивать :) он будет УЖЕ НАСТРОЕН! Автор данного комента или генту взял в руки или ему по каким-то причинам выгодно распускать такие слухи. Личный опыт - ноутбук леново, убунту 9.04, с линуксом до этого не имел опыта работы, разобрался за три дня, поставил весь софт(скайп, джаббер, разные ИДЕ, поддержку видео кодеков, GPRS через телефон, даже эмулятор виндовс настроил и играл в свой любимый старкрафт), ещё заставил работать блютус свисток который с родными-то драйверами под виндовс не работал нормально, постоянно соединения терял.

    "Facepalm. Давно пора переходить со старой икспи и уж тем более 2005'ой студии."
    Предложите как это сделать не заплатив 6000 р. за виндовс, 12000 р. за офис и 4000 р. за студию.(итого 22 т.р. деньги за которые можно купить ещё один компьютер, ну или например отдохнуть недельку в турции)

    ОтветитьУдалить
  12. пиар не пиар, а простому пользователю Linux пока рановато. Я говорю именно про самого простого, а не слегка продвинутого и т.п.
    я например с Linux уже больше 7 лет дружу, но вот не задача, на мой ноут Asus F3JR с сран*й картой ATI X2300 перестали делать драва, и теперь о хоть какой-то сносной работе можно просто забыть. Так что прикажите делать? Вот вот.... сижу ипусь под Vista

    ОтветитьУдалить
  13. "простому пользователю Linux пока рановато"
    Абсолютно не согласен. Если этот пользователь может установить Windows, он сможет установить и Ubuntu.
    Конечно, с некоторым оборудованием могут возникнуть проблемы. Так бессовестнные ATI Radeon забили на поддержку старых видеокарт, сами не делают и другим не дают сделать работу за них. Тоже не могу поставить более позднюю версию чем Ubuntu 8.04 на свой старый комп с Radeon 9600. Но при желании можно и эту проблему решить.
    Уверен, что такие проблемы в будущем разрашатся. Когда люди приходя в магазин будут выбирать оборудование не с логотипом Windows XP/Windows Vista/Windows 7, а с логотипом Linux. Тогда и производители железа зашевелятся.

    ОтветитьУдалить
  14. "Так бессовестнные ATI Radeon забили на поддержку старых видеокарт, сами не делают и другим не дают сделать работу за них. Тоже не могу поставить более позднюю версию чем Ubuntu 8.04 на свой старый комп с Radeon 9600."

    Никто не мешает попробовать другие дистрибутивы Linux, имеющие весьма широкий выбор свободных драйверов. Например те же Mandriva/Mageia/OpenSUSE имеют в репозиториях как свободные так и проприетарные драйвера практически для любого оборудования, кроме, разве что, самых последних моделей ATI, драйвера на которые можно скачать с офф сайта AMD.

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

    А вот IDE это камень преткновения, так как MSVS все же удобней в процессе отладки, чем те же NetBeans и KDevelop, но вот в процессе написания кода разницы практически нет

    ОтветитьУдалить
  15. Все правильно написал/сделал.

    ОтветитьУдалить