Cxx foreign function interface
From HaskellWiki
(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 == | |
| + | |||
| + | 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]] | ||
| + | |||
| + | == 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++. | * [[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 Template Haskell ( | + | * [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.) |
| + | ** [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++.
1 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.
2 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:
3 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.
