Perché il linguaggio di base C ++ si fonde con la libreria standard?

6

A mio avviso, la libreria standard è un intero software separato rispetto a un compilatore. Secondo me, dovrebbero essere tenuti separati.

I

Vantaggi di questo approccio si riducono quasi a "possono evolversi indipendentemente".

Svantaggi:

  • Alcune funzioni di libreria standard potrebbero essere riscritte in funzioni di linguaggio core più moderne per essere più coerenti. A volte può portare a enormi benefici oltre a essere coerente. Gli esempi possono essere la maggior parte degli algoritmi in <algorithm> header quando arrivano gli intervalli. E praticamente qualsiasi modello quando arrivano i concetti.

  • Poiché la libreria standard utilizza funzionalità linguistiche di base, a volte potrebbe essere difficile "sincronizzarle", seguire un modello e non divergere. Inoltre potrebbe creare una corsa caratteristica, ad es. una caratteristica del linguaggio principale e una caratteristica della libreria standard che fa la stessa cosa potrebbe essere rivaleggiare l'un l'altra per entrare nello standard. Un esempio può essere un legame strutturato. Le non dichiarazioni non possono essere un'espressione di legame strutturato, perché std::tie() fa la stessa cosa e si ritiene che consentire l'associazione non dichiarativa complicherebbe inutilmente le cose. Per raggiungere la conclusione, è stato necessario un po 'di ricerca e tempo.

  • Alcune funzionalità entrano semplicemente in uno stato di errore (potrebbe essere che non siano state interrotte prima dell'inclusione). Un esempio può essere I / O. Ora che il linguaggio di base ha i pacchetti di parametri template, potrebbe essere possibile scrivere printf() come funzioni e avere anche la sicurezza di tipo. Esiste un'implementazione, chiamata fmt (Disclaimer: non sono affiliato con loro in alcun modo e non l'ho usato ampiamente ). Inoltre, la sincronizzazione con la libreria C I / O non è più necessaria.

Potrebbero esserci di più, ma quelli sono gli unici che mi sono stati in testa.

Quindi, la domanda è: perché il comitato standard ha scelto di fondere lentamente la libreria standard e il linguaggio di base? Perché non sono stati aggiunti std::tuple<> e std::initializer_list<> (e alcune altre funzionalità) al linguaggio principale?

Un esempio di fusione è (in) famosa conversione in std::initializer_list<> .

ad esempio auto indices{0, 1, 6, 9}; risulterà in std::initializer_list<int> .

Inoltre, associazione strutturata:

for (const auto& [key, value]: map) {...} funzionerà anche se std::pair è una funzione di libreria standard.

    
posta Incomputable 26.06.2017 - 19:23
fonte

3 risposte

9

Non penso che ci siano davvero dei cambiamenti qui.

Ci sono state alcune parti del compilatore che richiedevano la conoscenza della libreria standard fin dall'inizio del C ++ (beh, forse non l'inizio molto , ma ben prima dello standard comunque).

Ad esempio, un numero di espressioni (ad esempio% espressioni new e dynamic_cast ) può generare eccezioni i cui tipi sono definiti nella libreria standard. Alcune altre espressioni possono terminare chiamando abort .

Il comitato sembra cercare di mantenere questo tipo di cose al minimo - sembra che lo faccia solo quando c'è una strong motivazione e sembra essere molto poco altro modo ragionevole per raggiungere un obiettivo.

    
risposta data 26.06.2017 - 19:36
fonte
2

Comprendo che il comitato per gli standard C ++ segue la regola che tutto ciò che può essere implementato efficientemente in una biblioteca, deve essere. Questa politica esiste per impedire che i compilatori C ++ diventino più complessi del necessario e riduce al minimo la necessità di introdurre nuove parole riservate nel linguaggio C ++ stesso.

C ++ è già uno dei linguaggi di programmazione più difficili da analizzare correttamente, quindi tutto ciò che lo rende più complesso rende solo il processo per garantire che i compilatori effettivamente analizzino correttamente la lingua e generino il codice corretto ancora più difficile di quello che già è.

Mantenere il linguaggio C ++ essenziale nel modo più semplice possibile mantiene anche il compito di trasferire le implementazioni esistenti del linguaggio su nuove piattaforme nel modo più semplice possibile.

Scrivere un nuovo compilatore C ++ da zero è già un compito non banale.

    
risposta data 22.04.2018 - 01:25
fonte
1

Dai un'occhiata a Swift. Puoi fare assolutamente nulla senza la libreria standard di Swift, perché anche cose come interi, booleani e così via e le loro operazioni fanno parte della libreria standard, non parte della lingua. E questo è Ok. È perché esistono un linguaggio e una libreria standard e insieme producono un'implementazione. (Anche 1 + 2 non può essere compilato usando solo la lingua).

    
risposta data 22.04.2018 - 14:50
fonte

Leggi altre domande sui tag