2010-06-01 9 views
43

Dopo cinque anni di programmazione professionale Java (e in misura minore, Python) e lentamente sentire la mia educazione CS scivolare via, ho deciso che volevo ampliare i miei orizzonti/utilità generale per il mondo e fare qualcosa che mi sembra più (per me) come se avessi davvero un'influenza sulla macchina. Ho scelto di imparare la programmazione C e Unix poiché ritengo che sia proprio lì che si trovano molti dei problemi più interessanti.Come praticare la programmazione Unix in C?

Il mio obiettivo finale è poterlo fare professionalmente, se non altro per il fatto che devo spendere 40-50 ore a settimana per il lavoro che paga le bollette, quindi potrebbe anche essere il tipo di codice in cui voglio migliorare. Certo, non ti assumi per fare cose che non hai mai fatto prima, quindi per ora mi sto cagando da solo.

A tal fine, ho iniziato con K & R, che è stata una grande risorsa in parte a causa degli esercizi distribuiti in ogni capitolo. Successivamente, passai allo Computer Systems: A Programmer's Perspective, seguito da dieci capitoli da Advanced Programming in the Unix Environment. Quando avrò finito con questo libro, leggerò Unix Network Programming.

Quello che mi manca nei libri di Stevens è la mancanza di problemi di programmazione; essi documentano principalmente funzionalità e forniscono esempi, con alcune domande di fine capitolo che seguono. Sento che mi piacerebbe molto di più dall'essere sfidato ad usare la conoscenza in ogni capitolo ala K & R. Potrei scrivere qualche programma di test per ogni funzione, ma questo è un metodo meno desiderabile in quanto (1) probabilmente sarei meno motivato che se mi fossi innalzato ad una sfida esterna, e (2) naturalmente penserò solo a usare la funzione nei modi che mi sono già accaduto.

Quindi, mi piacerebbe avere alcuni consigli su come praticare. Ovviamente, la mia prima scelta sarebbe trovare una risorsa che abbia sfide di programmazione Unix. Ho anche considerato di cercare e provare a contribuire ad alcuni progetti open source in C, ma questo è un po 'scoraggiante in quanto ci sarebbe un po' di overhead nell'imparare ad usare il software, quindi imparare il codice base. L'unico progetto C open-source che posso pensare di usare regolarmente è Python, e non sono sicuro di quanto sarebbe facile iniziare.

Detto questo, sono aperto a tutti i tipi di suggerimenti in quanto vi sono probabilmente cose a cui non ho nemmeno pensato.

+5

Vorrei solo dire che adoro vedere post come questo, in cui non stai semplicemente dicendo "Come imparo C, ma non ho fatto niente per conto mio". Complimenti. Upvote. – samoz

+3

Per prima cosa, leggi questo: http://stackoverflow.com/search?q=code+kata. Secondo, aggiorna la tua domanda in modo che non abbia già una risposta. O, possibilmente, chiudi questa domanda perché è un duplicato di uno o più di quelli. –

+3

Non sono d'accordo con S.Lott, non sta cercando un'introduzione per principianti come la maggior parte delle altre domande. Il suo background è diverso e merita un argomento e risposte diversi. – samoz

risposta

24

Reinventa molte delle principali utility Unix. Molti di questi erano (e sono tuttora) scritti in C, quindi sono un buon modo per iniziare a imparare. A seconda delle tue abilità, scegli le utility più difficili o più facili da copiare.

Prova a scrivere il tuo malloc. Imparerai molto su Unix e molti programmi di programmazione C.

Google per corsi di sistema operativo CS e fare i progetti lì. Molte scuole hanno questi progetti su siti Web pubblici in modo da poter ottenere tutto ciò di cui hai bisogno. Here è un collegamento al sito di Purdue. Dare un colpo al progetto della shell, è stato difficile ma davvero educativo.

+0

In secondo luogo, ho fatto cose simili per insegnarmi nuove abilità. L'esperienza personale stava reimplementando un driver del kernel per un semplice dispositivo hardware in Linux. – andy

+0

+1, scrivere una serie di servizi di base sarebbe una sfida eccellente che potrebbe rapidamente dare frutti pratici. –

+0

Mi piace molto questa risposta; in particolare, l'idea di trovare progetti OS sui siti web dei corsi. Non ci avevo pensato. – danben

5

