Difference between revisions of "Cxx foreign function interface"
(First draft) |
(Added descriptions of Hacanon, Hacanon-light, zeroth) |
||
Line 1: | Line 1: | ||
+ | This page outlines the challenges involved in building a foreign function interface (FFI) from Haskell to C++ libraries, references some general background about the FFI, and then describes some solutions to the difficulties of C++. |
||
⚫ | |||
+ | |||
+ | == Difficulties of Interfacing to C++ == |
||
Foreign function interfaces (FFIs) from Haskell to C are well developed, |
Foreign function interfaces (FFIs) from Haskell to C are well developed, |
||
Line 5: | Line 7: | ||
In general, the Haskell FFI apparatus specifies how to call a function |
In general, the Haskell FFI apparatus specifies how to call a function |
||
(not a method) using the "ccall" calling mechanism used for C programs. |
(not a method) using the "ccall" calling mechanism used for C programs. |
||
− | The FFI specification |
+ | The FFI specification [[Definition#Addenda_to_the_report]] mentions, but does not require, an alternative calling mechanism for C++; no Haskell compiler has ever implemented this. Extra complications arise in interfacing to C++ libraries: |
# A C++ program allows overloading, using the same function name with different argument lists. But at the binary level, each different version of the function must have its own name. The C++ compiler "mangles" the function names to differentiate them. |
# A C++ program allows overloading, using the same function name with different argument lists. But at the binary level, each different version of the function must have its own name. The C++ compiler "mangles" the function names to differentiate them. |
||
# A C++ program may have classes with constructors, destructors, and methods. These are, obviously, not quite the same as functions, and have no obvious counterpart in Haskell. |
# A C++ program may have classes with constructors, destructors, and methods. These are, obviously, not quite the same as functions, and have no obvious counterpart in Haskell. |
||
+ | # Inheritance (maybe) |
||
# Template functions, template classes, etc. |
# Template functions, template classes, etc. |
||
+ | == Background Information == |
||
− | Here are some approaches to building interfaces to C++: |
||
+ | |||
+ | Understanding the FFI in general, and with respect to the C programming language in particular, is vital background for anyone wishing to build a Haskell interface to C++. The following pages provide background information: |
||
+ | |||
+ | * [[FFI_Introduction]] |
||
+ | * [[Applications_and_libraries/Interfacing_other_languages]] |
||
+ | |||
⚫ | |||
* [[IO_inside]] describes how to interface to a C++ library using the "export C" declaration (in C++) which makes it look like a C library. This seems to be the standard technique for briding the gap between Haskell and C++. |
* [[IO_inside]] describes how to interface to a C++ library using the "export C" declaration (in C++) which makes it look like a C library. This seems to be the standard technique for briding the gap between Haskell and C++. |
||
* [[CPlusPlus_from_Haskell]] describes "the hard way" of interfacing to C++, using the mangled C++ names directly without using "export C". It also suggests the possibility of a more automated approach using gcc-xml. |
* [[CPlusPlus_from_Haskell]] describes "the hard way" of interfacing to C++, using the mangled C++ names directly without using "export C". It also suggests the possibility of a more automated approach using gcc-xml. |
||
− | * Hacanon automatically generates an FFI to C++ using |
+ | * [http://darcs.haskell.org/~lemmih/hacanon/ Hacanon] automatically generates an FFI to C++ using [Template_Haskell],, but its author has placed it "on hold" and sees some inherent flaws in using Template Haskell. (See David Himmelstrup, 2006, [http://darcs.haskell.org/~lemmih/aboutMe.html "About Lemmih"], accessed 20 June 2009) |
+ | ** [http://hackage.haskell.org/package/hacanon-light Hacanon-light] is a reduced form of Hacanon, but with the same problems involving Template Haskell. (See ibid.) |
||
− | ** Need link |
||
+ | ** [http://darcs.haskell.org/%7Elemmih/zerothHead Zeroth] fixes the problems of Hacanon and Hacanon-light, but is "on hold". (See ibid.) |
||
* The [[HQK]] project reports having developed a small Haskell module, qoo, for accessing object-oriented libraries conveniently. |
* The [[HQK]] project reports having developed a small Haskell module, qoo, for accessing object-oriented libraries conveniently. |
Revision as of 16:20, 20 June 2009
This page outlines the challenges involved in building a foreign function interface (FFI) from Haskell to C++ libraries, references some general background about the FFI, and then describes some solutions to the difficulties of C++.
Difficulties of Interfacing to C++
Foreign function interfaces (FFIs) from Haskell to C are well developed, but writing an FFI to a C++ library remains a difficult undertaking. In general, the Haskell FFI apparatus specifies how to call a function (not a method) using the "ccall" calling mechanism used for C programs. The FFI specification Definition#Addenda_to_the_report mentions, but does not require, an alternative calling mechanism for C++; no Haskell compiler has ever implemented this. Extra complications arise in interfacing to C++ libraries:
- A C++ program allows overloading, using the same function name with different argument lists. But at the binary level, each different version of the function must have its own name. The C++ compiler "mangles" the function names to differentiate them.
- A C++ program may have classes with constructors, destructors, and methods. These are, obviously, not quite the same as functions, and have no obvious counterpart in Haskell.
- Inheritance (maybe)
- Template functions, template classes, etc.
Background Information
Understanding the FFI in general, and with respect to the C programming language in particular, is vital background for anyone wishing to build a Haskell interface to C++. The following pages provide background information:
Building Interfaces to C++
- IO_inside describes how to interface to a C++ library using the "export C" declaration (in C++) which makes it look like a C library. This seems to be the standard technique for briding the gap between Haskell and C++.
- CPlusPlus_from_Haskell describes "the hard way" of interfacing to C++, using the mangled C++ names directly without using "export C". It also suggests the possibility of a more automated approach using gcc-xml.
- Hacanon automatically generates an FFI to C++ using [Template_Haskell],, but its author has placed it "on hold" and sees some inherent flaws in using Template Haskell. (See David Himmelstrup, 2006, "About Lemmih", accessed 20 June 2009)
- Hacanon-light is a reduced form of Hacanon, but with the same problems involving Template Haskell. (See ibid.)
- Zeroth fixes the problems of Hacanon and Hacanon-light, but is "on hold". (See ibid.)
- The HQK project reports having developed a small Haskell module, qoo, for accessing object-oriented libraries conveniently.