2009-03-27 10 views
9

Sono stato a lungo C# e sviluppatore .Net, e ho giocato con l'idea di imparare C++.IS C++ convertito in MSIL?

Uno dei motivi principali per cui ho pensato a questo, è quanto C++ può essere più veloce delle app utilizzando il framework .Net. Ma ho ragione nel presumere che se scrivo un'app C++ in Visual Studio e/o mi riferisco a librerie .Net in un'applicazione C++ che, quel C++ è convertito in MSIL (proprio come C#) - e quindi perdo ogni beneficio dalla codifica in esso?

Quindi la mia domanda è proprio questa: i componenti C++ di un'applicazione fanno riferimento a assembly .Net compilati nel modo "tradizionale" o inseriti in MSIL?

risposta

25

Beh, è ​​un po 'più complicato di così. In realtà ci sono due versioni totalmente diverse di .NET-support C++.

Il vecchio, Estensioni gestite per C++, era l'unica opzione disponibile in Visual C++ 2002/2003. È disponibile nei nuovi compilatori sotto l'opzione/clr: oldSyntax. È un po 'maldestro perché cerca di integrarsi con il C++ standard, quindi tutte le nuove parole chiave (e ce ne sono molte) sono precedute da caratteri di sottolineatura doppio, ecc. Il codice generato da questo compilatore è una combinazione di codice nativo e MSIL, soprannominato IJW " funziona solo ".

Il nuovo, chiamato C++/CLI, è un nuovo linguaggio pulito disponibile in Visual C++ 2005 e versioni successive. Soprattutto, supporta diverse modalità di generazione del codice. L'opzione/clr genera ancora una combinazione IJW di codice nativo e MSIL. /clr: risultati puri in un assembly solo gestito, sebbene possa tradurre tipi nativi in ​​strutture .net corrispondenti. Pertanto, il codice potrebbe non essere sicuro per il tipo e può utilizzare l'aritmetica del puntatore, praticamente come C# con/non sicuro. E la più severa delle opzioni è/clr: safe, che produce un assembly solo MSIL sicuro e verificabile, esattamente come fa il compilatore C# (senza/non sicuro, cioè).

Per le differenze tra MC++ e C++/CLI, vedere wikipedia.

Per la descrizione degli interruttori del compilatore, vedere MSDN.

PS. Il codice byte .NET è chiamato MSIL (Microsoft Intermediate Language) o CIL (Common Intermediate Language). MIL può rappresentare Media Integration Layer, la libreria di basso livello non documentata utilizzata da WPF e Vista Desktop Window Manager.

6

This è una discussione piuttosto buona (se datata) del C++ gestito e non gestito.

In una shell dado, C++ può essere gestito (compilato in MIL) o non gestito (compilato in codice nativo).

+5

In una "shell netta" :) –

2

Indipendentemente dalle tue ragioni per voler imparare il C++, è sempre utile conoscere più lingue perché amplia la tua mente in modo che l'apprendimento del C++ sia di per sé una preziosa lezione.

Con C++ è possibile eseguirlo come applicazione .NET C++/CLI o nativo. È solo un commutatore in Visual Studio, tuttavia ci sono molte differenze di sintassi tra i due. Personalmente ritengo utile imparare entrambi i sapori.

Quale scegliere nei progetti dipende un po 'dai requisiti, ad es. se il tuo programma ha bisogno di interagire con altri moduli gestiti come i moduli scritti in C#, è preferibile utilizzare C++/CLI per evitare il passaggio di overhead tra codice gestito e non gestito.

19

Probabilmente è una buona idea tenere separati i concetti.

Primo, il C++ è una lingua e non specifica nulla su quale piattaforma deve essere mirata. In linea di principio, il codice C++ diritto può essere compilato in assembler nativo x86, bytecode Java, MSIL o qualsiasi altra cosa ti interessi. Credo che Adobe abbia recentemente creato un compilatore C++ che genera un bytecode Flash.

