passare da Windows a Linux [chiuso]


57

Devo conciliare questi 2 fatti:

  1. Non mi sento a mio agio a lavorare su Linux;
  2. Ho bisogno di sviluppare software per Linux.

Un po 'di esperienza: ho più di 10 anni di esperienza di programmazione su Windows (quasi esclusivamente C / C ++, ma anche .NET), sono stato un utente di FreeBSD a casa per circa 3 anni circa (poi ho dovuto tornare a Windows) e non ho mai avuto molta fortuna con Linux. E ora devo sviluppare software per Linux. Ho bisogno di un piano.

Su Windows, puoi semplicemente conoscere un linguaggio di programmazione, un'API su cui stai codificando, il tuo IDE (VisualStudio) e alcuni strumenti di base per la risoluzione dei problemi (Depends, ProcessExplorer, DebugView, WinDbg). Tutto il resto viene naturale.

Su Linux, è una storia molto diversa. Come diavolo potrei sapere quale DLL (mi dispiace, oggetto condiviso) caricare se collego ad esso dal plugin di Firefox? Qual è l'equivalente di Linux inserendo __asm ​​int 3 / DebugBreak () nel sorgente ed eseguendo il programma, e quindi lasciando che il sistema operativo chiami un debugger? Perché le build di versioni infernali usano qualcosa, chiamato appLoader, mentre le build di debug funzionano in qualche modo diverse? Peggio ancora: come effettuare il provisioning dell'ambiente di sviluppo Linux?

Quindi, tenendo conto del fatto che l'odio è solitamente associato al non sapere abbastanza, cosa consiglieresti? Sto bene con Emacs e GCC. Ho bisogno di educare me stesso come amministratore / utente Linux e ho bisogno di imparare strumenti di risoluzione dei problemi adeguati (strace is cool, btw), equivalenti a quelli che ho menzionato sopra.

Devo fare Linux da Scratch? Oppure devo solo leggere alcuni libri (ho letto "Ambiente di programmazione UNIX" di Kernighan e "Programmazione avanzata ..." di Stevens, ma devo imparare qualcosa di più pratico)? O devo avere una distro Linux sul mio computer di casa?


73
Mi sento lo stesso per Windows

15
Considerato di trovare un altro lavoro con cui ti senti più a tuo agio?

3
On Unices manè tuo amico. Vorrei man nme man ldcome punto di partenza.
dietbuddha,

1
iniziare a usare Windows;)
Jigar Joshi

1
"Tutto il resto viene naturalmente"? Ovviamente viene naturale, lo fai da 10 anni. Linux non è peggio, è diverso . E ora che hai 10 anni, il tuo cervello non impara cose nuove come una volta, e tutte quelle cose diverse diventano qualcosa che devi disimparare. Avvicinarsi a "Linux fa schifo" renderà la tua vita miserabile.
JesperE,

Risposte:


62

Potresti trovare interessante l'articolo Dynamic Linking in Linux e Windows che spiega come ogni sistema operativo esegue il collegamento dinamico. L'articolo Percorsi di ricerca librerie condivise spiega come si trovano le librerie. Anche le librerie Linux statiche, condivise dinamiche e caricabili sono molto buone. Una cosa bella delle librerie Linux è che hanno un supporto migliore per il controllo delle versioni e che hanno diverse versioni di una libreria in giro rispetto a Windows (AFAIK, non faccio Windows). Per questo , consultare il Versioning dell'interfaccia della libreria in Solaris e Linux . Questi articoli dovrebbero davvero coprirti con le biblioteche.

Il GDB è molto potente, una buona introduzione è probabilmente il Tutorial gdb di RMS . Potresti voler leggere sui punti di interruzione condizionali. Per gli equivalenti __asm(int 3)vedere la domanda Impostare il punto di interruzione nel codice C o C ++ a livello di codice per gdb su Linux .

