Sto pensando di imparare C
Non esiste un motivo specifico per non imparare il C ma suggerirei C ++. Offre molto di ciò che fa C (dato che C ++ è un super set di C), con una grande quantità di "extra". L'apprendimento del C prima del C ++ non è necessario: sono effettivamente lingue separate.
In altre parole, se C fosse un insieme di strumenti per la lavorazione del legno, sarebbe probabilmente:
- martello
- Chiodi
- Sega a mano
- trapano a mano
- levigatrice a blocchi
- scalpello (forse)
Puoi costruire qualsiasi cosa con questi strumenti, ma qualcosa di bello richiede potenzialmente molto tempo e abilità.
C ++ è la raccolta di elettroutensili nel tuo negozio di ferramenta locale.
Se ti attieni alle funzionalità di base del linguaggio per iniziare, C ++ ha una curva di apprendimento aggiuntiva relativamente piccola.
Ma perché le persone usano C (o C ++) se può essere usato 'pericolosamente'?
Perché alcune persone non vogliono mobili di IKEA. =)
Scherzi a parte, sebbene molti linguaggi "più alti" di C o C ++ possano avere elementi che li rendono (potenzialmente) "più facili" da utilizzare in determinati aspetti, questa non è sempre una buona cosa. Se non ti piace il modo in cui qualcosa viene fatto o non viene fornita una funzione, probabilmente non c'è molto che puoi fare al riguardo. D'altra parte, C e C ++ forniscono sufficienti funzionalità di linguaggio "di basso livello" (inclusi i puntatori) che è possibile accedere a molte cose in modo abbastanza diretto (specialmente hardware o OS) o costruirlo da soli, cosa che potrebbe non essere possibile in altri lingue implementate.
Più specificamente, C ha il seguente set di funzionalità che lo rendono desiderabile per molti programmatori:
- Velocità : grazie alla sua relativa semplicità e ottimizzazioni del compilatore nel corso degli anni, è nativamente molto veloce. Inoltre, molte persone hanno capito molte scorciatoie per obiettivi specifici quando si utilizza la lingua, il che rende potenzialmente ancora più veloce.
- Dimensioni : per motivi simili a quelli elencati per la velocità, i programmi C possono essere ridotti (sia in termini di dimensioni eseguibili che di utilizzo della memoria), il che è auspicabile per ambienti con memoria limitata (ad esempio, incorporati o mobili).
Compatibilità - C è in circolazione da molto tempo e tutti hanno strumenti e librerie per questo. Il linguaggio stesso non è nemmeno schizzinoso: si aspetta che un processore esegua istruzioni e memoria per contenere roba e questo è tutto.
Inoltre, esiste qualcosa noto come Application Binary Interface (ABI) . In breve, è un modo per i programmi di comunicare a livello di codice macchina, che può avere vantaggi rispetto a un'API (Application Programming Interface) . Mentre altri linguaggi come C ++ possono avere un ABI, in genere questi sono meno uniformi (concordati) rispetto a quelli di C, quindi C crea un buon linguaggio di base quando si desidera utilizzare un ABI per comunicare con un altro programma per qualche motivo.
Perché i programmatori non usano solo Java o Python o un altro linguaggio compilato come Visual Basic?
Efficienza (e occasionalmente schemi di gestione della memoria che non possono essere implementati senza un accesso relativamente diretto alla memoria).
L'accesso diretto alla memoria con i puntatori introduce molti trucchi (di solito rapidi) quando puoi mettere le tue zampe sporche sui piccoli e gli zeri nei tuoi cubbyhole di memoria direttamente e non dover aspettare che quel vecchio insegnante distribuisca i giocattoli solo durante la ricreazione, poi raccoglili di nuovo.
In breve, l'aggiunta di elementi potenzialmente crea ritardi o introduce in altro modo complessità indesiderate.
Per quanto riguarda le lingue con script e simili, è necessario lavorare sodo per ottenere lingue che richiedono programmi secondari per funzionare in modo efficiente come C (o qualsiasi linguaggio compilato) in modo nativo. L'aggiunta di un interprete al volo introduce intrinsecamente la possibilità di ridurre la velocità di esecuzione e aumentare l'utilizzo della memoria perché si sta aggiungendo un altro programma al mix. L'efficienza dei tuoi programmi si basa tanto sull'efficienza di questo programma secondario quanto quanto (male =)) hai scritto il codice del programma originale. Per non parlare del fatto che il tuo programma spesso dipende completamente dal secondo programma da eseguire. Quel secondo programma non esiste per qualche motivo su un particolare sistema? Codice no go.
In effetti, l'introduzione di qualcosa di "extra" potenzialmente rallenta o complica il codice. Nei linguaggi "senza puntatori spaventosi", stai sempre aspettando che altri bit di codice vengano ripuliti dietro di te o altrimenti trovi modi "sicuri" per fare le cose - perché il tuo programma sta ancora facendo le stesse operazioni di accesso alla memoria che si potrebbero fare con puntatori. Semplicemente non sei quello che lo gestisce (quindi non puoi farselo, genio = P).
Per pericoloso, intendo con puntatori e altre cose simili. [...] Come la domanda Stack Overflow Perché la funzione gets è così pericolosa che non dovrebbe essere usata?
Per la risposta accettata:
"È rimasta una parte ufficiale della lingua fino allo standard ISO C del 1999, ma è stata ufficialmente rimossa dallo standard del 2011. La maggior parte delle implementazioni C lo supporta ancora, ma almeno gcc emette un avviso per qualsiasi codice che lo utilizza."
L'idea che, poiché qualcosa può essere fatto in una lingua, deve essere fatta è sciocca. Le lingue hanno dei difetti che vengono corretti. Per motivi di compatibilità con codice precedente, questo costrutto può ancora essere utilizzato. Ma non c'è nulla (probabilmente) che costringe un programmatore a usare get () e, in effetti, questo comando è stato sostanzialmente sostituito con alternative più sicure.
Più precisamente, il problema con gets () non è di per sé un puntatore . È un problema con un comando che non sa necessariamente come usare la memoria in modo sicuro. In senso astratto, si tratta di tutti i problemi dei puntatori: leggere e scrivere cose che non dovresti. Questo non è un problema con i puntatori; è un problema con l'implementazione del puntatore.
Per chiarire, i puntatori non sono pericolosi finché non si accede accidentalmente a una posizione di memoria che non si intendeva. E anche allora ciò non garantisce che il tuo computer si scioglierà o esploderà. Nella maggior parte dei casi, il programma smetterà di funzionare (correttamente).
Detto questo, poiché i puntatori forniscono l'accesso alle posizioni di memoria e poiché i dati e il codice eseguibile esistono nella memoria insieme, esiste un rischio reale di corruzione accidentale che si desidera gestire correttamente la memoria.
A quel punto, poiché le operazioni di accesso alla memoria veramente dirette spesso offrono meno benefici in generale di quanto avrebbero potuto fare anni fa, anche i linguaggi raccolti senza immondizia come il C ++ hanno introdotto elementi come i puntatori intelligenti per aiutare a colmare il divario tra efficienza della memoria e sicurezza.
In sintesi, ci sono pochissime ragioni per temere il puntatore purché sia usato in modo sicuro. Basta prendere un suggerimento dalla versione di South Park di Steve "The Crocodile Hunter" Irwin - non andare in giro a infilare il pollice nei buchi di crocs .