Le funzionalità sperimentali del C ++ moderno sono affidabili per progetti a lungo termine?


87

Ho un progetto che attualmente utilizza C ++ 11/14, ma richiede qualcosa di simile std::filesystem, che è disponibile solo in C ++ 17, e quindi non ho la possibilità di usarlo attualmente. Vedo, tuttavia, che è disponibile nel mio compilatore attuale come std::experimental::filesystem. È una buona idea utilizzare funzionalità sperimentali, supponendo che in futuro potrei aggiungere qualcosa come:

#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif

Le mie preoccupazioni sono:

1. È garantito che tutti i compilatori conformi abbiano le stesse caratteristiche sperimentali?

2. Le funzionalità sperimentali sono soggette a grandi cambiamenti che le rendono inaffidabili?

Forse ci sono altre cose su cui chiedersi. Perché dovrei o non dovrei usarli? Sono perplesso con un nuovo progetto e non so cosa decidere.


25
la parola sperimentale non risponde alle tue domande?
101010

6
Principalmente una questione di gusti, ma eviterei di ingombrare il codice #idef CXX17. IMHO, il modo portabile è mettere tutto il codice relativo al filesystem in una singola unità di compilazione (potrebbe essere una classe), usarlo in tutte le parti rimanenti del codice, codificarlo con l'attuale standard C ++ 11/14. Documenta il motivo per cui lo scrivi in ​​questo modo e alla fine trasferiscilo in C ++ 17 in seguito durante una fase di manutenzione, se ha senso. (commentando la domanda originale)
Serge Ballesta

4
Era solo "sperimentale" come candidato per entrare nello standard. Non è un riflesso della qualità del codice.
Galik

5
Ci sono stati parecchi cambiamenti tra la versione "sperimentale" e quella finale C ++ 17, vedere il documento P0492R1
Bo Persson

7
Nel caso in filesystemcui corri molti meno rischi nell'usarlo rispetto ad altre cose, poiché sai già che viene standardizzato in C ++ 17, e l'esatta specifica C ++ 17 di esso è disponibile pubblicamente. Quindi tutto ciò che devi fare è assicurarti di utilizzare solo le experimental::filesystemfunzionalità che sono nella specifica C ++ 17. E ovviamente devi sapere che tutte le tue piattaforme mirate supportano uno experimental::filesystemo il C ++ 17 std::filesystem.
Howard Hinnant

Risposte:


79
  1. È garantito che tutti i compilatori conformi abbiano le stesse caratteristiche sperimentali?

No, le funzionalità sperimentali sono opzionali.

  1. Le funzionalità sperimentali sono soggette a grandi cambiamenti che le rendono inaffidabili?

Sì, il comitato C ++ potrebbe persino decidere di abbandonare una funzionalità o nel processo di standardizzazione potrebbe emergere un difetto che costringerebbe una funzionalità a cambiare.

In generale, non è una buona idea dipendere da funzionalità sperimentali. Le caratteristiche sperimentali sono esattamente ciò che dice la parola (cioè sperimentare).


2
Facendo riferimento al secondo punto, tieni presente che sto parlando di funzionalità che sono già accettate, ma potrebbero essere diverse.
The Quantum Physicist

14
@TheQuantumPhysicist: "già accettato" è un concetto complicato. Qualsiasi cosa può essere rimossa in qualsiasi momento mediante l'accettazione successiva di una modifica per rimuoverla, e questo è successo a tutti gli standard. Probabilmente vorresti aspettare almeno fino al Draft International Standard prima che il set di funzionalità sia ragionevolmente affidabile.
Kerrek SB

1
@KerrekSB: Non intendi il Final Draft International Standard aka FDIS. ? La redazione è un processo piuttosto permanente.
MSalters

1
@MSalters: No, il DIS è probabilmente abbastanza buono se sei di fretta. E questa volta potremmo non avere un FDIS comunque.
Kerrek SB

4
@ KerrekSB: praticamente ero l'ente nazionale per i Paesi Bassi intorno al C ++ 03;). Avevamo un segretario nazionale per SC22 che conosceva le procedure ISO e come rispondere a un FDIS, ma non cosa. A parte il nostro delegato WG14 Randy Marques) nessuno dei nostri delegati SC22 sapeva nulla di C ++. E Randy stava solo prendendo in giro il fatto che C ++ avrebbe bisogno di più pagine per definire tutto il suo UB di C necessario per il comportamento definito - non vorrebbe che rispondesse a quel FDIS;)
MSalters

50

Qualcuno del pubblico ha posto una domanda durante il discorso "C ++ Standard Library Panel" al CppCon 2016 ( YouTube ) sul potenziale per il nome experimentaldi spaventare gli utenti dall'usare qualsiasi cosa all'interno dello spazio dei nomi:

Ragazzi, considerate [il contenuto dello std::experimentalspazio dei nomi] pronto per la produzione e questo è un argomento che può essere fatto, [che] è effettivamente pronto per la produzione per i prossimi 3 anni, e forse dovete cambiare il vostro codice 3 anni dopo, forse?

Michael Wong (presidente di SG5 e SG14 ed editore di Concurrency TS) ha risposto per primo alla domanda:

Penso che ci sia un forte consenso all'interno del comitato sul fatto che sia praticamente pronta per la produzione. Come ho detto prima, nella maggior parte dei casi il 99% di esso viene scaricato nell'aria. Vogliamo assicurarci che non sia un impedimento per il tuo utilizzo. Puoi capire perché vogliamo mettere grandi funzionalità, grandi gruppi di funzionalità, in un tale contesto, in modo che non disturbi il resto dell'intero sistema bibliotecario, ma ti renda anche più facile usarlo. Ora puoi attivare GCC con un flag specifico per Concepts, sai, che in realtà ti rende più facile segmentarlo.

