movendo-se do Windows para o Linux [fechado]

57

Preciso conciliar esses 2 fatos:

  1. Não me sinto confortável trabalhando no Linux;
  2. Eu preciso desenvolver software para Linux.

Alguns antecedentes: Tenho mais de 10 anos de experiência em programação no Windows (quase exclusivamente C / C ++, mas também alguns .NET), eu era usuário do FreeBSD em casa por cerca de 3 anos (mais ou menos). Windows) e nunca tive muita sorte com o Linux. E agora eu tenho que desenvolver software para Linux. Eu preciso de um plano.

No Windows, você pode se familiarizar apenas com o conhecimento de uma linguagem de programação, uma API contra a qual está codificando, seu IDE (VisualStudio) e algumas ferramentas básicas para solução de problemas (Depends, ProcessExplorer, DebugView, WinDbg). Tudo o resto vem naturalmente.

No Linux, é uma história muito diferente. Como diabos eu saberia qual DLL (desculpe, Objeto Compartilhado) carregaria, se eu vincular a ela a partir do plugin Firefox? Qual é o equivalente do Linux à inserção de __asm ​​int 3 / DebugBreak () na fonte e na execução do programa, e depois deixar o SO chamar um depurador? Por que as versões infernais usam algo chamado appLoader, enquanto as versões depuração funcionam de alguma forma diferente? O pior de tudo: como provisionar o ambiente de desenvolvimento Linux?

Então, considerando que o ódio geralmente está associado a não saber o suficiente, o que você recomendaria? Eu estou bem com Emacs e GCC. Preciso me educar como administrador / usuário do Linux e preciso aprender as ferramentas adequadas para solução de problemas (strace is cool, btw), equivalentes às mencionadas acima.

Preciso fazer o Linux a partir do zero? Ou preciso apenas ler alguns livros (li o "ambiente de programação UNIX" de Kernighan e "Advanced Programming ..." de Stevens, mas preciso aprender algo mais prático)? Ou preciso ter alguma distribuição Linux no meu computador doméstico?

rincewind
fonte
73
Eu sinto o mesmo sobre o Windows
15
Considerado conseguir outro emprego com o qual se sinta mais confortável?
3
On Unices mané seu amigo. Eu faria man nme man ldcomo ponto de partida.
dietbuddha
11
começar a usar janelas;)
Jigar Joshi
11
"Tudo o resto vem naturalmente"? Claro que vem naturalmente, você faz isso há 10 anos. Linux não é pior, é diferente . E agora que você tem dez anos, seu cérebro não aprende coisas novas com a mesma facilidade que costumava fazer, e todas as coisas diferentes se tornam algo que você precisa desaprender. Abordar a coisa toda com "Linux é uma merda" tornará sua vida miserável.
JesperE

Respostas:

62

Você pode achar interessante o artigo Vinculação dinâmica no Linux e Windows, que explica como cada sistema operacional faz a vinculação dinâmica. O artigo Caminhos de pesquisa de bibliotecas compartilhadas explica como as bibliotecas são encontradas. Também estática, dinâmica compartilhada e carregáveis Bibliotecas Linux é muito bom. Uma coisa boa das bibliotecas Linux é que elas têm um melhor suporte para controle de versão e possuem várias versões de uma biblioteca que o Windows (AFAIK, eu não faço o Windows). Consulte Versão da interface da biblioteca no Solaris e Linux para isso. Esses artigos realmente devem ajudá-lo a cobrir as bibliotecas.

O GDB é muito poderoso, uma boa introdução é provavelmente o Tutorial de gdb do RMS . Você pode querer ler sobre pontos de interrupção condicionais. Para equivalentes, __asm(int 3)consulte a pergunta Defina o ponto de interrupção no código C ou C ++ programaticamente para gdb no Linux .

O livro Advanced Unix Programming de Marc Rochkind é uma leitura obrigatória, IMHO. Tem muitos exemplos e abrange todos os tópicos do POSIX / SUS de uma maneira muito bem explicada. É o melhor livro sobre esse tópico que li até agora.

Mas, para facilitar sua vida, eu recomendo usar uma API de alto nível que abstraia coisas para você, como o Qt. Também facilita a escrita em várias plataformas.

Fazer o Linux a partir do zero ajuda a entender como um sistema Linux é composto, mas acho que isso não melhora muito o seu conhecimento sobre ele do ponto de vista dos desenvolvedores. No entanto, você fica mais confortável com o Linux, à medida que aprende quais partes existem em um ambiente Linux (e em parte também por que ). Um Linux não será uma grande caixa preta para você depois de trabalhar no Linux From Scratch.

