/Calypso

LDC fork to experiment direct interfacing with C++

Primary LanguageCOtherNOASSERTION

Special Calypso notes

Calypso creates a bridge between DMD/LDC and Clang, both at the AST level (DMD <=> Clang's AST, Sema, ...) and at the code generation level (LDC <=> Clang's Codegen) to make D interface directly with the almost full set of C++ features, and without having to write bindings:

http://forum.dlang.org/thread/nsjafpymezlqdknmnkhi@forum.dlang.org

It's not a separate tool, but a fork of LDC which allows you to directly import/include a C/C++ header and use the declarations from within D. No intermediate files are necessary.

Calypso introduces a new keyword, modmap, along with the concept of language plugins which are queried by DMD's parser when it encounters special « import (ABC) xxx.yyy; » symbols. Interfacing with C++ declarations comes down to:

modmap (C++) "cppheader.h";      // tells Clang to load cppheader.h but do not import anything

import (C++) NamespaceA.Class1;  // imports NamespaceA::Class1
import (C++) NamespaceA._;       // special module per namespace, imports every global variables,
                                 // global functions and typedefs whose direct parent is NamespaceA::

The resulting imported symbols are usable like their D counterparts, although their implementation differs a lot. For more detailed examples and explanations on Calypso's features see tests/calypso/showcase.d.

Although Calypso is currently soldered to LDC, separating the two and placing Calypso and its bulky Clang dependency in an optional shared library should be easy. In this way, D compilers won't have to depend on a C/C++ compiler, and wider C++ support than what D currently has won't result in too cumbersome intrusions in core DMD/LDC.

Installation notes

A Clang 3.6 fork makes its appearance as a submodule, it's therefore recommended to build Calypso against LLVM 3.6 (it hasn't been tested with any other version actually).

Please note that to build Calypso in Debug mode LLVM needs to be built in Debug mode as well.

Specific flags and building the showcase example

Calypso adds the -cpp-flags option to LDC to pass arguments to Clang during the PCH generation, e.g to enable C++11 while building tests/calypso/showcase.d:

$ clang++ -std=c++11 -c showcase.cpp -o showcase.cpp.o
$ ar rcs libshowcase.a showcase.cpp.o
$ ldc2 -cpp-args -std=c++11 -Llibshowcase.a -L-lstdc++ showcase.d

LDC – the LLVM-based D Compiler

Build Status Test Coverage Bountysource

The LDC project aims to provide a portable D programming language compiler with modern optimization and code generation capabilities.

The compiler uses the official DMD frontends to support the latest version of D2, and relies on the LLVM Core libraries for code generation.

LDC is fully Open Source; the parts of the code not taken/adapted from other projects are BSD-licensed (see the LICENSE file for details).

Please consult the D wiki for further information: http://wiki.dlang.org/LDC

D1 is no longer available; see the 'd1' Git branch for the last version supporting it.

Installation

In-depth material on building and installing LDC and the standard libraries, including experimental instructions for running LDC on Windows, is available on the project wiki, at http://wiki.dlang.org/Building_LDC_from_source.

If you have a working C++ build environment, CMake, a current LLVM and libconfig++ (http://hyperrealm.com/libconfig/libconfig.html) available, there should be no big surprises, though.

Do not forget to make sure all the submodules are up to date:

$ cd ldc
$ git submodule update --init

Some Linux distributions are also packaging a recent version of LDC, so building it manually might not be necessary.

Contact

The best way to get in touch with the developers is either via the digitalmars.D.ldc forum/newsgroup/mailing list (http://forum.dlang.org) or the #ldc IRC channel on FreeNode.

For further documentation, contributor information, etc. please see the D wiki: http://wiki.dlang.org/LDC

Feedback of any kind is very much appreciated!