Domanda

Di recente ho iniziato a leggere (solo un po ') il bozza corrente per il futuro standard C ++ 11.

Ci sono molte nuove funzionalità, alcune già disponibili tramite Boost Libs. Certo, sono abbastanza contento di questo nuovo standard e mi piacerebbe giocare con tutte le nuove funzionalità il più presto possibile.

Comunque, parlando di questa bozza con alcuni amici, sviluppatori C ++ di lunga data, sono emerse alcune preoccupazioni. Quindi, ti chiedo (per rispondere a loro):

1) La lingua stessa

Questo aggiornamento è enorme, forse troppo grande per un singolo aggiornamento standard. Enorme per i fornitori di compilatori (anche se la maggior parte di loro ha già iniziato ad implementare alcune funzionalità) ma anche per gli utenti finali.

In particolare, un mio amico mi ha detto " questa è una sorta di nuova lingua " ;.

  • Possiamo considerarlo una lingua nuova dopo questo aggiornamento?
  • Intendi passare al nuovo standard o tenere il passo con il "vecchio" standard (s)?

2) Conoscenza della lingua

  • In che modo la curva di apprendimento sarà influenzata dal nuovo standard?
  • Insegnare la lingua sarà più difficile?
  • Alcune funzioni, sebbene piuttosto fantastiche, sembrano un po 'troppo "accademiche". per me (come definizione intendo). Sbaglio?
  • Padroneggiare tutte queste nuove aggiunte potrebbe essere un incubo, no?
È stato utile?

Soluzione

In breve, no, non possiamo considerarlo una nuova lingua. È la stessa lingua, nuove funzionalità. Ma invece di essere imbrogliati usando le librerie Boost, ora saranno inclusioni standard se stai usando un compilatore che supporta lo standard 0x.

Uno non deve utilizzare il nuovo standard mentre si utilizza un compilatore che supporta il nuovo standard. Uno dovrà imparare e usare il nuovo standard se esistono alcuni vincoli sul software in fase di sviluppo, ma questo è un vincolo con qualsiasi sforzo del software. Penso che le nuove funzionalità che lo standard 0x apporta renderà alcune cose più facili e meno soggette a errori, quindi è a proprio vantaggio apprendere quali sono le nuove funzionalità e come miglioreranno la loro strategia di progettazione per lavori futuri. Dovremo anche impararlo in modo che quando lavoreranno su un software sviluppato con esso, capiranno cosa sta succedendo e non creeranno grandi fischi.

Se dovrò " passare al nuovo standard " ;, se ciò significa che imparerò il nuovo standard e lo userò ove applicabile e dove aumenterà la mia produttività, quindi sì, Ho certamente intenzione di passare . Tuttavia, se ciò significa che mi limiterò a lavorare solo con le nuove funzionalità dello standard 0x, allora no, poiché gran parte del mio lavoro prevede codice scritto prima dello standard e sarebbe un'impresa colossale ridisegnare tutto per utilizzare le nuove funzionalità. Non solo, ma potrebbe introdurre nuovi bug e problemi di prestazioni di cui non sono a conoscenza senza esperienza.

L'apprendimento del C ++ è sempre stato uno dei viaggi più impegnativi che un programmatore può intraprendere. L'aggiunta di nuove funzionalità alla lingua non cambierà la difficoltà di apprenderne la sintassi e come usarla in modo efficace, ma l'approccio cambierà. Le persone impareranno ancora sui puntatori e su come funzionano, ma impareranno anche sui puntatori intelligenti e su come sono gestiti. In alcuni casi, le persone impareranno le cose in modo diverso rispetto a prima. Ad esempio, le persone dovranno ancora imparare come inizializzare le cose, ma ora impareranno le liste di inizializzazione e inizializzatori uniformi come modi principali per fare le cose. In alcuni casi, forse comprendere le cose sarà più facile con l'aggiunta della nuova sintassi per gli intervalli o il tipo di ritorno automatico in una dichiarazione di funzione. Penso che nel complesso il C ++ diventerà più facile da imparare e da usare, mentre allo stesso tempo diventerà più facile da insegnare.