DarkDust
fonte
Claro, no sistema de 32 bits, essa interrupção será interrompida no depurador, se o processo já estiver sendo depurado . É isso se estou perguntando. O Windows permite anexar o depurador após a armadilha. Sob alguns cenários, isso é extremamente conveniente. E obrigado pelos links!
rincewind
6
Ótima resposta! Observe que, para o tutorial do gdb, o RMS é "Ryan M. Schmidt" e não "Richard M. Stallman". (uma nota importante desde Stallman foi o autor original do GDB)
entropo
O Windows tinha o carregamento da biblioteca Side-by-Side ( msdn.microsoft.com/en-us/library/ms229072(v=vs.80).aspx ) suportado por cerca de 12 anos. Portanto, você está errado no que diz respeito ao controle de versão.
Claus Jørgensen
16

Se quiser strace, não esqueça ltrace: o equivalente a chamadas de biblioteca.
Além disso, sim, eu recomendo o Linux From Scratch . É um bom exercício para descobrir os elementos principais do sistema operacional e como eles se encaixam.
Para um tratamento de referência de programação de sistema completo e moderno, eu recomendo escolher a Interface de Programação Linux .

entropo
fonte
12

O Mac OS X é como um Mercedes; é a mais bonita e limpa, mas custa muito. O Windows é como um Toyota; vai chegar lá e voltar.

Linux é como um hot rod; É para as pessoas se aprofundarem, desmontarem e voltarem a montar. Linux não é para alguém que só quer usar o computador; é para pessoas que amam computadores. Pessoas que não amam computadores devem ficar longe disso.

As coisas que você aprendeu no Windows não serão muito boas, não. Mas você vê os internos e vê o motor funcionando.

Tente usar o Linux como um novo brinquedo, com o qual você possa brincar, rastrear e ver o que está acontecendo. Coisas fáceis no Windows são mais difíceis no Linux; coisas impossíveis no Windows são possíveis no Linux.

Se você gosta de computadores, pode amar o Linux; se você não gosta de computadores, por que está programando?

Andy Canfield
fonte
13
+1, para " Coisas fáceis no Windows são mais difíceis no Linux; coisas impossíveis no Windows são possíveis no Linux ". Eu acrescentaria " Enquanto o Windows coloca comida pré-digerida em sua boca, no Linux você tem a possibilidade de cozinhar e a recompensa é que você come o que gosta " ... É claro, seja comestível ou não depende muito de quão bom um chef você é ...
Alain Pannetier
14
@ Andy: "O Windows é como um Toyota" . A Toyota tem uma qualidade muito melhor que o Windows.
Reintegrar Monica
4
@ SK-logic, precisamente. Sem se envolver em mais uma guerra religiosa, considere o seguinte. Por meras razões estratégicas e financeiras, os Estados-Membros visam o maior público possível. Coisas técnicas que os usuários conscientes do computador gostariam de controlar são ocultadas, para que os Jones não tenham problemas. Você acaba com burocracia em todos os lugares, DEP, GPO, "instalador confiável", APIs privadas ou ocultas, "inicialização auto-reparável" etc. Os geeks não corrigem o Windows, apenas optam pela exclusão. Linux não tem o mesmo objetivo hegemônico; é feito por usuários para usuários. Esse é o ponto.
Alain Pannetier
3
@ SK-lógica - "se você tem fontes do Windows" ... :-)
Rory Alsop
3
"Lembre-se de nomear algumas coisas que são" impossíveis no Windows "e" possíveis no Linux "- Encontrei um bug em um script do sistema Linux e o corrigi. Encontrei erros no Windows, mas nunca consegui corrigi-los. Suponha que você ter uma imagem ISO (CD) em um arquivo de disco; eu posso montar isso como uma unidade no Linux; você pode fazer isso no Windows? E lembre-se de que quase tudo no Linux é gratuito e quase tudo no Windows requer um aplicativo proprietário caro.
Andy Canfield
9

Que tal você desenvolver o Mono com o Monodevelop? Isso o ajudaria a começar com bastante facilidade reutilizando sua experiência no .NET.

Johann Blais
fonte
Eu tentei isso recentemente - algumas diferenças no Visual Studio, é claro, mas eu estava em funcionamento à noite. É um ótimo caminho de migração.
JBRWilkinson
8