Ecco alcuni post StackOverflow che trattano i libri di programmazione C/Unix. La loro principale rivendicazione di fama è il vasto ventaglio di altre risorse.

Pratica alcuni degli idiomi (comprendi i dettagli di puntatori, ecc.) E scegli i progetti che aiutano in questo. Il terzo elemento nella lista ha una risposta (disclaimer, l'ho scritto) con una serie di idiomi C di alto livello in cui un programma C idiomatico differirebbe da Java.

Imparare la programmazione GUI XLib o Win32 con C è probabilmente meno utile poiché quasi tutto è meglio di C per la programmazione GUI e il wrapping di un motore C core con un'altra lingua è generalmente molto più semplice, a meno che non siate davvero interessati alla velocità.Come punto di partenza, concentrati sulle applicazioni di programmazione di "sistemi", che è il punto in cui è più probabile ottenere un reale chilometraggio da C. Scopri come funziona l'interfaccia C di uno dei linguaggi di scripting come Tcl o Python.

Scrivendo un po 'di codice bit-bit e puntatore pesante (ad esempio selezionando i pacchetti di rete o interpretando un protocollo), o gli elementi sul lato server che utilizzano socket porteranno direttamente alle competenze chiave di C. Se hai alcuni dei libri WRS, prova a far funzionare i pthread (IIRC UNP2 ha una grande sezione su pThreads). Per un contrasto, scrivi qualcosa che usi I/O non bloccanti. Questo materiale è il terreno di gioco di casa di C e otterrai una buona conoscenza pratica di C facendo ciò. Troll attraverso le RFC per alcune idee di protocolli di rete da implementare.

+0

Grazie per la risposta! I collegamenti non sono molto utili, perché: (1) è rivolto agli utenti Linux piuttosto che agli sviluppatori, (2 e 3) riguardano l'apprendimento C avanzato, che devo fare ma non è necessario chiedere informazioni su SO, e (4 e 5) riguardano strutture dati e algoritmi su cui ho una solida base. Tuttavia, penso che i vostri suggerimenti per i progetti siano molto buoni - forse, imparare l'API Python sarà la strada da percorrere dopo tutto. – danben

0

Il modo migliore per consolidare i vostri apprendimenti che alla pratica. Quindi scegli solo un tipo di applicazione che ti interessa e inizia a svilupparla (ad esempio una semplice app di rete cli/server). Prova a testare la maggior parte delle API unix (file, socket, ecc.) Per vedere come funziona. Ad esempio, è possibile ottenere un libro di programmazione Unix, seguire i suoi capitoli e testare sull'applicazione tutto ciò che si legge, creando le proprie funzioni. In questo modo, puoi iniziare a sviluppare la tua libreria di funzioni da utilizzare in ulteriori progetti.

0

Scrivere un server web.

  • Farlo multi-threaded.

  • averlo supporta un nuovo linguaggio di scripting si sviluppa (alla PHP, ecc)

  • consentire il caricamento degli utenti autenticati.

  • Scrivere un plug-in per il proprio strumento preferito (ad esempio, integrare con SVN per fornire una visualizzazione Web).

1

Sei aperto a prenotare suggerimenti? Anche se è un po 'datato (dove "un po'" è forse un enorme understatement), il "The Design of the Unix Operating System" di Maurice Bach è un grande libro. Appartiene accanto a K & R sul tuo scaffale.

1

Si potrebbe provare a lavorare attraverso tutti gli esempi nel libro Software Tools (Amazon). Gran parte di esso è piuttosto pedonale (giustificare giustamente il testo, de-tabificare, ecc.) Ma è un'ottima introduzione alla filosofia unix e alla programmazione di base in C.

1

Questo è piuttosto interessante. Poiché sappiamo che Unix è progettato usando il linguaggio C, potrebbe non essere difficile da imparare. Se stai usando Windows OS, puoi usare l'applicazione "Windows services for Unix" per mettere in pratica i tuoi programmi. Se stai usando unix, allora possiamo usare editor come vi.

0

Vorrei raccomandare una cosa.

Prova e riscrivi tutti i normali strumenti da riga di comando di Linux come ls, mkdir, cd ecc.

Acquisirai un sacco di conoscenze sulla programmazione e su Linux allo stesso tempo.

Seleziona i comandi dal più semplice, dì "tempo" e prosegui fino a quelli più complicati.

Problemi correlati