In secondo luogo, con l'indecisione tipica, Microsoft ha creato due linguaggi derivati ​​da C++ che utilizzano .NET. Per prima cosa hanno creato le "estensioni gestite per C++". Poi decisero che lo succhiava, lo abbandonava e cercava di fingere che non fosse mai esistito.

Ora la soluzione migliore per C++ in stile .NET si chiama C++/CLI, ma non è C++. Si estende e cambia la lingua in un numero di modi non standard. (E credo che il comitato standard del C++ abbia chiesto di cambiare il nome per evitare confusione, ma non lo hanno)

Visual Studio 2005 e successivi supporta C++/CLI. (in "Aggiungi progetto", sono elencati in Visual C++ -> CLR)

Tuttavia (non avevi pensato che fosse così semplice, vero?), Microsoft ha fatto di nuovo. Dopo aver specificato C++/CLI, che in realtà è un tentativo ragionevolmente ben progettato di integrare C++ con CLI, si sono resi conto che praticamente nessuno lo usa! Si scopre che anche i programmatori C++ generalmente preferiscono usare C# quando lavorano in .NET e, in caso contrario, il C++ nativo.

Così ora, si stanno concentrando sull'interpolazione tra nativa C++ e .NET più semplice e più potente. Tuttavia, C++/CLI probabilmente non andrà via. Funziona, e in alcuni casi è utile. Non è solo il C++, il killer che speravano in origine.

Visual Studio (da sempre) supporta anche applicazioni C++ native, compilate per codice macchina x86, non dipinte da .NET. Questi sono elencati nella finestra di dialogo "Aggiungi progetto" in Visual C++ -> Win32.

Quindi, se vuoi imparare C++, hai due scelte: Impara C++/CLI, che ti limita a un linguaggio MS solo che sì, genera MSIL invece di codice macchina nativo, e richiede .NET per l'esecuzione, e generalmente non vale la pena perché se hai intenzione di prendere una dipendenza su .NET in ogni caso, perché non scrivere in C#?

Oppure imparare il C++ corretto, che è completamente separato da .NET e non può fare riferimento direttamente agli assembly .NET.

Il punto chiave per l'asporto è che sono lingue separate. O si compila come C++/CLI, il che significa che il compilatore ti permetterà di fare riferimento a assembly .NET, e genererà il codice MSIL, o compilerai come C++, nel qual caso il mondo .NET non esiste.

Infine, una nota di cautela. Nonostante il mio testo sopra ("C++ appropriato" e "Untointed by .NET"), il C++ non è "migliore". In molti casi, non è neanche più veloce. Il C++ ha il potenziale per essere più veloce, ma dipende molto di più dal programmatore.

Il compilatore C# trasforma praticamente qualsiasi cosa in un codice ragionevolmente efficiente. C++ d'altra parte, è pieno di insidie ​​che renderanno il tuo codice più lento di rispetto al C# equivalente.

http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx e i post del blog sono riferimenti che vale la pena leggere per chiunque sia curioso di conoscere le prestazioni di codice simile scritto nelle due lingue.

C'è solo un'area in cui le applicazioni C++ saranno sempre più veloci, e questo è in fase di avvio. un'applicazione .NET potrebbe dover caricare il framework .NET e JIT il codice MSIL, dove inizia un'applicazione nativa ...

Ma a parte questo, è probabilmente un errore supporre che C++ sarà più veloce. È può essere essere, perché ti dà un po 'più di controllo. Ma di solito, ciò significa solo che il compilatore è meno in grado di salvarti dalle inefficienze che crei nel tuo codice.

1

I componenti C++ non possono fare facilmente riferimento agli assiemi .Net (è necessario utilizzare COM). Managed C++ è compilato in CIL e ha lo stesso profilo di prestazioni in C#.

C++ è circa il 10% più veloce per lo stesso livello di optomization per la maggior parte del codice, tuttavia C# impiega metà del tempo per scrivere e debug quindi per la stessa quantità di tempo direi che le optomizzazioni che puoi mettere in atto renderebbero C# più veloce ...