É assustador quando você olha para isso desde o início (como se você fosse um desenvolvedor Linux encarregado de fazer algum desenvolvimento do Windows). Eu resolveria esse problema de cada vez.

  • Primeiro, configure seu ambiente (compilador, IDE - sim, eles existem, Netbeans / Eclipse etc.)
  • Em seguida, instale as APIs de nível superior instaladas (boost / Qt etc.)
  • Comece devagar, se houver um problema imediato a ser resolvido, obtenha o código compilando (ou comece a escrever do zero etc.) interação) e, quando você encontra uma busca, você tem certeza de que alguém já se deparou com o mesmo problema antes e o resolveu.

Mais importante, deixe todas as suas opiniões subjetivas à porta. E não, você não precisa ser um guru para desenvolver no Linux, eu sei o suficiente para dar a volta, e não tudo - mas estou confortável com isso ...

Nim
fonte
11
+1 Nim: O StackExchange possui uma quantidade impressionante de informações anteriores aqui. Eu me sinto mais à vontade com o Unix, mas atualmente trabalhando no ambiente de desenvolvimento do Windows e pesquisando no SE, respondi a quase todas as minhas consultas em um espaço de tempo muito curto.
Rory Alsop
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.

Quanto tempo você levou para se tornar proficiente em trabalhar em um ambiente Windows. Você pode dizer que foi fácil começar. Mas você tinha alguns anos trabalhando com janelas antes disso. Há quanto tempo você usa o Windows antes de escrever seu primeiro programa. Foram 8 anos para mim, apesar de eu estar usando o Linux quase exclusivamente há 5 anos. Agora sou mais proficiente em Linux do que em Windows. Você deve dedicar pelo menos esse tempo para se familiarizar com um novo sistema.

Comece com a lista de aplicativos com os quais você não pode viver no Windows e procure alternativas no mundo * nix. http://alternativeto.net/ e as seções adicionais de leitura da Wikipedia podem ser úteis aqui.

Aqui está uma lista de software alternativo que pode ser muito útil. Aqui estão algumas alternativas para as coisas que você mencionou.

Outros recursos úteis para mudar de um sistema para outro

Sobre como se tornar um usuário avançado ou administrador, consulte esses recursos

Também parece que já faz um tempo desde que você olhou para o mundo * nix. Eu recomendaria alguns dos novos lançamentos de distribuição do fedora , suse , debian ou da minha estação de trabalho preferida Ubuntu .

Agora você provavelmente pode se safar sem conhecer os aspectos internos do sistema e apenas o básico, como no Windows. Eu não apenas tentaria fugir com o mínimo. Se você vê o Linux como uma ferramenta que realmente o auxilia no seu desenvolvimento e não apenas como um sistema operacional no qual você o desenvolve, seria útil.

O Linux From Scratch será muito mais importante se você estiver desenvolvendo especificamente para Linux, é um sentido muito específico e técnico. IE que você deseja desenvolver para o kernel ou porta que programa em um super computador executando o Linux. Seria muito útil, no entanto. Eu acho que você provavelmente poderia deixar isso por alguns meses enquanto tenta continuar no Ubuntu. Ubuntu vai ser tão perto das coisas apenas trabalhar mundo do Mac e Windows.

nelaaro
fonte
11
O Debian não é exatamente uma nova distribuição. :-P Ainda é uma boa escolha.
Steve S
Nem o SuSE e o Fedora ... O SuSE tem 15 anos agora, o Fedora é de fato uma das distribuições "mais jovens", com 8 anos. Ainda assim, +1.
precisa saber é o seguinte
11
@Darkdust @ Steve-s novo como nos lançamentos mais recentes,
nelaaro
6

Eu acho que você respondeu sua pergunta na pergunta:

"No Windows, você pode simplesmente conhecer uma linguagem de programação, uma API na qual está codificando, seu IDE (VisualStudio) e algumas ferramentas básicas para solucionar problemas (Depends, ProcessExplorer, DebugView, WinDbg). Tudo o resto acontece naturalmente. "

Orienta o que, no Linux, você pode se familiarizar apenas com o conhecimento de uma linguagem de programação, uma API (ou algumas), seu IDE (Eclipse ou NetBeans, até Geany, Emacs ou vim, se desejar) e algumas ferramentas básicas para solução de problemas ( ferramentas de rastreamento, fiapos, htop, ps).

Você tem muito conhecimento investido no ecossistema de programação do Windows. Muito disso é (espero) conhecimento abstrato (o que é um compilador, um depurador, uma biblioteca compartilhada, um processo, um encadeamento? O que eles fazem?) Que serão traduzidos facilmente, assim que você se familiarizar com as diferentes ferramentas. Alguns são específicos do domínio (que DLL está vinculada quando adiciono o X a um projeto?), Mas mesmo a mudança de uma classe de linguagem para outra no Windows exigiria um novo aprendizado.

