2013-07-04 7 views
11

Ciò ha implicazioni sulla portabilità del codice del codice C++ 11 in generale. Sto parlando di avere una nuova fase di generazione del codice simile alla fase del preprocessore C/C++ in cui possiamo rendere il codice C++ generato più "amichevole" per una famiglia più ampia di compilatori. Ho pensato che forse questo può potenzialmente avere un effetto su quanto sia fattibile spostare le persone alla codifica in C++ 11.C'è un modo per rifattorizzare il codice C++ 11 in codice C++ che può essere compilato da un compilatore meno capace?

Le console di gioco sono un esempio di un tipo di piattaforma in cui è possibile rimanere bloccati su un compilatore limitatore che potrebbe non supportare le funzionalità di C++ 11. Un altro esempio potrebbe essere Intel's C++ compiler. Sono molto contento di vedere che Intel ha lavorato duramente su questo e sembra che questo non sia un problema sull'ultima versione, ma supponiamo per il numero di uno per utilizzare una versione precedente del compilatore!

Un altro esempio semi-concreto, è uno dei miei progetti recenti è stato quello di creare uno strumento diff per l'utilizzo in prima linea in fase di sviluppo; Sono diventato insoddisfatto del diffs basato sulla linea tradizionale, quindi ho creato un piccolo strumento da riga di comando che utilizza un'implementazione diff_match_patch in C++. C++ 11 ha "permeato" nel codice della colla perché auto è semplicemente troppo bello, ma la conseguenza era che fondamentalmente dovevo andare a costruire LLVM, Clang e libC++ su Linux per poter iniziare a usare il mio strumento su linux. Non è molto chiaro come distribuire anche i progetti C++ 11 in Linux in forma sorgente, perché è un po 'un calvario per creare clang up su Linux. Questo non vuol dire che non può essere fatto, ma è solo troppo sanguinolento, e bisogna dedicare alcune ore alla configurazione della toolchain. (Aggiornamento: Beh, un paio di mesi/anni più tardi, quello stesso piccolo strumento ora costruisce perfettamente bene con GCC fornita da CentOS pacchetti 7 di, in modo che è un sollievo.)

Quindi, se ho avuto un modo magico per l'auto -rattare lo strumento C++ 11 per generare codice C++ vecchio stile che un compilatore più vecchio accetterebbe fuori dalla scatola, questo può potenzialmente rendere la vita un po 'più semplice per alcune persone.

C'è stato un po 'sorprendente progressi automatizzando il refactoring del codice con clangore, e questo è ben presentato in David's answer here, e così mi ha fatto pensare che forse c'è la possibilità di istituire uno specifico strumento di auto-contenute in base al largo di questa tecnologia che può trasformare efficacemente modelli di codice C++ 11 in corrispondenti equivalenti non C++ 11. L'idea è che, invece di utilizzarla per il refactoring automatizzato di uso generale (ad es. Isolare e refactoring del codice in cui le stringhe vengono convertite in stringhe C e tornare alle stringhe), potremmo essere in grado di utilizzarle per isolare l'uso di C++ non supportato 11 funzioni e refactoring in qualche codice che fa la stessa cosa ma in realtà sarebbe compilato con successo.

È qualcosa che è possibile? Non ho molta familiarità con le capacità di C++ 11 e quali sarebbero le conseguenze in termini di down-grading a "vecchio" C++ che implementa la stessa funzionalità. Sembra certamente che questo genere di cose fosse possibile, non potevo farlo, perché non ho (né mi aspetto che avrò mai) abbastanza conoscenza del linguaggio per sapere come implementarlo.

Suppongo che una domanda più appropriata sarebbe, è valsa la pena? È difficile vedere come (dato che LLVM è chiaramente in grado di eseguire cross-compiling su ARM) si potrebbe impedire l'uso di clang per eseguire il lavoro utilizzando metodi più diretti come la cross-compiling alla target paltform. La mia ipotesi è che questa è semplicemente la mia paranoia e non avrò davvero bisogno di preoccuparmi in futuro di far funzionare il mio codice C++ 11 su tutte le possibili piattaforme di destinazione come dovrebbero all o x86, x86-64 o ARM comunque. Ma chissà quale sarà il mio lavoro tra qualche anno.

+2

possibile duplicato di [Esiste un convertitore da C++ 11 a C++ 03?] (Http://stackoverflow.com/questions/14762078/is-there-a-c11-to-c03-converter) – Ali

+0

Ah dannazione, anzi, la domanda è già stata fatta. –

+1

Invece di convertire il codice, cerca qualcosa come "boost.config" che gestirà le differenze del compilatore. –

risposta

2

Inoltre, g++ ha supportato parti sempre più grandi di C++ 11 per anni. 4.8.1 ha un supporto abbastanza completo, in base allo http://gcc.gnu.org/projects/cxx0x.html e la maggior parte delle parti più interessanti sono state disponibili molto più a lungo (ad esempio auto e modelli variadic sono in 4.4, valori stringali personalizzati in 4.5 e constexpr in 4.6).

Potrebbe essere più semplice installare (o compilare, se necessario) una versione più recente di gcc piuttosto che provare a ridefinire il codice.

+0

Un'opzione molto utile pure. –

Problemi correlati