Preciso conciliar esses 2 fatos:
- Não me sinto confortável trabalhando no Linux;
- 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?
man
é seu amigo. Eu fariaman nm
eman ld
como ponto de partida.Respostas:
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.
fonte
Se quiser
strace
, não esqueçaltrace
: 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 .
fonte
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?
fonte
Que tal você desenvolver o Mono com o Monodevelop? Isso o ajudaria a começar com bastante facilidade reutilizando sua experiência no .NET.
fonte
É 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.
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 ...
fonte
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.
fonte
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.
fonte
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:
... 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.
fonte
xman
como uma interface mais "amigável". Selecione uma seção, clique na página do manual, leia-a. Enxágüe, repita.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.
fonte
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.
fonte
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
fonte
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
make
funciona mesmo se você não planeja se tornar um especialista. Talvez você até goste do Linux. É divertido e divertido para os nerds.fonte
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.
fonte
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
fonte
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.
fonte
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.
fonte