Il libro Advanced Unix Programming di Marc Rochkind è assolutamente da leggere, IMHO. Ha molti esempi e copre tutti gli argomenti POSIX / SUS in un modo molto ben spiegato. È il miglior libro su questo argomento che ho letto finora.

Ma per semplificarti la vita, in realtà ti consiglio di usare un'API di alto livello che astragga cose per te, come Qt. Inoltre, la scrittura multipiattaforma è molto più semplice.

Fare Linux From Scratch ti aiuta a capire come è composto un sistema Linux, ma penso che non migliora molto le tue conoscenze al riguardo da un punto di vista degli sviluppatori. Ti rende più a tuo agio con Linux, mentre impari quali parti ci sono in un ambiente Linux (e in parte anche perché ). Un Linux non sarà una grande blackbox per te dopo aver lavorato con Linux From Scratch.


Certo, sul sistema a 32 bit questo interruzione si interromperà nel debugger, se il processo è già in fase di debug . È questo se lo sto chiedendo. Windows consente di collegare il debugger dopo che si è verificata la trap. In alcuni scenari, questo è estremamente conveniente. E grazie per i collegamenti!
Scuotivento,

6
Bella risposta! Nota, per l'esercitazione gdb, RMS è "Ryan M. Schmidt" e non "Richard M. Stallman". (una nota importante poiché Stallman era l'autore originale di GDB)
entropo

Windows supportava il caricamento della libreria Side-by-Side ( msdn.microsoft.com/en-us/library/ms229072(v=vs.80).aspx ) da circa 12 anni. Quindi ti sbagli piuttosto per quanto riguarda il controllo delle versioni.
Claus Jørgensen l'

16

Se vuoi strace, non dimenticare ltrace: l'equivalente per le chiamate in biblioteca.
Inoltre, sì, raccomando Linux From Scratch . È un buon esercizio per elaborare gli elementi chiave del sistema operativo e come si adattano insieme.
Per un trattamento di riferimento di programmazione di sistema moderno e completo, consiglierei di prendere l' interfaccia di programmazione Linux .


12

Il Mac OS X è come una Mercedes; è il più bello e pulito, ma costa molto. Windows è come una Toyota; ti porterà avanti e indietro.

Linux è come un hot rod; Spetta alle persone scavare, smontare e rimettere insieme. Linux non è per qualcuno che vuole solo usare il computer; è per le persone che amano i computer. Le persone che non amano i computer dovrebbero starne alla larga.

Le cose che hai imparato in Windows non tradurranno molto bene, no. Ma puoi vedere gli interni e guardare il motore acceso.

Prova a prendere Linux come un nuovo giocattolo, su cui puoi giocare e strisciare e vedere cosa sta succedendo. Le cose facili in Windows sono più difficili in Linux; cose che sono impossibili in Windows sono possibili in Linux.

Se ami i computer puoi amare Linux; se non ami i computer, perché stai programmando?


13
+1, per " Le cose che sono facili in Windows sono più difficili in Linux; le cose che sono impossibili in Windows sono possibili in Linux ". Aggiungerei " Mentre Windows ti mette in bocca cibo pre-digerito, con Linux hai la possibilità di cucinare e la ricompensa per questo è che puoi mangiare quello che ti piace " ... Certo, che sia commestibile o no dipende molto da quanto bravo sei uno chef ...
Alain Pannetier,

14
@Andy: "Windows è come una Toyota" . Toyota ha una qualità molto migliore rispetto a Windows.
Ripristina Monica il

4
@ SK-logic, precisamente. Senza impegnarsi in un'altra guerra religiosa, si prega di considerare quanto segue. Per meri motivi strategici e finanziari, gli Stati membri si rivolgono al più vasto pubblico possibile. Le cose tecniche che gli utenti informatici vorrebbero poter controllare sono nascoste alla vista in modo che i Jones non incontrino problemi. Finisci con la burocrazia ovunque DEP, GPO, "Programma di installazione affidabile", API private o nascoste, "avvio con riparazione automatica", ecc. I geek non risolvono Windows, ma semplicemente disattivano. Linux non ha lo stesso obiettivo egemonico; è fatto dagli utenti per gli utenti. Questo è il punto.
Alain Pannetier,

