переход с Windows на Linux [закрыто]

57

Мне нужно согласовать эти 2 факта:

  1. Мне не комфортно работать с Linux;
  2. Мне нужно разработать программное обеспечение для Linux.

Немного предыстории: у меня более 10 лет опыта программирования на Windows (почти исключительно на C / C ++, но также на некоторых .NET), я был пользователем FreeBSD дома около 3 лет или около того (затем мне пришлось вернуться к Windows), и у меня никогда не было большой удачи с Linux. И теперь я должен разработать программное обеспечение для Linux. Мне нужен план.

В Windows вы можете просто знать язык программирования, API, для которого вы программируете, свою IDE (VisualStudio) и некоторые базовые инструменты для устранения неполадок (Зависит, ProcessExplorer, DebugView, WinDbg). Все остальное приходит естественно.

В Linux это совсем другая история. Как, черт возьми, я узнаю, какая DLL (извините, Shared Object) будет загружаться, если я сделаю ссылку на нее из плагина Firefox? Что является эквивалентом Linux для вставки __asm ​​int 3 / DebugBreak () в исходный код и запуска программы, а затем для того, чтобы ОС вызывала отладчик? Почему сборки адского релиза используют что-то, называемое appLoader, в то время как сборки отладки работают как-то иначе? Хуже всего: как обеспечить среду разработки Linux?

Итак, принимая во внимание, что ненависть обычно связана с недостаточным знанием, что бы вы порекомендовали? Я в порядке с Emacs и GCC. Мне нужно научиться работать в качестве администратора / пользователя Linux, и мне нужно изучить правильные инструменты для устранения неполадок (кстати, strace - это круто), эквиваленты тем, которые я упоминал выше.

Нужно ли делать Linux с нуля? Или мне нужно просто прочитать некоторые книги (я читал «Среду программирования UNIX» Кернигана и «Расширенное программирование ...» Стивенса, но мне нужно изучить что-то более практичное)? Или мне нужно иметь какой-нибудь дистрибутив Linux на моем домашнем компьютере?

Rincewind
источник
73
Я чувствую то же самое к Windows
15
Рассматриваете возможность получить другую работу, с которой вам удобнее?
3
На Unices manэто твой друг. Я бы man nmи man ldв качестве отправной точки.
dietbuddha
1
начать использовать Windows;)
Джигар Джоши
1
«Все остальное приходит естественно»? Конечно, это естественно, ты занимаешься этим уже 10 лет. Linux не хуже, он другой . И теперь, когда вы на 10 лет старше, ваш мозг не так легко усваивает новые вещи, как раньше, и все те вещи, которые отличаются, становятся чем-то, что вы должны отучить. Приближение всего к «Linux sucks» сделает вашу жизнь несчастной.
JesperE

Ответы:

62

Вы можете найти статью Динамическое связывание в Linux и Windows интересной, в которой объясняется, как каждая ОС выполняет динамическое связывание. В статье Общие пути поиска библиотек объясняется, как найти библиотеки. Также очень хороши статические, совместно используемые динамические и загружаемые библиотеки Linux . Хорошая вещь о библиотеках Linux состоит в том, что они имеют лучшую поддержку управления версиями и имеют несколько версий библиотеки, чем Windows (AFAIK, я не занимаюсь Windows). Для этого см. Управление версиями интерфейса библиотеки в Solaris и Linux . Эти статьи должны действительно охватить вас библиотеками.

GDB очень мощная, хорошим введением, вероятно, является учебник RMS по gdb . Возможно, вы захотите прочитать об условных контрольных точках. Эквиваленты, чтобы __asm(int 3)увидеть вопрос Установить программную точку останова в коде C или C ++ программно для gdb в Linux .

Книга " Расширенное программирование Unix" от Марка Рочкинда, которую надо прочитать, ИМХО. Имеет множество примеров и охватывает все темы POSIX / SUS очень хорошо объясненным способом. Это лучшая книга на эту тему, которую я когда-либо читал.

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