Padroneggiare una lingua è un obiettivo a lungo termine, non può essere fatto durante la notte. È sciocco pensare che si possa avere padronanza su qualcosa di così complesso come C ++ rapidamente. Ci vuole pratica, esperienza e debugging del codice per dare una mano a qualcosa. L'apprendimento accademico è una cosa, ma mettere a frutto tale conoscenza è un mostro completamente diverso. Penso che se uno ha già la padronanza del linguaggio C ++, i nuovi concetti non porteranno troppo peso, ma un nuovo arrivato potrebbe avere un vantaggio in quanto non si preoccuperanno di imparare alcuni dei modi più obsoleti di fare le cose .

Altri suggerimenti

1) La lingua stessa

Per quanto ne so, non ci sono davvero cambiamenti di rottura tra C ++ '03 e C ++' 0x. L'unico che mi viene in mente qui riguarda l'utilizzo auto come identificatore della classe di archiviazione, ma dal momento che non aveva una semantica nel senso che non vedo che si tratta di un problema.

Ci sono molte altre correzioni accademiche allo standard che sono molto necssary, ad esempio descrizioni migliori per il layout del membro dati. Infine, con le architetture multi-core / cpu che diventano la norma, la correzione del modello di memoria era un must.

2) Conoscenza della lingua

Personalmente, ritengo che per il 99,9% degli sviluppatori C ++ il linguaggio più recente sarà più facile da usare. Sto pensando specificamente a funzioni come auto, lambda e constexpr. Queste funzionalità dovrebbero davvero rendere più piacevole l'utilizzo della lingua.

A un livello più avanzato, hai altre funzionalità come variadic modelli ecc. che aiutano gli utenti più avanzati.

Ma non c'è niente di nuovo qui, sono ancora sorpreso dalla quantità di sviluppatori C ++ di tutti i giorni che non hanno usato (o nemmeno sentito parlare) di STL.

Dal punto di vista personale, l'unica caratteristica di cui mi preoccupo un po 'nel nuovo standard è quella dei concetti. Poiché si tratta di un cambiamento così grande, gli stessi problemi che si sono verificati con i template (es. Implementazioni completamente rotte) sono un vero pericolo.

Aggiorna post FDIS in uscita per la votazione:

Come accade, i "concetti" sono stati eliminati per C ++ 0x e verranno ripresi per C ++ 1x. Alla fine ci sono alcune modifiche diverse da auto che potrebbero violare il tuo codice, ma in pratica probabilmente saranno piuttosto rare. Le differenze principali si trovano nell'Appendice C.2 del FDIS (pdf) .

Per me, uno dei più importanti, sarà:

unique_ptr + std :: move ()!

Immaginate:

  1. Puntatore intelligente senza spese generali:

    • nessuna operazione di conteggio dei riferimenti
    • nessuna memoria aggiuntiva per la variabile contatore di riferimento
  2. Puntatore intelligente che può essere spostato , ad es. nessun distruttore / costruttore chiama quando viene spostato

Cosa ti dà questo? Contenitori eccezionalmente sicuri, economici (puntatori ...) senza alcun costo . Il contenitore sarà solo in grado di memcpy () unique_ptrs, quindi non ci saranno perdite di prestazioni causate dal wrapping del puntatore regolare da un puntatore intelligente! Quindi, ancora una volta:

  1. Puoi usare i puntatori
  2. Sarà sicuro (nessuna perdita di memoria)
  3. Non ti costerà nulla
  4. Sarai in grado di memorizzarli in contenitori e loro saranno in grado di fare "massiccio". si muove (come memcpy) con loro a buon mercato.
  5. Sarà eccezionalmente sicuro

:)

Un altro punto di vista:

  1. In realtà, quando sposti un gruppo di oggetti usando copy (), c'è una chiamata di costruttore e distruttore per ogni istanza di oggetto. Quando copi 1000 oggetti di dimensioni di 1kb, ci saranno almeno un memcpy () e 2000 chiamate di funzione.
  2. Se si desidera evitare le migliaia di chiamate, è necessario utilizzare i puntatori.
  3. Ma i puntatori sono: pericolosi, ecc. I puntatori intelligenti reali non ti aiuteranno, risolvono altri problemi.
  4. Non esiste una soluzione per ora. Di tanto in tanto è necessario pagare per la progettazione C ++ RAII / pointer / valuevars. Ma con C ++ 0x, l'utilizzo di unique_ptr ti permetterà di fare "massiccio" mosse di oggetti (sì, praticamente oggetti, perché il puntatore sarà intelligente) senza "massiccio". chiamate del costruttore / distruttore e senza il rischio di usare i puntatori! Per me questo è davvero importante.