3
@ SK-logic - "se hai sorgenti di Windows" ... :-)
Rory Alsop,

3
"Mente di nominare un paio di cose che sono" impossibili in Windows "e" possibili in Linux "- Ho trovato un bug in uno script di sistema Linux e l'ho risolto. Ho trovato bug in Windows ma non sono mai stato in grado di risolverli. avere un'immagine ISO (CD) in un file su disco; posso montarla come unità in Linux; puoi farlo in Windows? E ricorda che quasi tutto in Linux è gratuito e quasi tutto in Windows richiede una costosa applicazione proprietaria.
Andy Canfield,

9

Che ne dici di sviluppare su Mono con Monodevelop? Questo ti permetterebbe di iniziare abbastanza facilmente riutilizzando la tua esperienza in .NET.


Ho provato di recente, alcune differenze rispetto a Visual Studio, ovviamente, ma ero attivo e funzionante in una serata. È un ottimo percorso di migrazione.
JBR Wilkinson,

8

È scoraggiante quando lo guardi fin dall'inizio (proprio come se fossi uno sviluppatore Linux a cui è stato assegnato il compito di sviluppare Windows). Affronterei questo problema alla volta.

  • Prima di tutto, installa il tuo ambiente (compilatore, IDE - sì, esistono, Netbeans / Eclipse ecc.)
  • Quindi installa le API di livello superiore installate (boost / Qt ecc.)
  • Inizia lentamente, se c'è un problema immediato da risolvere, ottieni la compilazione del codice (o inizia a scrivere da zero, ecc.) Come se dovessi affrontare qualsiasi progetto di sviluppo, fai in modo che le cose che conosci funzionino per prime (cioè cose che non richiedono un sistema operativo specifico interazione), e poi quando si colpisce un intoppo - ricerca, sono sicuro che qualcuno là fuori abbia già riscontrato lo stesso problema e lo abbia risolto ..

Ancora più importante, lascia tutte le tue opinioni soggettive alla porta. E no, non devi essere un guru per sviluppare in Linux, ne so abbastanza per andare in giro, e non tutto - ma mi sento a mio agio con quello ...


1
+1 Nim: StackExchange ha una fantastica quantità di informazioni precedenti qui. Mi sento più a mio agio nei gusti di Unix, ma attualmente lavoro in ambiente di sviluppo Windows e la ricerca di SE ha risposto a quasi tutte le mie domande in un brevissimo lasso di tempo.
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 hai impiegato per diventare esperto nel lavorare in un ambiente Windows. Potresti dire che è stato facile che tu abbia appena iniziato. Ma prima hai lavorato qualche anno con Windows. Da quanto tempo utilizzavi Windows prima di scrivere il tuo programma di pugno. Sono stati 8 anni per me, anche se ora uso Linux quasi esclusivamente da 5 anni. Ora sono più competente in Linux che in Windows. Dovresti dedicare almeno a te stesso tanto tempo per familiarizzare con un nuovo sistema.

Inizia con l'elenco delle applicazioni con cui non puoi vivere in Windows e cerca alternative nel mondo * nix. http://alternativeto.net/ e le ulteriori sezioni di lettura di Wikipedia possono essere utili qui.

Ecco un elenco di software alternativi che potrebbero rivelarsi molto utili. Ecco alcune alternative alle cose che hai menzionato.

Altre risorse utili per passare da un sistema a un altro

Informazioni su come diventare un migliore utente esperto o utente amministratore dare un'occhiata a queste risorse

Sembra anche che sia passato un po 'di tempo da quando hai guardato il mondo * nix. Consiglierei alcune delle nuove versioni di distro di fedora , suse , debian o la mia stazione di lavoro preferita Ubuntu .

