082edf8ddf4cd4ff0a3f68ced6adb6ef02ef3ecc
[uffi.git] / doc / intro.sgml
1 <!-- -*- DocBook -*- -->
2
3 <chapter>
4   <title>Introduction</title>
5   <sect1>
6     <title>Purpose</title>
7     <para> This reference guide describes
8       &uffi;, a package that provides a cross-implementation
9       interface from Common Lisp to C-language compatible libraries.
10     </para>
11   </sect1>
12
13   <sect1>
14     <title>Background
15     </title>
16     <para>
17       Every Common Lisp implementation has
18       a method for interfacing to C-language compatible
19       libraries. These methods are often termed a 
20       <emphasis>Foreign Function Library Interface</emphasis>
21       (&ffi;). Unfortunately, these methods vary widely
22       amongst
23       implementations, thus preventing the writing of a portable FFI to a 
24 particular C-library. 
25     </para>
26     <para>
27       &uffi; gathers a common subset of functionality between Common Lisp
28       implementations. &uffi; wraps this common subset of functionality with
29       it's own syntax and provides macro translation of uffi functions into
30       the specific syntax of supported Common Lisp implementations.
31     </para>
32     <para>
33       Developers who use &uffi; to interface with C libraries will
34       automatically have their code function in each of uffi's supported
35       implementations.
36     </para>
37   </sect1>
38
39   <sect1>
40     <title>Supported Implementations</title> 
41     <para>The primary tested and supported platforms for &uffi; are: 
42     </para>
43     <itemizedlist mark="opencircle">
44       <listitem><para>&acl; v6.2 on Debian GNU/Linux
45 FreeBSD 4.5, Solaris v2.8, and Microsoft Windows XP.</para></listitem>
46       <listitem><para>&lw; v4.2 on Debian GNU/Linux and Microsoft Windows XP.</para></listitem>
47       <listitem><para>&cmucl; 18d-pre on Debian GNU/Linux, FreeBSD 4.5, and Solaris 2.8</para></listitem>
48     </itemizedlist>
49     <para>Beta code is included with &uffi; for
50     </para>
51     <itemizedlist mark="opencircle">
52       <listitem><para>&mcl; with MacOSX</para></listitem>
53     </itemizedlist>
54   </sect1>
55
56     <sect1>
57       <title>Design</title>
58       <sect2>
59         <title>Overview</title>
60         <para>
61           &uffi; was designed as a cross-implementation 
62           compatible <emphasis>Foreign Function Interface</emphasis>.
63           Necessarily,
64           only a common subset of functionality can be
65           provided. Likewise, not every optimization for that a specific
66           implementation provides can be supported. Wherever possible,
67           though, implementation-specific optimizations are invoked.
68         </para> 
69       </sect2>
70
71       <sect2>
72         <title>Priorities</title>
73         <para>
74           The design of &uffi; is dictated by the order of these priorities:
75         </para>
76         <itemizedlist>
77           <listitem>
78             <para>
79               Code using &uffi; must operate correctly on all
80               supported implementations.
81             </para>
82           </listitem>
83           <listitem>
84             <para>
85               Take advantage of implementation-specific optimizations. Ideally, 
86               there will not a situation where an implementation-specific
87               &ffi; will be chosen due to lack of optimizations in &uffi;.
88             </para>
89           </listitem>
90           <listitem>
91             <para>Provide a simple interface to developers using
92 &uffi;.  This priority is quite a bit lower than the above priorities.
93 This lower priority is manifest by programmers having to pass types in
94 pointer and array dereferencing, needing to use
95 <constant>cstring</constant> wrapper functions, and the use of
96 ensure-char-character and ensure-char-integer functions. My hope is
97 that the developer inconvenience will be outweighed by the generation
98 of optimized code that is cross-implementation compatible.
99             </para>
100           </listitem>
101         </itemizedlist>
102       </sect2>
103     </sect1>
104
105 </chapter>