Использование Linux From Scratch поможет вам понять, как устроена система Linux, но я думаю, что это не сильно улучшит ваши знания об этом с точки зрения разработчиков. Это делает вас более комфортным с Linux, поскольку вы узнаете, какие части есть в среде Linux (и частично также почему ). Linux не будет для вас большим черным ящиком после работы с Linux с нуля.

оборота DarkDust
источник
Конечно, в 32-битной системе это прерывание прервется в отладчик, если процесс уже отлаживается . Вот об этом, если я спрашиваю. Windows позволяет подключить отладчик после того, как произошла ловушка. В некоторых случаях это очень удобно. И спасибо за ссылки!
rincewind
6
Отличный ответ! Обратите внимание, что для учебника GDB RMS - это «Райан М. Шмидт», а не «Ричард М. Столлман». (важное примечание, так как Столлман был
первым
Windows поддерживала параллельную загрузку библиотек ( msdn.microsoft.com/en-us/library/ms229072(v=vs.80).aspx ) около 12 лет. Так что вы не правы в отношении версий.
Клаус Йоргенсен
16

Если вам нравится strace, не забывайте ltrace: эквивалент для библиотечных вызовов.
Также да, я рекомендую Linux From Scratch . Это хорошее упражнение в разработке основных элементов ОС и их сочетания.
Для современного полного справочного руководства по системному программированию я бы порекомендовал выбрать интерфейс программирования Linux .

entropo
источник
12

Mac OS X похожа на Мерседес; это самый красивый и чистый, но это стоит много. Windows похожа на Тойоту; он доставит вас туда и обратно.

Linux как хотрод; Это для людей, чтобы копаться и разбирать и снова собрать вместе. Linux не для тех, кто просто хочет использовать компьютер; это для людей, которые любят компьютеры. Люди, которые не любят компьютеры, должны держаться подальше от них.

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

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

Если вы любите компьютеры, вы можете любить Linux; если ты не любишь компьютеры, зачем вообще программируешь?

Энди Кэнфилд
источник
13
+1, потому что «В Linux дела обстоят проще, в Linux труднее; в Linux возможны невозможные в Windows ». Я бы добавил: « В то время как Windows сует в рот предварительно переваренную пищу, в Linux у вас есть возможность готовить, и наградой за это является то, что вы можете есть то, что вам нравится » ... Конечно, съедобно это или нет Многое зависит от того, насколько вы хороший повар ...
Ален Паннетье
14
@ Энди: «Windows похожа на Тойоту» . Тойота имеет гораздо лучшее качество, чем Windows.
Восстановите Монику
4
@ SK-logic, Точно. Не вступая в очередную религиозную войну, учтите следующее. По чисто стратегическим и финансовым причинам MS ориентированы на максимально возможную аудиторию. Технические вещи, которыми пользователи, обладающие компьютерными знаниями, хотели бы иметь возможность управлять, скрыты из виду, чтобы у Джонсов не было проблем. В конечном итоге вы сталкиваетесь с бюрократизмом везде: DEP, GPO, «Доверенный установщик», частные или скрытые API, «самовосстанавливающаяся загрузка» и т. Д. Гики не исправляют Windows, они просто отказываются. Linux не имеет той же цели гегемонии; это сделано пользователями для пользователей. В этом весь смысл.
Ален Паннетье
3
@ SK-logic - «если у вас есть исходники для Windows» ... :-)
Рори Олсоп,
3
«Запомните несколько вещей, которые« невозможны в Windows »и« возможны в Linux »- я нашел ошибку в системном скрипте Linux и исправил ее. Я нашел ошибки в Windows, но так и не смог их исправить. у меня есть образ ISO (CD) в файле на диске, я могу смонтировать его как диск в Linux, вы можете сделать это в Windows? И помните, что почти все в Linux бесплатно, и почти все в Windows требует дорогого проприетарного приложения.
Энди Кэнфилд
9