Ora puoi probabilmente cavartela senza conoscere gli interni del sistema e solo le basi come in Windows. Non proverei solo a cavarmela con il minimo. Se vedi Linux come uno strumento che ti assiste realmente nel tuo sviluppo e non un semplice sistema operativo in cui lo sviluppi, sarebbe utile.

Linux From Scratch sarà molto più importante se si sta sviluppando specificamente per Linux è un senso molto specifico e tecnico. Vale a dire che vuoi sviluppare per il kernel, o port su cui programmi su un super computer che esegue Linux. Sarebbe molto utile mai meno. Penso che potresti lasciarlo per qualche mese mentre cerchi di iniziare su Ubuntu. Ubuntu sarà il più vicino possibile al mondo del lavoro su Mac e Windows.


1
Debian non è esattamente una nuova distribuzione. :-P È comunque una buona scelta.
Steve S

Né SuSE e Fedora ... SuSE ha 15 anni ormai, Fedora è davvero una delle distro "più giovani" di 8 anni. Ancora, +1.
DarkDust,

1
@Darkdust @ Steve-s nuovo come nelle ultime versioni,
nelaaro

6

Penso che tu abbia risposto alla tua domanda nella domanda:

"Su Windows, puoi semplicemente conoscere un linguaggio di programmazione, un'API su cui stai codificando, il tuo IDE (VisualStudio) e alcuni strumenti di base per la risoluzione dei problemi (Depends, ProcessExplorer, DebugView, WinDbg). Tutto il resto viene naturalmente. "

Indovina cosa, su Linux puoi cavartela solo conoscendo un linguaggio di programmazione, un'API (o una coppia), il tuo IDE (Eclipse o NetBeans, anche Geany, Emacs o vim, se vuoi) e alcuni strumenti di base per la risoluzione dei problemi ( gdb, strumenti di tracciamento, lint, htop, ps).

Hai molte conoscenze investite nell'ecosistema di programmazione di Windows. Gran parte di ciò è (si spera) conoscenza astratta (che cos'è un compilatore, un debugger, una libreria condivisa, un processo, un thread? Che cosa fanno?) Che si tradurrà facilmente, una volta che ti sarai aggiornato sui diversi strumenti. Alcuni sono specifici del dominio (quale DLL è collegata quando aggiungo X a un progetto?), Ma anche passare da una classe di lingue a un'altra all'interno di Windows richiederebbe un nuovo apprendimento.

Installa Ubuntu o Fedora in una macchina virtuale, leggi alcuni tutorial Hello World in C ++ in Eclipse o NetBeans e alcuni debug nei tutorial Eclipse / NetBeans e lascia che la naturale capacità del tuo cervello di adattarsi prenda il controllo. Tradurrà idee per te se ti rilassi e semplicemente le metti al lavoro.


3

Ho imparato Unix in generale leggendo le pagine man. Dovresti almeno scremarli. Sì, intendo tutti. Il metodo che lo uso per inserire nelle directory della pagina man e attaccarle una sezione alla volta.

Io lo uso questo:

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

... sostituendo .1 con il numero della sezione che stai leggendo, .2, .3, ecc. Premi ctrl-Z ctrl-C per uscire dal ciclo. Il chilometraggio può variare se la tua distribuzione Linux memorizza le cose in modo diverso, cioè non come cmdname.1.gz.

Basta passare attraverso le descrizioni e altro se è qualcosa di interessante. Le sezioni 1, 2 e 3 sono le più importanti per un programmatore. 1 copre i comandi generali dell'utente, che includono gli strumenti di compilazione e varie utilità forensi. 2 sono le chiamate di sistema e 3 sono le chiamate in libreria.


2
Suggerirei di accendersi xmancome un'interfaccia più "amichevole". Seleziona una sezione, fai clic sulla pagina man, leggila. Risciacqua, ripeti.
ΤΖΩΤΖΙΟΥ

