2016-01-07 19 views
42

Ci sono già due compilatori che supportano moduli C++:Come dovrei scrivere il mio C++ per essere preparato per i moduli C++?

Quando si inizia un nuovo progetto ora, che cosa devo prestare attenzione al fine essere in grado di adottare la funzione dei moduli quando verrà rilasciata nel mio compilatore?

È possibile utilizzare i moduli e mantenere comunque la compatibilità con i compilatori precedenti che non lo supportano?

+3

Sono un po 'intimorito di dare una risposta a una persona con più di 2400 punti reputazione ... ^^ Mi chiedo che sia davvero importante scrivere ogni volta quando viene rilasciato un nuovo aggiornamento di C++ per cambiare tutto il mio codice nelle nuove funzionalità? Ciò causerebbe un sacco di effetti collaterali o modifiche architetturali ... Se fossi in te, scriverò il mio metanaggio che sarebbe costante (o dove avrò più controllo) e scriverei una funzione per trasferire la mia lingua in qualsiasi altro linguaggio di programmazione nativo della mia scelta. Questa è come l'idea di una virtualizzazione dell'hardware. –

+2

@NECIPS SO è una base di conoscenza, non mi stai rispondendo, ma "per il mondo". Se qualcuno mi ha fatto questa domanda di persona, direi "Vai a scrivere un progetto di prova, gioca con esso e scoprilo da solo". Pochi anni fa qualcuno avrebbe fatto proprio questo e avrebbe scritto un post sul blog. Ora spero che qualcuno scriverà una risposta SO. – user7610

+0

