[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