Calypso: Direct and full interfacing to C++
Elie Morisse via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Mon Dec 22 15:14:41 PST 2014
Hi everyone,
I have the pleasure to announce to you all the existence of a
modified LDC able to interface directly to C++ libraries, wiping
out the need to write bindings:
https://github.com/Syniurge/Calypso
It's at a prototype stage, but its C++ support is pretty wide
already:
• Global variables
• Functions
• Structs
• Unions (symbol only)
• Enums
• Typedefs
• C++ class creation with the correct calls to ctors
(destruction is disabled for now)
• Virtual function calls
• Static casts between C++ base and derived classes (incl.
multiple inheritance offsets)
• Mapping template implicit and explicit specializations already
in the PCH to DMD ones, no new specialization on the D side yet
• D classes inheriting from C++ ones, including the correct
vtable generation for the C++ part of the class
So what is this sorcery? Let's remind ourselves that this isn't
supposed to be feasible:
>Being 100% compatible with C++ means more or less adding a fully
>functional C++ compiler front end to D. Anecdotal evidence
>suggests that writing such is a minimum of a 10 man-year
>project, essentially making a D compiler with such capability
>unimplementable.
http://dlang.org/cpp_interface.html
Well.. it is :D
Calypso introduces the modmap keyword, as in:
modmap (C++) "cppheader.h";
to generate with the help of Clang libraries a "virtual" tree of
C++ modules. Then after making Clang generate a PCH for all the
headers, the PCH is loaded and classes, structs, enums are placed
inside modules named after them, while global variables and
functions are in a special module named "_". For example:
import (C++) Namespace.SomeClass; // imports
Namespace::SomeClass
import (C++) Namespace._; // imports all the global variables
and functions in Namespace
import (C++) _ : myCfunc, myGlobalVar; // importing the global
namespace = bad idea, but selective imports work
Being a prototype, I didn't really pay attention to code
conventions or elegance and instead focused on getting things
working.
And being tied to LDC and Clang (I have no idea how feasible a
GCC version would be), it's going to stay like this for some time
until I get feedback from the contributors on how this all should
really be implemented,. For example Calypso introduces "language
plugins", to minimize the amount of code specific to C++ and to
make support of foreign languages cleaner and less intrusive,
although it of course needs numerous hooks here and there in DMD
and LDC.
Calypso is still WIP, but it's in pretty good shape and already
works in a lot of test cases (see tests/calypso/), and is almost
ready to use for C++ libraries at least. Since C libraries are in
the global namespace, it's not a convenient replacement yet for
bindings until I implement the Clang module map format. More info
this blog post detailing some of the history behind Calypso:
http://syniurge.blogspot.com/2013/08/calypso-to-mars-first-contact.html
So.. Merry Christmas dear D community? :)
My take on the current talks of "feature freezing" D: the
strength of D is its sophistication. The core reason why D fails
to attract more users isn't the frequent compiler bugs or
regressions, but the huge amount of time needed to get something
done because neither equivalent nor bindings exist for most big
and widespread C++ libraries like Qt. All these talks about
making D a more minimalist language won't solve much and will
only result in holding back D, which has the potential to become
a superset of all the good in other system languages, as well as
bringing its own powerful unique features such as metaprogramming
done right.
By removing the main reason why D wasn't a practical choice, this
will hopefully unlock the situation and make D gain momentum as
well as attract more contributors to the compilers to fix bugs
and regressions before releases.
More information about the Digitalmars-d-announce
mailing list