È come rilassare il concetto di RAII (a causa dell'utilizzo di puntatori) senza perdere i vantaggi di RAII. Un altro aspetto: il puntatore racchiuso in unique_ptr () si comporterà in molti aspetti simili alla variabile oggetto di riferimento java. La differenza è che unique_ptr () sarà in grado di esistere in un solo ambito alla volta.

Il tuo amico ha in parte ragione ma per lo più sbagliato: è la stessa lingua con funzionalità extra.

Il bello è che non devi padroneggiare tutte le nuove funzionalità. Uno dei mandati primari per un ente standard è quello di non violare il codice esistente, quindi sarai in grado di continuare, codificando felicemente nel tuo vecchio stile (sono ancora principalmente un programmatore C anche se lo faccio " C ++ " applicazioni :-).

Solo quando vuoi dare un'occhiata alle nuove funzionalità dovrai approfondire le modifiche. Questo è un processo che puoi prolungare negli anni se necessario.

Il mio consiglio è di imparare quali sono le nuove funzionalità di alto livello (anche solo per sembrare informati nelle interviste di lavoro) ma apprendere i dettagli lentamente.

Per alcuni aspetti, C ++ 0x dovrebbe essere più facile da insegnare / apprendere rispetto all'attuale C ++:

  • Ciclo attraverso un contenitore: la nuova sintassi per è molto più semplice di for_each + funzione o ciclo manualmente usando iteratori
  • Inizializzazione dei contenitori: saremo in grado di inizializzare le sequenze con la stessa sintassi degli array
  • Gestione della memoria: out va fuori vecchio auto_ptr , in viene ben definito unique_ptr e shared_ptr

Lambdas, sebbene necessariamente più complesso degli equivalenti di altre lingue, sarà più facile da imparare rispetto al processo C ++ 98 di definire oggetti funzione in un ambito diverso.

Pensi di passare al nuovo standard o tenere il passo con il "vecchio" standard (s)?

Un anno fa, stavo scrivendo il C89 rigoroso, perché il prodotto in questione era aggressivamente trasportabile su piattaforme embedded, alcuni dei quali avevano compilatori con idee radicalmente diverse di quali pezzi di C99 vale la pena supportare. Quindi uno standard di 20 anni non è stato ancora completamente sostituito dal suo successore di 10 anni.

Quindi non mi aspetto di poter presto uscire da C ++ 03.

Mi aspetto di utilizzare le funzionalità C ++ 0x dove appropriato. Proprio come uso le funzionalità C99 nel codice C e le estensioni gcc in C e C ++ (e userei le estensioni MSVC, anche se non ho mai lavorato sul codice solo MSVC per più di banali quantità di tempo). Ma mi aspetto che sia "bello avere" piuttosto che basale, praticamente indefinitamente.

Hai ragione, ma è sempre stato così. Esiste un sacco di codice C ++ là fuori che non incorpora ancora nulla dello standard del '98 solo a causa dell'innato conservatorismo di alcuni programmatori. Alcuni di noi ricordano un momento oscuro prima dello spazio dei nomi std :: (prima degli spazi dei nomi, in effetti), quando ognuno scriveva la propria classe di stringhe e i puntatori camminavano sempre nudi. C'è un motivo per cui parliamo di "moderno stile C ++" - distinguere dallo stile precedente perché alcune persone devono ancora mantenere o aggiornare il codice in quello stile.

Ogni lingua deve evolversi per sopravvivere e ogni lingua che evolve avrà una base di utenti divisa, anche solo perché le persone variano nel loro atteggiamento verso la stima dei costi di opportunità nell'applicare nuove funzionalità linguistiche al proprio lavoro.

Con l'avvento del C ++ 0x nei compilatori di spedizione, questa conversazione si svolgerà più volte nei team di sviluppo di tutto il mondo:

GIOVANE: ho appena scoperto queste cose chiamate lambdas! E sto trovando molti modi per usarli per rendere il nostro codice più espressivo! Senti, ho riscritto la tua vecchia classe Foo, non è molto più ordinata?

OLDSTER: Non c'era niente di sbagliato nella mia vecchia classe Foo. Stai solo cercando delle scuse per usare un "cool" nuova funzione inutilmente. Perché continui a provare a rendere la mia vita così complicata? Perché continuo a dover imparare cose nuove? Abbiamo bisogno di un'altra guerra, ecco di cosa abbiamo bisogno.

GIOVANE: Sei troppo bloccato nei tuoi modi, vecchio, non dovremmo nemmeno usare C ++ in questi giorni ... se dipendesse da me -

OLDSTER: Se dipendesse da me ci saremmo bloccati con PL / 1, ma no ... mia moglie avrebbe dovuto votare per Carter e ora siamo bloccati con tutta questa merda orientata agli oggetti. Non c'è niente che tu possa fare con std :: transform e lambdas che non posso fare con un goto e un paio di etichette.

ecc.

La tua carriera di programmazione coinvolgerà sempre l'apprendimento e il ri-apprendimento. Non puoi aspettarti che c ++ rimanga lo stesso fino a quando non ti ritiri e usi gli stessi metodi e pratiche che stavi usando 40 anni fa. La tecnologia continua e si avvia rapidamente. È tuo compito tenerlo al passo. Ovviamente puoi ignorarlo e continuare a lavorare come fai attualmente, ma in 5/10 anni diventerai così obsoleto che sarai costretto a imparare tutto quando cerchi di cambiare lavoro . E sarà stato molto più facile imparare sul lavoro tutti quegli anni prima :)

Alcuni mesi fa ho sentito Bjarne Stroustrup tenere un discorso intitolato 50 anni di C ++ . Devo ammettere che non sono un programmatore C ++, ma mi è sembrato che sicuramente non pensi che 0x sia un nuovo linguaggio!

Se possiamo considerarlo o meno una "nuova lingua", penso che sia la semantica. Non fa differenza. È retrocompatibile con il nostro attuale codice C ++ ed è un linguaggio migliore. Indipendentemente dal fatto che lo consideriamo o meno "la stessa lingua" non importa.

Per quanto riguarda l'apprendimento della lingua, ricorda che molte delle nuove funzionalità sono lì per rendere la lingua più facile da imparare e usare. La maggior parte delle funzionalità che aggiungono complessità sono destinate esclusivamente agli sviluppatori di librerie. Possono utilizzare queste nuove funzionalità per rendere le librerie migliori, più efficienti e più facili da utilizzare, che è possibile utilizzare senza conoscere le funzionalità. Molte modifiche in realtà semplificano e generalizzano le funzionalità esistenti, rendendole più facili per i nuovi arrivati.

Si tratta di un grande aggiornamento, sì, ma è guidato da un decennio di esperienza con l'attuale standard C ++. Ogni cambiamento è presente perché l'esperienza ha dimostrato che è necessario. In effetti, il comitato è estremamente prudente e conservatore e ha rifiutato un numero enorme di altri miglioramenti linguistici. Ciò che viene aggiunto qui sono solo i fondamenti su cui 1) tutti potrebbero essere d'accordo e 2) che potrebbero essere specificati in tempo, senza ritardare il nuovo standard.

Non si tratta semplicemente di alcuni designer linguistici che si siedono e fanno il brainstorming di nuove funzionalità che vorrebbero provare.

Concetti e mappe concettuali aumenteranno notevolmente la grokability dei framework dei template. Se ti sei mai riversato sulla fonte Boost saprai cosa intendo. Passi costantemente dalla fonte ai documenti perché il linguaggio non ha le strutture per esprimere concetti di template. Speriamo che Concepts + Duck Typing ci dia il meglio di entrambi i mondi in cui i punti di accesso alle librerie di modelli possono dichiarare esplicitamente i requisiti ma avere comunque la libertà che Duck Typing offre quando si scrive codice generico.

Ci sono molte cose buone in C ++ 0x, ma sono principalmente cambiamenti evolutivi che perfezionano o estendono le idee esistenti. Non penso che sia abbastanza diverso da giustificare chiamandolo una "nuova lingua".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top