Instale o Ubuntu ou o Fedora em uma VM, leia alguns tutoriais do C ++ Hello World no Eclipse ou NetBeans e algumas depurações nos tutoriais do Eclipse / NetBeans e deixe a capacidade natural do seu cérebro de se adaptar. Ele traduzirá idéias para você, se você relaxar e colocá-lo em prática.

Justin
fonte
3

Eu aprendi o Unix em geral lendo as páginas de manual. Você deveria pelo menos roçá-los. Sim, quero dizer todos eles. O método que eu o uso para cdizar nos diretórios da página de manual e atacá-los uma seção por vez.

Eu uso isso:

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

... substituindo .1 pelo número da seção que você está lendo, .2, .3, etc. Pressione ctrl-Z ctrl-C para sair do loop. Sua milhagem pode variar se sua distribuição Linux armazenar as coisas de maneira diferente, ou seja, não como cmdname.1.gz.

Basta seguir as descrições e muito mais, se for algo interessante. As seções 1, 2 e 3 são as mais importantes para um programador. 1 abrange comandos gerais do usuário, que incluem suas ferramentas de compilação e vários utilitários forenses. 2 são chamadas do sistema e 3 são chamadas da biblioteca.

Serra de corte
fonte
2
Eu sugiro que inicie xmancomo uma interface mais "amigável". Selecione uma seção, clique na página do manual, leia-a. Enxágüe, repita.
ΤΖΩΤΖΙΟΥ
Eu tinha me esquecido dessas coisas. O estado da documentação no sistema operacional livre é inferior ao ideal, e eu achei que as ferramentas pioravam, então parei de usá-las. Só posso supor que eles melhoraram um pouco?
Corte Saw
3

Não se force a fazer algo que você não gosta. Use o Windows como seu ambiente de desenvolvimento, escreva um código portátil, faça uma compilação cruzada para Linux e teste-o apenas ocasionalmente em uma VM.

SK-logic
fonte
2

Não tenho certeza de que funcione para plataformas, mas para linguagens de programação, achei útil pensar em como me familiarizei e me sentir confortável com as pessoas em que sou bom e tentar reproduzir essas experiências e atividades do jeito que eu ' estou tentando aprender.

Talvez algo nessas linhas?

De um modo geral, porém, meu interesse e confiança com o GNU / Linux são muito mais consertáveis ​​(e exigem ajustes nos primeiros dias) do que o Windows. Eu precisava mexer com muitas coisas para fazer as coisas funcionarem e isso me ajudou a aprender muitas coisas. As coisas estão muito melhores agora, mas todas essas horas ajudaram.

Noufal Ibrahim
fonte
2

Eu fui um dos dois encarregados de algo semelhante, mas diferente. Trabalho em um distrito escolar de ensino fundamental e médio e o sistema comercial (RH, financeiro, etc ...) está migrando de um HP3000 / TurboImage db para uma plataforma Linux / MS SQL. Estou confortável com o lado do MS SQL. Mas não o lado do Linux. Nós dois estamos do lado do administrador, não do lado da programação. A programação é feita fora - aplicativo comercial de terceiros para organizações K-12.

Eu participei de uma aula de introdução ao Linux (Redhat) de 5 finais de semana nos finais de semana - foi feita principalmente no modo de linha de comando - e valeu a pena o tempo para mim como um rápido avanço no modo de fazer Linux. Obviamente YMMV dependendo da turma / professor.

Você mencionou 'O pior de tudo: como provisionar o ambiente de desenvolvimento Linux?'? Como você já está familiarizado com o Windows, sugiro fortemente que você obtenha uma cópia do vmWare Workstation. Com isso, você pode manter o Windows como sua estação de trabalho e instalar o Linux como sistemas convidados - exclua, enxágue e repita conforme necessário. Quando você obtém uma boa configuração, acredito que você pode fazer uma captura instantânea, mas não posso dizer com certeza quais versões são capazes do aspecto de captura instantânea. E se você seguir a rota da estação de trabalho do vmWare para ativar várias configurações de desenvolvimento - aprimore a memória definitivamente.

Também não me importo de recomendar o uso do CentOS como sistema operacional Linux para os convidados. Pelo que entendi, é como o RedHat sem os custos de branding e / ou vendas e / ou suporte. Eu não estou familiarizado com os outros sabores do Linux, então não posso dar entrada neles.

Greg

Gregory Thomson
fonte
1