Как насчет разработки на Mono с Monodevelop? Это позволит вам довольно легко начать заново использовать свой опыт в .NET.

Иоганн Блэйс
источник
Я попробовал это недавно - некоторые отличия от Visual Studio, конечно, но я был запущен вечером. Это отличный путь миграции.
JBRWilkinson
8

Это сложно, когда вы смотрите на это с самого начала (точно так же, как если бы вы были разработчиком Linux, которому поручено заняться какой-то разработкой для Windows). Я бы решил эту проблему за один раз.

  • Сначала настройте свою среду (компилятор, IDE - да, они существуют, Netbeans / Eclipse и т. Д.)
  • Затем установите apis более высокого уровня (boost / Qt и т. Д.)
  • Начните медленно, если есть непосредственная проблема, которую нужно решить, получите компиляцию кода (или начните писать с нуля и т. Д.) Как вы бы взялись за любой проект разработки, сначала получите вещи, которые вы знаете, работающие (то есть вещи, которые не нуждаются в конкретной ОС) взаимодействие), а затем, когда вы нажмете на поиск, я уверен, что кто-то уже сталкивался с такой же проблемой раньше и решил ее ..

Самое главное, оставить все ваши субъективные мнения за дверью. И нет, вам не нужно быть гуру, чтобы разрабатывать в Linux, я знаю достаточно, чтобы обойти, и не все - но мне это удобно ...

Nim
источник
1
+1 Nim: StackExchange имеет огромное количество предварительной информации здесь. Мне больше всего нравится Unix, но в настоящее время я работаю в среде разработки Windows и в поиске SE отвечаю почти на все мои запросы за очень короткий промежуток времени.
Рори Олсоп
6

The success or failure of many thing in life comes down to our attitude, looking for positives and keeping your mind focused on the positives will do more to adide you as you start down this new interesting adventure.

Сколько времени вам понадобилось, чтобы стать опытным в работе в среде Windows. Вы могли бы сказать, что это было легко, вы только начали. Но у вас было несколько лет работы с окнами до этого. Как долго вы использовали Windows, прежде чем написали свою первую программу? Для меня это было 8 лет, хотя я уже почти 5 лет использую Linux. Я теперь более опытный в Linux, чем в Windows. Вы должны дать себе хотя бы столько времени, чтобы ознакомиться с новой системой.

Начните со списка приложений, с которыми вы не можете жить в Windows, и ищите альтернативы в мире * nix. http://alternativeto.net/ и разделы для чтения в Википедии могут быть полезны здесь.

Вот список альтернативных программ, которые могут оказаться очень полезными. Вот некоторые альтернативы тем вещам, которые вы упомянули.

Другие полезные ресурсы при переходе от одной системы к другой

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

Звучит так, словно прошло много времени с тех пор, как вы смотрели на мир * nix. Я бы порекомендовал некоторые из новых выпусков дистрибутивов от fedora , suse , debian или моей любимой рабочей станции Ubuntu .

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

Linux From Scratch будет гораздо важнее, если вы разрабатываете специально для Linux очень специфический и технический смысл. То есть, вы хотите разработать ядро ​​или перенести программу на суперкомпьютер под управлением Linux. Это было бы очень полезно, тем не менее. Я думаю, вы могли бы оставить это на несколько месяцев, пока вы просто пытаетесь начать работать в Ubuntu. Ubuntu будет максимально приближена к вещам, просто работающим в мире Mac и Windows.

nelaaro
источник
1
Debian не совсем новый дистрибутив. :-P Это все еще хороший выбор, хотя.
Стив
Также как SuSE и Fedora ... SuSE уже 15 лет, Fedora - действительно один из "младших" дистрибутивов, которому 8 лет. Тем не менее +1.
DarkDust
1
@Darkdust @ Стив, новый, как и в последних выпусках,
nelaaro
6

Я думаю, что вы ответили на свой вопрос в вопросе:

«В Windows вы можете просто знать язык программирования, API, для которого вы программируете, свою IDE (VisualStudio) и некоторые базовые инструменты для устранения неполадок (Зависит, ProcessExplorer, DebugView, WinDbg). Все остальное естественно. "

Подумайте, что в Linux вы можете обойтись без знания языка программирования, API (или пары), вашей IDE (Eclipse или NetBeans, даже Geany, Emacs или vim, если хотите) и некоторых основных инструментов для устранения неполадок ( gdb, средства трассировки, lint, htop, ps).

У вас много знаний, вложенных в экосистему программирования Windows. Многое из этого (мы надеемся) абстрактные знания (что такое компилятор, отладчик, разделяемая библиотека, процесс, поток? Что они делают?), Которые легко переведутся, как только вы освоите различные инструменты. Некоторые из них относятся к конкретному домену (какая DLL связана, когда я добавляю X в проект?), Но даже переход с одного класса языка на другой в Windows потребует некоторого нового изучения.

Установите Ubuntu или Fedora на ВМ, прочитайте некоторые учебники C ++ Hello World в Eclipse или NetBeans, а также некоторые отладки в учебниках Eclipse / NetBeans и позвольте естественной способности вашего мозга адаптироваться. Это будет переводить идеи для вас, если вы расслабитесь и просто заставите его работать.

Джастин
источник
3

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

Я использую это:

for i in *; do f=`basename $i .gz`; man `basename $f .1` ; done

... заменить .1 номером раздела, который вы читаете, .2, .3 и т. д. Нажмите ctrl-Z ctrl-C, чтобы выйти из цикла. Ваш пробег может отличаться, если ваш дистрибутив Linux хранит вещи по-другому, то есть не так, как cmdname.1.gz.

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

Hack Saw
источник
2
Я бы предложил запустить xmanболее «дружественный» интерфейс. Выберите раздел, щелкните страницу руководства, прочитайте ее. Промыть, повторить.
ΤΖΙΟΥΩΤΖΙΟΥ
Я забыл о таких вещах. Состояние документации в свободной среде ОС далеко не идеальное, и я обнаружил, что инструменты часто усугубляют ситуацию, поэтому я перестал их использовать. Я могу только предположить, что они стали немного лучше?
Hack Saw
3

Не заставляйте себя делать то, что вам не нравится. Используйте Windows в качестве среды разработки, пишите переносимый код, кросс-компилируйте его для Linux и тестируйте его только на ВМ.

SK-логика
источник
2

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

Возможно, что-то в этом роде?

Вообще говоря, мой интерес и уверенность в GNU / Linux связаны с тем, что он гораздо более удобен (и требует в первые дни работы), чем Windows. Мне нужно было возиться со многими вещами, чтобы заставить вещи работать, и это помогло мне многому научиться. Сейчас все намного лучше, но все эти часы помогли.

Нуфал Ибрагим
источник
2

Я был одним из двух, кто получил что-то похожее, но другое. Я работаю в школьном округе K-12, и бизнес-система (HR, финансы и т. Д.) Мигрирует с базы данных HP3000 / TurboImage на платформу Linux / MS SQL. Я доволен стороной MS SQL. Но не в сторону Linux. Мы вдвоем на стороне администратора, а не на стороне программирования. Программирование выполняется снаружи - стороннее бизнес-приложение для организаций K-12.

По выходным я проходил урок «Введение в Linux (Redhat)» (5 выходных), который проводился в основном в режиме командной строки, и это стоило мне времени, чтобы быстро начать работу с Linux. Очевидно, YMMV в зависимости от класса / учителя.

Вы упомянули «Хуже всего: как обеспечить среду разработки Linux?»? Поскольку вы уже хорошо знакомы с Windows, я настоятельно рекомендую вам получить копию vmWare Workstation. При этом вы можете сохранить Windows в качестве рабочей станции и установить Linux в качестве гостевой системы - удалять, промывать и повторять при необходимости. Когда вы получаете хорошую настройку, я думаю, что вы можете сделать ее снимок, но я не могу точно сказать, какие версии поддерживают аспект снимка. И если вы идете по пути к рабочей станции vmWare, чтобы включить несколько установок разработки - увеличьте объем памяти, безусловно.

