[cfe-dev] C++/CLI (Ecma 372) support in Clang
    João Matos 
    ripzonetriton at gmail.com
       
    Fri Jul 20 06:20:57 PDT 2012
    
    
  
> It's a fairly extensive and complicated extension to C++, and it seems unlikely that Clang will ever actually be a useful C++/CLI compiler. Moreover, the advent of C++/CX and the recent push toward native code makes the long-term future of C++/CLI completely unclear, and I'd rather not have us chasing yesterday's technology.
Native and managed code have different advantages, so I don't see
managed code getting replaced by native code soon. What I see is
native code being used for the lower level parts of software where
performance really matters, with a managed layer for extensibility-
and C++/CLI is the bridge. I do get your point though, and agree that
the drawbacks might outweigh the benefits.
> C++/CX seems like a more reasonable goal for Clang as a project, because (1) it's more conceivable that we could actually provide a useful C++/CX compilation environment, and (2) it seems to be the new direction for Microsoft. Plus, I think it might be a little smaller and, therefore, slightly easier to implement.
In terms of complexity, they both seem really similiar syntax-wise. MS
has re-used most of their previous work on C++/CLI for C++/CX, here is
a summary of differences:
Basic types:
 CLI: From mscorlib.dll (System::* types)
 CX:  From vccorlib.dll (Platform::* types)
Lifetime management:
 CLI: Garbage collected
 CX:  Refcounted
Cycles Broken:
 CLI: By garbage collector
 CX:  Broken by user (weak references or explicit delete)
Code generation:
 CLI: MSIL + native code. Can create a cross-platform binary if MSIL-only.
 CX:  Native code only. Binaries target a specific platform.
Object Creation:
 CLI: gcnew
 CX:  ref new
interior_ptr:
 CLI: Supported
 CX:  Not supported
pin_ptr:
 CLI: Supported
 CX:  Not supported
V% (% when it refers to a byref (kind'a like an "interior_ref") ):
 CLI: Supported
 CX:  Not supported
R% (% when it refers to an implicitly dereferenced ref type):
 CLI: Supported
 CX:  Supported
Ref to ^:
 CLI: R^%
 CX:  R^&
Boxing:
 CLI: syntax V^
 CX:  IReference<V>^
Dereferenced box type:
 CLI: V%
 CX:  const V
Generics:
 CLI: Generics classes, interfaces & delegates allowed.
 CX:  Generic interfaces & delegates only.
Static constructors:
 CLI: Supported
 CX:  Not supported
Address of member of ref class:
 CLI: Returns an interior_ptr
 CX:  Returns a type*
friends:
 CLI: Not supported
 CX:  Supported
C++ class embedded in ref class:
 CLI: Not supported
 CX:  Supported
ref class embedded in C++ class:
 CLI: Not supported
 CX:  Supported (R-on-stack)
^ embedded in C++ class:
 CLI: Not supported (Needs GCHandle)
 CX:  Supported
^ embedded in value class with value class on native heap:
 CLI: Not supported
 CX:  Supported (for String^)
Global ^:
 CLI: Not supported
 CX:  Supported
Global R-on-stack:
 CLI: Not supported
 CX:  Supported
Finalizer:
 CLI: Supported
 CX:  Not supported
Destructor:
 CX:  Runs on IDisposable::Dispose (delete / stack unwind) only
 CLI: Runs on IDisposable::Dispose (delete / stack unwind) -or- last
release (never both)
T::typeid:
 CLI: Supported
 CX:  Not supported
-- 
João Matos
    
    
More information about the cfe-dev
mailing list