Alisdair Meredith (ex presidente del LWG) ha poi seguito:

Prenderò la posizione contraria qui. Una delle cose che Herb [Sutter] ha detto come convener del WG21, il gruppo standard, quando ci siamo incamminati lungo il sentiero dei TS è che non pensava che i TS avrebbero avuto successo finché non avessimo fallito nel portare avanti qualcosa, perché significa che non siamo abbastanza sperimentali, non siamo abbastanza ambiziosi in ciò per cui stiamo usando i TS. Lo vogliamo davveroexperimentalper essere un suggerimento che, sì, queste cose sono soggette a cambiamento, non siamo vincolanti a questo e possiamo sbagliare. Questo per abbassare la nostra barriera per le cose che consideriamo ambiziose e raggiungere il più possibile [...] Ora lo standard sembra essere su un ciclo di rilascio di tre anni, dovremmo essere molto più ambiziosi nel mettere funzionalità davvero sperimentali nella ST, e forse facendo avanzare le cose più rapidamente nello standard principale stesso. Ma ancora una volta, questo sarà un argomento divertente da discutere durante le prossime riunioni [del comitato standard C ++].

Stephan T. Lavavej (manutentore dell'implementazione STL di Microsoft) è stato l'ultimo a rispondere:

È importante tracciare una distinzione tra la sperimentalità dell'interfaccia e la sperimentalità dell'implementazione, perché quando dici "produzione pronta", cosa significa? Di solito, "pronto per la produzione", ci si potrebbe pensare parlando dell'implementazione. È abbastanza possibile che un'implementazione [di qualcosa in std::experimental] sia assolutamente [...] a prova di proiettile. [...] Qualcosa come [...] l' <random>intestazione in TR1, [era] davvero, davvero carino in TR1, e avresti potuto avere un'implementazione assolutamente a prova di proiettile di quello, ma si è scoperto che l'interfaccia si alterava sostanzialmente [prima del rilascio di] C ++ 11 e [...] se allora avessimo saputo cosa facciamo ora, inserire un experimentalsegnale sarebbe stato un segnale migliore per le persone che "Ehi, forse non vuoi usostd::experimental::variate_generator perché, ah-ah, scomparirà in C ++ 11 ".

Così sembra che ci sia qualche desiderio tra gli sviluppatori della libreria standard e membri del comitato che, in futuro, almeno, il contenuto del std::experimentalnamespace dovrebbero essere veramente "sperimentale" in natura, e non dovrebbe essere dato per scontato che qualcosa nel std::experimentaltestamento trasformalo nello standard C ++.

E no, per quanto ne so, spetta ai fornitori di librerie standard decidere se fornire implementazioni per le varie funzionalità all'interno std::experimental.


47
10 anni dopo aver letto il nome per la prima volta, il fatto che il manutentore STL di Microsoft si chiami STL mi fa ancora ridere.
Jörg W Mittag

19
@ JörgWMittag dovresti incontrare il loro manutentore del compilatore, Michael Sam Victor Collins
MM

28

"Sperimentale" è un termine leggermente esagerato. La filesystemlibreria è nata in Boost e lì ha subito alcune iterazioni, prima di essere inviata a ISO.

Tuttavia, gli standard ISO sono intenzionalmente molto conservativi. Definirlo sperimentale significa che ISO esplicitamente non promette che la denominazione sarà stabile; è assolutamente chiaro che sarà necessario reindirizzare il codice in futuro. Ma conoscendo l'ISO, è probabile che ci sarà una guida su come.

Per quanto riguarda la compatibilità tra i compilatori, aspettati che sia ragionevole. Ma ci saranno casi d'angolo (si pensi ad esempio ai percorsi relativi all'unità di Windows), ed è esattamente per questo che uno standard futuro potrebbe rompere il codice esistente. Idealmente, violerebbe il codice se e solo se dipendesse da quel caso d'angolo, ma non è una garanzia.


8

Forse ci sono altre cose su cui chiedersi.

Alcuni punti da considerare:

  • Quanto è multipiattaforma il tuo progetto? Se è coinvolto un solo compilatore, è possibile ispezionarne l'implementazione e il track record per decidere. Oppure chiedi loro!

  • Quanto è grande la tua base di codice? Quanto sarebbe grande l'impatto dei cambiamenti?

  • Quanto sono fondamentali per il tuo progetto le funzionalità fornite dall'API / libreria / funzionalità?

  • Quali sono le alternative?

    • Utilizza la funzionalità sperimentale, quindi adatta il codice alle modifiche quando / se diventa standardizzato. Potrebbe essere facile come eliminare experimental::o difficile come forzare soluzioni alternative.
    • Aggiungi un livello di astrazione (commento di Serge Ballesta). Se la funzionalità sperimentale cambia, le tue riscritture vengono isolate. Per una funzionalità standard, potrebbe essere eccessivo (std :: filesystem è già un livello di astrazione ...).
    • Usa un'altra API / libreria. Stesse domande: maturità? robustezza? stabilità? portabilità? facilità d'uso? Caratteristiche?
  • Nel caso di std :: filesystem (o il TS di rete), c'è boost :: filesystem (risp. Boost :: asio) come alternativa o fallback, nel caso in cui experimentaluno fallisca o scompaia.
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.