Forse "Waldo" può rispondere alla tua domanda (http://theres-waldo.ca/2014/07/17/trip-report-c-standards-committee-meeting-in-rapperswil-june-2014/) –

risposta

19

Ci sono già due compilatori che supportano moduli C++

clang: http://clang.llvm.org/docs/Modules.html MS VS 2015: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx

l'approccio di Microsoft sembra essere quello guadagnando più trazione, soprattutto perché Microsoft stanno gettando molte più risorse a loro implementazione di qualsiasi della gente clang attualmente. Vedi https://llvm.org/bugs/buglist.cgi?list_id=100798&query_format=advanced&component=Modules&product=clang per quello che voglio dire, ci sono alcuni grandi bug di showstopper in Modules per C++, mentre i Modules per C o specialmente Objective C sembrano molto più utilizzabili nel codice del mondo reale. Il cliente più grande e importante di Visual Studio, Microsoft, sta spingendo molto per i Modules perché risolve un sacco di problemi di scalabilità interna del build e il codice interno di Microsoft è tra i C++ più difficili da compilare ovunque, quindi non è possibile lanciare alcun compilatore ad eccezione di MSVC (ad es. buona fortuna per ottenere clang o GCC per compilare le funzioni di linea a 40k).Pertanto i trucchi di build clang utilizzati da Google, ecc., Non sono disponibili per Microsoft e hanno un enorme bisogno urgente di risolverlo prima piuttosto che dopo.

Questo non vuol dire che non ci siano gravi difetti di progettazione con la proposta di Microsoft se applicati in pratica a grandi basi di codice del mondo reale. Comunque Gaby è del parere che dovresti refactoring il tuo codice per Modules, e mentre non sono d'accordo, posso vedere da dove viene.

All'avvio di un nuovo progetto, a cosa devo prestare attenzione per poter adottare la funzionalità dei moduli quando verrà rilasciata nel mio compilatore?

Nella misura in cui il compilatore di Microsoft è attualmente previsto per implementare i moduli, si dovrebbe assicurarsi che la libreria è utilizzabile in tutte queste forme:

  1. libreria dinamica
  2. libreria statica
  3. Solo libreria di intestazione

Qualcosa di molto sorprendente per molte persone è che i moduli C++ come attualmente dovrebbero essere imp lemented mantiene quelle distinzioni, quindi ora si ottiene una variante del modulo C++ per tutte e tre le di cui sopra, con la prima che assomiglia alle persone che si aspettano un modulo C++, e l'ultima sembra più un'intestazione precompilata più utile. La ragione per cui dovresti supportare queste varianti è che puoi riutilizzare la maggior parte degli stessi macchinari per il preprocessore per supportare anche i moduli C++ con pochissimo lavoro extra.

Un Visual Studio successivo consentirà il collegamento del file di definizione del modulo (il file .ifc) come una risorsa nelle DLL. Questo eliminerà definitivamente la necessità della distinzione .lib e .dll su MSVC, basta fornire una sola DLL al compilatore e tutto funziona "semplicemente" sull'importazione del modulo, senza intestazioni o altro. Questo ovviamente odora un po 'come la COM, ma senza la maggior parte dei vantaggi di COM.

E 'possibile utilizzare i moduli in una singola base di codice ed ancora mantenere la compatibilità con i compilatori più vecchi che non lo supportano?

Presumo che intendessi il testo in grassetto inserito sopra.

La risposta è generalmente sì con ancora più divertimento macro preprocessore. #include <someheader> può trasformarsi in import someheader nell'intestazione perché il preprocessore funziona ancora come al solito. È quindi possibile contrassegnare fino singole intestazioni di libreria con il supporto ++ Moduli C insieme qualcosa come queste righe:

// someheader.hpp 

#if MODULES_ENABLED 
# ifndef EXPORTING_MODULE 
import someheader; // Bring in the precompiled module from the database 
// Do NOT set NEED_DEFINE so this include exits out doing nothing more 
# else 
// We are at the generating the module stage, so mark up the namespace for export 
# define SOMEHEADER_DECL export 
# define NEED_DEFINE 
# endif 
#else 
// Modules are not turned on, so declare everything inline as per the old way 
# define SOMEHEADER_DECL 
# define NEED_DEFINE 
#endif 

#ifdef NEED_DEFINE 
SOMEHEADER_DECL namespace someheader 
{ 
    // usual classes and decls here 
} 
#endif 

Ora nel tuo main.cpp o qualsiasi altra cosa, è sufficiente fare:

#include "someheader.hpp" 

... e se il compilatore aveva/experimental: modules/DMODULES_ENABLED quindi l'applicazione utilizza automagicamente l'edizione dei moduli C++ della tua libreria. In caso contrario, si ottiene l'inclusione in linea come sempre.

Ritengo che queste siano la serie minima possibile di modifiche al codice sorgente per rendere il codice pronto per i moduli ora.Noterete che non ho detto nulla sui sistemi di build, questo perché sto ancora eseguendo il debug degli strumenti di cmake che ho scritto per far sì che tutto questo funzioni semplicemente "lavoro" e mi aspetto di eseguire il debugging per alcuni mesi ancora. Aspettiamo di vederlo magari durante una conferenza C++ il prossimo anno o l'anno dopo :)

2

È possibile utilizzare i moduli e mantenere comunque la compatibilità con i compilatori precedenti che non lo supportano?

No, non è possibile. Potrebbe essere possibile utilizzare alcuni #ifdef magia in questo modo:

#ifdef CXX17_MODULES 
    ... 
#else 
    #pragma once, #include "..." etc. 
#endif 

ma questo significa è comunque necessario fornire .h sostegno e perdere tutti i vantaggi in tal modo, più il vostro codice di base sembra abbastanza brutto momento.

Se si vuole seguire questo approccio, il modo più semplice per rilevare "CXX17_MODULES", che ho appena fatto fino è quello di compilare un piccolo programma di test che utilizza i moduli con un sistema di generazione di vostra scelta, e definire una globale per tutti per vedere se la compilazione è riuscita o meno.

All'avvio di un nuovo progetto, a cosa devo prestare attenzione per poter adottare la funzionalità dei moduli quando verrà rilasciata nel mio compilatore?

Dipende. Se il tuo progetto è imprenditoriale e ti dà da mangiare nel piatto, aspetterei alcuni anni quando verrà rilasciato nelle stalle in modo che diventi ampiamente adattato. D'altra parte, se il tuo progetto può permettersi di essere all'avanguardia, con tutti i mezzi, usa i moduli.

Fondamentalmente, è la stessa storia con Python3 e Python2, o meno rilevanti, PHP7 e PHP5. È necessario trovare un equilibrio tra l'essere un buon programmatore up-to-date e non persone fastidiose su Debian ;-)

+1

Perché il downvote? Ad ogni modo, i moduli C++ non sono ancora una pazzesca funzione di ubercool, come i letterali definiti dall'utente, ma una soluzione ben ponderata ai problemi reali (esprimendo la modularità nel codice C++). Se il mio codice è ben progettato, è già modulare. Devo solo comunicarlo alla strumentazione, in modo che possa trarne vantaggio, – user7610

+0

Sono d'accordo che dobbiamo aspettare un po 'prima che diventi utilizzabile. Dico 2025 che sarà standard da usare. I compilatori lenti sviluppati da Oracle, IBM e Intel saranno il problema principale. Oracle è ancora in C++ 11 – Lothar