Mi ero dimenticato di queste cose. Lo stato della documentazione nella terra del SO libero è tutt'altro che ideale, e ho scoperto che gli strumenti spesso lo peggioravano, quindi ho smesso di usarli. Posso solo supporre che siano migliorati un po '?
Hack Saw l'

3

Non forzarti a fare qualcosa che non ti piace. Utilizzare Windows come ambiente di sviluppo, scrivere un codice portatile, compilarlo per Linux e testarlo solo occasionalmente in una VM.


2

Non sono sicuro che funzioni per le piattaforme ma per i linguaggi di programmazione, ho trovato utile pensare a come mi sono sentito a mio agio con quelli con cui sono bravo e provare a riprodurre quelle esperienze e attività per quello che Sto cercando di imparare.

Forse qualcosa su quelle righe?

In generale, però, il mio interesse e la mia fiducia in GNU / Linux sono dovuti al fatto che è molto più armeggiante (e richiede di armeggiare nei primi giorni) di Windows. Avevo bisogno di pasticciare con molte cose per far funzionare le cose e questo mi ha aiutato a imparare molte cose. Adesso le cose vanno molto meglio, ma tutte quelle ore sono state di aiuto.


2

Ero uno dei due incaricato di qualcosa di simile, ma diverso. Lavoro in un distretto scolastico K-12 e il sistema aziendale (risorse umane, finanza, ecc ...) sta migrando da un db HP3000 / TurboImage a una piattaforma Linux / MS SQL. Sono a mio agio con il lato MS SQL. Ma non il lato Linux. Noi due siamo dalla parte dell'amministrazione, non dalla parte della programmazione. La programmazione viene eseguita all'esterno: un'app aziendale di terze parti per le organizzazioni K-12.

Durante i fine settimana ho partecipato a una lezione di introduzione a Linux (Redhat) per 5 weekend - è stata svolta principalmente in modalità riga di comando - e per me è valsa la pena di iniziare rapidamente il modo di fare le cose in Linux. Ovviamente YMMV a seconda della classe / insegnante.

Hai menzionato "La cosa peggiore: come effettuare il provisioning dell'ambiente di sviluppo Linux?"? Dal momento che conosci già Windows, ti consiglio vivamente di procurarti una copia di vmWare Workstation. Con ciò puoi mantenere Windows come workstation e installare Linux come sistemi guest: elimina, risciacqua e ripeti se necessario. Quando si ottiene una buona configurazione, credo che sia possibile eseguirne lo snapshot, ma non posso dire con certezza quali versioni sono in grado di l'aspetto snapshot. E se segui il percorso di vmWare Workstation per abilitare più configurazioni di sviluppo, aumenta sicuramente la memoria.

Inoltre, non mi dispiace raccomandare l'uso di CentOS come sistema operativo Linux per gli ospiti. Da quello che ho capito, è come RedHat senza i costi di branding e / o vendite e / o supporto. Non ho familiarità con le altre versioni di Linux, quindi non posso dare input su quelle.

Greg


1

Mi piacciono entrambe le piattaforme e per tutte le differenze nell'interfaccia utente e nell'ecosistema di sviluppo, le trovo più simili che diverse sotto copertura. In effetti, per la maggior parte dei concetti di Windows puoi trovare quelli equivalenti per Linux semplicemente cercando su Internet.

Detto questo, consiglio vivamente di imparare a fare le cose in "modo Unix". Utilizzare la riga di comando anziché i front-end con GUI errati (sto parlando principalmente di gdb qui); non cercare un IDE e impara invece a utilizzare un set di strumenti specializzati. Scegli un buon editor (indicando vim) e imparalo bene. Leggi come makefunziona anche se non prevedi di diventare un esperto. Forse ti piacerà anche Linux. È geek-friendly e divertente con cui giocare.


1