Я также не против рекомендовать использовать CentOS в качестве ОС Linux для гостей. Насколько я понимаю, это похоже на RedHat без брендинга и / или рекламного предложения и / или расходов на поддержку. Я не знаком с другими разновидностями Linux, поэтому не могу дать информацию о них.

Greg

Грегори Томсон
источник
1

Мне нравятся обе платформы, и, несмотря на все различия в пользовательском интерфейсе и экосистеме разработки, я нахожу их больше похожими, чем разными. Фактически, для большинства концепций Windows вы можете найти эквивалентные концепции Linux, просто выполнив поиск в Интернете.

Сказав это, я настоятельно рекомендую научиться делать вещи «по-Unix». Используйте командную строку, а не глючные интерфейсы GUI (здесь я говорю в основном о gdb); не ищите IDE, а научитесь использовать набор специализированных инструментов. Выберите хорошего редактора (указывая на vim) и изучите его хорошо. Читайте, как makeработает, даже если вы не планируете стать экспертом. Может быть, вы даже полюбите Linux. С ним весело и весело играть.

Неманья Трифунович
источник
1

Подумайте об этом: вы когда-то ничего не знали о Windows, но вы узнали об этом и со временем освоились с этим.

Затем MS изменила любую систему программирования, с которой вам было удобно работать, на .NET, и вы больше ничего не знали о DLLS, COM и т. Д., Вам приходилось изучать такие вещи, как сборки, GAC, домены приложений. Вы узнали, что все в порядке.

Так почему же вы сейчас беспокоитесь о том же с Linux?

В Интернете есть множество учебных пособий для начала работы со всеми видами сред программирования. Теперь вы говорите GCC, поэтому я собираюсь взять на себя разработку C ++. Получите Eclipse, установите CDT (инструменты c dev) поверх вашей платформы Eclipse (Eclipse - это многоцелевая IDE, вы можете использовать ее для C ++, PHP, Java и т. Д., Но вам нужно установить инструмент для своего языка так как вы бы не хотели, чтобы все было предустановлено, как VS, и потребуется 3 дня для установки :))

В Интернете есть простые в использовании учебные пособия. У IBM есть один здесь, который является довольно полным.

Инструменты отладки ... в eclipse он встроен ( учебное пособие ), но вы можете найти множество инструментов, подобных тем, которые вы упомянули, просто поищите в Интернете, и вы найдете множество вариантов. Вам понадобится некоторое время, чтобы понять, как читать дамп ядра (в отличие от пользовательского дампа Windows, например), но вы получите это.

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

gbjbaanb
источник
0

Я не думаю, что вам нужно делать Linux с нуля. На вашем месте я бы пошел на Ubuntu. Это более удобно, и, основываясь на Debian, доступно множество технических материалов.

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

anders.norgaard
источник
0

Google "Искусство программирования Unix" и читать его. ИМО, твоя главная трудность - другая философия, и эта книга отлично подходит для этого.

Он также знакомит вас с некоторыми неочевидными, но технически очень важными различиями между * n * x и системами Windows - они являются ключом к пониманию того, почему в Linux имеет смысл действовать иначе.

user59625
источник
1
... а также предоставляет вам множество инструментов и методов для использования в Linux.
0

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

В случае приложения с графическим интерфейсом я считаю, что самый простой способ - это использовать Qt, который имеет собственную среду разработки (Qt-Creator) и является кроссплатформенным, что позволяет вам изучить только один API, который можно использовать для Windows / Linux. / OSX и даже мобильная разработка. Как и Visual Studio в Windows, или XCode в OSX, вы можете создавать и размещать окна и элементы из графического редактора, а API очень легко подобрать с помощью множества примеров приложений.

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

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

Темный рыцарь
источник