Gosto das duas plataformas e, apesar de todas as diferenças na interface do usuário e no ecossistema do desenvolvedor, acho-as mais semelhantes do que diferentes ao abrigo. De fato, para a maioria dos conceitos do Windows, você pode encontrar conceitos equivalentes do Linux apenas pesquisando na Internet.

Dito isto, sugiro fortemente aprender como fazer as coisas da "maneira Unix". Use a linha de comando em vez de front-ends com GUI de buggy (estou falando principalmente sobre o gdb aqui); não procure um IDE e aprenda a usar um conjunto de ferramentas especializadas. Escolha um bom editor (apontando para o vim) e aprenda-o bem. Leia como makefunciona mesmo se você não planeja se tornar um especialista. Talvez você até goste do Linux. É divertido e divertido para os nerds.

Nemanja Trifunovic
fonte
1

Considere o seguinte: você não sabia nada sobre o Windows, mas aprendeu e, com o tempo, ficou à vontade com ele.

Em seguida, a Microsoft alterou qualquer sistema de programação com o qual você se sentisse confortável para o .NET e não sabia mais nada sobre DLLS, COM e, além disso, precisava aprender coisas como assemblies, GAC, domínios de aplicativos. Você aprendeu aqueles ok.

Então, por que você está preocupado em fazer o mesmo com o Linux?

Existem muitos tutoriais de introdução na web para todos os tipos de ambientes de programação. Agora você diz GCC, então vou assumir o desenvolvimento de C ++. Adquira o Eclipse, instale o CDT (c dev tools) na parte superior da plataforma Eclipse (o Eclipse é um IDE polivalente, você pode usá-lo para C ++, PHP, Java, o que for - mas você precisa instalar as ferramentas do seu idioma como você realmente não gostaria que tudo estivesse pré-instalado como o VS e levaria 3 dias para instalar :))

Existem tutoriais fáceis de usar em toda a web. A IBM possui uma aqui bastante abrangente.

Ferramentas de depuração ... o eclipse o incorporou ( tutorial ), mas você pode encontrar muitas ferramentas como as mencionadas, basta pesquisar na web e você encontrará muitas opções. Você levará um tempo para descobrir como ler um dump principal (em oposição a um dump do usuário do Windows, por exemplo), mas você chegará lá.

Também pode valer a pena iniciar um blog com suas experiências, além de permitir que você se lembre do que fez (por exemplo, configurando o eclipse como quiser, você esquecerá quando precisar fazê-lo novamente em um ano), mas ajudará outras pessoas na sua situação.

gbjbaanb
fonte
0

Eu não acho que você precise fazer o Linux a partir do zero. Se eu fosse você, iria para o Ubuntu. É mais confortável e, baseado no debian, há muito material técnico disponível.

Se você quer mais mergulhar de cabeça no Linux, o Gentoo é uma boa opção. Ele requer que você leia bastante sobre configuração e kernels, mas também oferece um sistema funcional para trabalhar em

anders.norgaard
fonte
0

Google "A arte da programação Unix" e leia-a. Na IMO, sua principal dificuldade é a filosofia diferente, e esse livro é uma excelente leitura para isso.

Ele também apresenta algumas diferenças não óbvias, mas tecnicamente muito importantes, entre os sistemas * n * xe Windows - essas são as chaves para entender por que fazer as coisas de outra maneira faz sentido no Linux.

user59625
fonte
11
... e também apresenta muitas ferramentas e técnicas para usar no Linux.
0

A primeira pergunta que faço é o que você deseja desenvolver? Se é um aplicativo baseado em GUI, isso pode ser diferente de ter que escrever algo como uma extensão do kernel.

No caso de um aplicativo GUI, acho que o método mais fácil é usar o Qt, que possui seu próprio ambiente de desenvolvimento (Qt-Creator) e é multiplataforma, permite que você aprenda apenas uma API que pode ser usada para Windows / Linux / OSX e até desenvolvimento móvel. Como o visual studio no Windows ou o XCode no OSX, você pode criar e distribuir janelas e itens de um editor gráfico, e a API é muito fácil de entender com vários aplicativos de amostra.

Se você precisar obter um nível mais baixo, depois de conhecer o linux na linha de comando, saber percorrer diretórios, manipular arquivos, entender permissões etc., então comece a ler como compilar um programa simples com o gcc, como vincular arquivos e executar o executável e, em seguida, como depurar com o gdb.

Como alternativa, se isso parecer um pouco assustador, você poderá baixar o Eclipse ou outro IDE, mas provavelmente ficará muito mais confortável com o Linux a longo prazo, se dedicar tempo e esforço à linha de comando.

O Cavaleiro das Trevas
fonte