Perché usare le librerie C ++ è così complicato?


14

Prima di tutto, voglio notare che amo il C ++ e sono una di quelle persone che pensano che sia più facile programmare in C ++ che in Java. Tranne una piccola cosa: le biblioteche.

In Java puoi semplicemente aggiungere qualche jar al percorso di compilazione e il gioco è fatto.

In C ++ di solito è necessario impostare più percorsi per i file di intestazione e la libreria stessa. In alcuni casi, devi persino usare flag di build speciali. Ho usato principalmente Visual Studio, Code Blocks e nessun IDE. Tutte e 3 le opzioni non differiscono molto quando si parla dell'uso di librerie esterne.

Mi chiedo perché non ci sia stata un'alternativa più semplice per questo? Come avere un file .zip speciale che ha tutto il necessario in un unico posto in modo che l'IDE possa fare tutto il lavoro per te impostando i flag di build. C'è qualche barriera tecnica per questo?

Risposte:


15

C ++ è stato progettato per migliorare il linguaggio C rendendo un linguaggio più semplice e automatizzato con supporto per la programmazione orientata agli oggetti. Ma non ha fatto nulla per cambiare o migliorare il modo in cui C gestisce le librerie esterne e i file di intestazione. C ++ non ha un sistema di moduli come i linguaggi più moderni: utilizza ancora il preprocessore C e il sistema di linker. Poiché uno degli obiettivi dichiarati di C ++ era la retrocompatibilità con il codice C, questo non è davvero sorprendente. Qualsiasi sistema di moduli C ++ dovrebbe funzionare a fianco del vecchio sistema di file header / linker C. Il comitato per gli standard C ++ non è semplicemente riuscito a progettare un sistema di moduli più moderno. (Anche se ci stanno lavorando, vedi il commento di Klaim di seguito.)


8
L'ultima riga non è del tutto corretta: il sistema di moduli è in funzione dal 2004 (primo documento) ma implicava così tanto lavoro che non poteva nemmeno essere realmente previsto per l'ultimo standard in quanto ci sarebbe stata una mancanza di implementazione per sostenere la proposta. Quell'implementazione è stata in Wortk (insieme ad altre bozze) per aggirare il prossimo standard C ++. Non è che non sia una priorità dei progettisti di C ++, è solo una di queste caratteristiche che non puoi sbagliare, devi mantenere la retro-compatibilità (con la maggior parte del codice C e C ++ 11) ed è follemente difficile da ottenere. Quindi ci vuole molto tempo.
Klaim

Eccezionale. Grazie, Klaim, per le informazioni. Lo verificherò sicuramente. È molto eccitante :)
Pijusn l'

La maggior parte delle lingue rimane fuori dal business della standardizzazione dei collegamenti perché il meccanismo può variare tra i sistemi operativi. La natura run-ovunque di Java richiede di imporre un collegamento specifico e un formato libreria. Non c'è nulla di sbagliato in questo, ma porta un sovraccarico che potrebbe non essere desiderabile in tutti i casi.
Blrfl

Francamente, sono abbastanza spaventato nel leggere che il comitato per gli standard C ++ sta lavorando a un sistema di moduli per il linguaggio stesso. Il C ++ è già un linguaggio enorme e complesso e provare ad aggiungere una funzionalità così delicata può essere molto rischioso. Come notato da Karl Bielefeldt qui sotto, questo problema ha già trovato una buona soluzione a livello di piattaforma (sistema di pacchetti Linux) e probabilmente potrebbe essere affrontato molto bene dalla maggior parte degli IDE con poco sforzo. Dai un'occhiata a come la libreria Qt e Qt Creator gestiscono questo problema, ad esempio.
AlexBottoni,

1
@AlexBottoni, dubito davvero che inventeranno un sistema di moduli standardizzato in qualsiasi momento in questo secolo. Non includevano neppure concetti in C ++ 11 perché non potevano concordare sull'implementazione precisa. Un sistema di moduli che funziona a fianco del sistema header / linker è ancora più complicato e probabilmente non lo vedremo per molto tempo.
Charles Salvia,

2

Non è una barriera tecnica. Su Linux, il tuo "file zip speciale" è un pacchetto library-dev che installi con un gestore pacchetti e impostare i flag include e linker è semplice come aggiungere un paio di righe al tuo configure.acche usa pkg-config per impostare le cose.

Pkg-config è disponibile anche per Windows, ma le barriere culturali ne hanno impedito l'adozione diffusa. Unix ha una solida storia di abilitazione della portabilità distribuendo il codice sorgente, quindi includono gratuitamente gli strumenti di sviluppo. Windows ha una lunga storia di incoraggiamento alla distribuzione binaria e alla ricarica di strumenti per gli sviluppatori. Quando guadagni vendendo librerie, non ha senso semplificare la fornitura da parte di terzi.

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.