Considera questo: una volta non sapevi nulla di Windows, ma l'hai imparato e col tempo ti sei sentito a tuo agio.

Quindi MS ha cambiato qualsiasi sistema di programmazione con cui ti sentivi a tuo agio con .NET e non sapevi più nulla su DLL, COM e quant'altro, dovevi imparare cose come assembly, GAC, domini di app. Hai imparato quelli ok.

Allora perché sei ora preoccupato di fare lo stesso con Linux?

Esistono moltissimi tutorial "per iniziare" sul Web per tutti i tipi di ambienti di programmazione. Ora dici GCC, quindi assumerò lo sviluppo C ++. Procurati Eclipse, installa il CDT (strumenti c dev) sulla tua piattaforma Eclipse (Eclipse è un IDE multiuso, puoi usarlo per C ++, PHP, Java, qualunque cosa - ma devi installare gli strumenti per la tua lingua dato che non vorresti davvero tutto preinstallato come VS e richiedere 3 giorni per l'installazione :))

Esistono tutorial facili da usare in tutto il Web. IBM ne ha uno abbastanza completo.

Strumenti di debug ... eclipse lo ha incorporato ( tutorial ), ma puoi trovare molti strumenti come quelli che hai menzionato, basta cercare sul Web e troverai molte opzioni. Ci vorrà un po 'di tempo per capire come leggere un dump principale (al contrario di un dump utente di Windows per esempio) ma ci arriverai.

Potrebbe anche valere la pena iniziare un blog con le tue esperienze, non solo ti consentirà di ricordare a te stesso ciò che hai fatto (ad esempio, impostare eclissi su come ti piace, ti dimenticherai quando dovrai farlo di nuovo in un anno) ma aiuterà gli altri nella tua situazione.


0

Non penso che tu debba fare Linux da Scratch. Se fossi in te, sceglierei Ubuntu. È più comodo e, essendo basato su debian, c'è un sacco di materiale tecnico disponibile.

Se vuoi immergerti di più in Linux, Gentoo è una buona opzione. Richiede leggere molto sulla configurazione e sui kernel, ma ti dà anche un sistema abbastanza funzionale per lavorare in af


0

Google "L'arte della programmazione Unix" e leggilo. IMO, la tua principale difficoltà è la diversa filosofia, e quel libro è un'ottima lettura per questo.

Ti introduce anche ad alcune differenze non ovvie ma tecnicamente molto importanti tra i sistemi * n * x e Windows: queste sono le chiavi per capire perché fare le cose in un altro modo ha senso su Linux.


1
... e ti presenta anche molti strumenti e tecniche da usare su Linux.

0

La prima domanda che vorrei porre è che cosa vuoi sviluppare? Se si tratta di un'applicazione basata su GUI, potrebbe essere diverso dal dover scrivere qualcosa come un'estensione del kernel.

Nel caso di un'app gui, trovo che il metodo più semplice sia usare Qt, che ha il suo ambiente di sviluppo (Qt-Creator) ed essendo multipiattaforma, ti permette di imparare solo un'API che può essere usata per Windows / Linux / OSX e persino lo sviluppo mobile. Come Visual Studio in Windows o XCode in OSX, puoi creare e impaginare finestre ed elementi da un editor grafico e l'API è molto semplice da raccogliere con un sacco di applicazioni di esempio.

Se hai bisogno di ottenere di più a basso livello, allora una volta che conosci la riga di comando da Linux, sai come attraversare le directory, manipolare i file, capire i permessi ecc., Quindi iniziare a leggere come compilare un semplice programma con gcc, come collegare i file ed eseguire l'eseguibile e quindi come eseguire il debug con gdb.

In alternativa, se questo sembra un po 'scoraggiante, puoi scaricare Eclipse o un altro IDE, ma probabilmente ti sentirai molto più a tuo agio con Linux a lungo termine, se metti prima il tempo e lo sforzo nella riga di comando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.