0
|
1 %//////////////////////////////////////////////////////////////////////////////
|
|
2 %
|
|
3 % Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>,
|
|
4 % Tassilo Philipp <tphilipp@potion-studios.com>
|
|
5 %
|
|
6 % Permission to use, copy, modify, and distribute this software for any
|
|
7 % purpose with or without fee is hereby granted, provided that the above
|
|
8 % copyright notice and this permission notice appear in all copies.
|
|
9 %
|
|
10 % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
11 % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
12 % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
13 % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
14 % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
15 % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
16 % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
17 %
|
|
18 %//////////////////////////////////////////////////////////////////////////////
|
|
19
|
|
20 \newpage
|
|
21 \section{Bindings to programming languages}
|
|
22
|
|
23 Through binding of the \product{dyncall} library into a scripting environment,
|
|
24 the scripting language can gain system programming status to a certain degree.\\
|
|
25 The \product{dyncall} library provides bindings to Erlang\cite{Erlang}, Java\cite{Java},
|
|
26 Lua\cite{Lua}, Python\cite{Python}, R\cite{R}, Ruby\cite{Ruby}, Go\cite{Go} and the shell/command line.\\
|
|
27 However, please note that some of these bindings are work-in-progress and not
|
|
28 automatically tested, meaning it might require some additional work to make them
|
|
29 work.
|
|
30
|
|
31 \subsection{Common Architecture}
|
|
32
|
|
33 The binding interfaces of the \product{dyncall} library to various scripting
|
|
34 languages share a common set of functionality to invoke a function call.
|
|
35
|
|
36 \subsubsection{Dynamic loading of code}
|
|
37
|
|
38 The helper library \emph{dynload} which accompanies the \product{dyncall}
|
|
39 library provides an abstract interface to operating-system specific mechanisms
|
|
40 for loading and accessing executable code out of, but not limited to, shared
|
|
41 libraries.
|
|
42
|
|
43 \subsubsection{Functions}
|
|
44
|
|
45 All bindings are based on a common interface convention providing a common set
|
|
46 of the following 4 functions (exact spelling depending on the binding's scripting
|
|
47 environment):
|
|
48 \begin{description}
|
|
49 \item [load] - load a module of compiled code
|
|
50 \item [free] - unload a module of compiled code
|
|
51 \item [find] - find function pointer by symbolic names
|
|
52 \item [call] - invoke a function call
|
|
53 \end{description}
|
|
54
|
|
55 \pagebreak
|
|
56
|
|
57 \subsubsection{Signatures}
|
|
58
|
|
59 A signature is a character string that represents a function's arguments and
|
|
60 return value types. It is used in the scripting language bindings invoke
|
|
61 functions to perform automatic type-conversion of the languages' types to the
|
|
62 low-level C/C++ data types. This is an essential part of mapping the more flexible
|
|
63 and often abstract data types provided in scripting languages conveniently to the
|
|
64 strict machine-level data types used by C-libraries.
|
|
65 The high-level C interface functions \capi{dcCallF()}, \capi{dcVCallF()},
|
|
66 \capi{dcArgF()} and \capi{dcVArgF()} of the \product{dyncall} library also make
|
|
67 use of this signature string format.\\
|
|
68 \\
|
|
69 The format of a \product{dyncall} signature string is as depicted below:
|
|
70
|
|
71
|
|
72 \paragraph{\product{dyncall} signature string format}
|
|
73
|
|
74 \begin{center}
|
|
75 \group{input parameter type signature character}* \sigchar{)} \group{return
|
|
76 type signature character} \\
|
|
77 \end{center}
|
|
78
|
|
79 The \group{input parameter type signature character} sequence left to the
|
|
80 \sigchar{)} is in left-to-right order of the corresponding C function
|
|
81 parameter type list.\\
|
|
82 The special \group{return type signature character} \sigchar{v} specifies
|
|
83 that the function does not return a value and corresponds to \capi{void}
|
|
84 functions in C.
|
|
85
|
|
86 \begin{table}[h]
|
|
87 \begin{center}
|
|
88 \begin{tabular*}{0.75\textwidth}{cl}
|
|
89 Signature character & C/C++ data type \\
|
|
90 \hline
|
|
91 \sigchar{B} & \_Bool, bool \\
|
|
92 \sigchar{c} & char \\
|
|
93 \sigchar{C} & unsigned char \\
|
|
94 \sigchar{s} & short \\
|
|
95 \sigchar{S} & unsigned short \\
|
|
96 \sigchar{i} & int \\
|
|
97 \sigchar{I} & unsigned int \\
|
|
98 \sigchar{j} & long \\
|
|
99 \sigchar{J} & unsigned long \\
|
|
100 \sigchar{l} & long long, int64\_t \\
|
|
101 \sigchar{L} & unsigned long long, uint64\_t \\
|
|
102 \sigchar{f} & float \\
|
|
103 \sigchar{d} & double \\
|
|
104 \sigchar{p} & void* \\
|
|
105 \sigchar{Z} & const char* (pointing to C string) \\
|
|
106 \sigchar{v} & void \\
|
|
107 \end{tabular*}
|
|
108 \caption{Type signature encoding for function call data types}
|
|
109 \label{sigchar}
|
|
110 \end{center}
|
|
111 \end{table}
|
|
112
|
|
113 Please note that using a \sigchar{(} at the beginning of a signature string is possible,
|
|
114 although not required. The character doesn't have any meaning and will simply be
|
|
115 ignored. However, using it prevents annoying syntax highlighting problems with some code
|
|
116 editors.
|
|
117
|
|
118 \pagebreak
|
|
119
|
|
120 \paragraph{Examples of C function prototypes}
|
|
121
|
|
122 \begin{table}[h]
|
|
123 \begin{center}
|
|
124 \begin{tabular*}{0.75\textwidth}{rll}
|
|
125 & C function prototype & dyncall signature \\
|
|
126 \hline
|
|
127 void & f1(); & \sigstr{)v}\\
|
|
128 int & f2(int, int); & \sigstr{ii)i}\\
|
|
129 long long & f3(void*); & \sigstr{p)L}\\
|
|
130 void & f3(int**); & \sigstr{p)v}\\
|
|
131 double & f4(int, bool, char, double, const char*); & \sigstr{iBcdZ)d}\\
|
|
132 \end{tabular*}
|
|
133 \caption{Type signature examples of C function prototypes}
|
|
134 \label{sigex}
|
|
135 \end{center}
|
|
136 \end{table}
|
|
137
|
|
138
|
|
139
|
|
140 \subsection{Erlang language bindings}
|
|
141
|
|
142 The OTP library application {\tt erldc} implements the Erlang language bindings.
|
|
143
|
|
144 \begin{table}[h]
|
|
145 \begin{center}
|
|
146 \begin{tabular*}{0.75\textwidth}{ll}
|
|
147 Signature character & accepted Erlang data types\\
|
|
148 \hline
|
|
149 \sigchar{B} & atoms 'true' and 'false' converted to bool\\
|
|
150 \sigchar{c}, \sigchar{C} & integer cast to (unsigned) char\\
|
|
151 \sigchar{s}, \sigchar{S} & integer cast to (unsigned) short\\
|
|
152 \sigchar{i}, \sigchar{I} & integer cast to (unsigned) int\\
|
|
153 \sigchar{j}, \sigchar{J} & integer cast to (unsigned) long\\
|
|
154 \sigchar{l}, \sigchar{L} & integer cast to (unsigned) long long\\
|
|
155 \sigchar{f} & decimal cast to float\\
|
|
156 \sigchar{d} & decimal cast to double\\
|
|
157 \sigchar{p} & binary (previously returned from call\_ptr or callf) cast to void*\\
|
|
158 \sigchar{Z} & string cast to void*\\
|
|
159 \sigchar{v} & no return type\\
|
|
160 \end{tabular*}
|
|
161 \caption{Type signature encoding for Erlang bindings}
|
|
162 \label{Erlangsigchar}
|
|
163 \end{center}
|
|
164 \end{table}
|
|
165
|
|
166 \pagebreak
|
|
167
|
|
168 \subsection{Go language bindings}
|
|
169
|
|
170 A Go binding is provided through the {\tt godc} package. Since Go's type system is basically a superset of C's, the type mapping from Go to C is straightforward.
|
|
171
|
|
172 \begin{table}[h]
|
|
173 \begin{center}
|
|
174 \begin{tabular*}{0.75\textwidth}{ll}
|
|
175 Signature character & accepted Go data types\\
|
|
176 \hline
|
|
177 \sigchar{B} & bool\\
|
|
178 \sigchar{c}, \sigchar{C} & int8, uint8\\
|
|
179 \sigchar{s}, \sigchar{S} & int16, uint16\\
|
|
180 \sigchar{i}, \sigchar{I} & int, uint\\
|
|
181 \sigchar{j}, \sigchar{J} & int32, uint32\\
|
|
182 \sigchar{l}, \sigchar{L} & int64, uint64\\
|
|
183 \sigchar{f} & float32\\
|
|
184 \sigchar{d} & float64\\
|
|
185 \sigchar{p}, \sigchar{Z} & uintptr, unsafe.Pointer\\
|
|
186 \sigchar{v} & no return type\\
|
|
187 \end{tabular*}
|
|
188 \caption{Type signature encoding for Go bindings}
|
|
189 \label{Gosigchar}
|
|
190 \end{center}
|
|
191 \end{table}
|
|
192
|
|
193 Note that passing a Go-{\tt string} directly to a C-function expecting a pointer is not directly possible. However, the binding comes with
|
|
194 two helper functions, {\tt AllocCString(value string) unsafe.Pointer} and {\tt FreeCString(value unsafe.Pointer)} to help with converting
|
|
195 a {\tt string} to an {\tt unsafe.Pointer} which then can be passed to {\tt ArgPointer(value unsafe.Pointer)}. Once you are done with this
|
|
196 temporary string, free it using {\tt FreeCString(value unsafe.Pointer)}.
|
|
197
|
|
198
|
|
199 \subsection{Python language bindings}
|
|
200
|
|
201 The python module {\tt pydc} implements the Python language bindings,
|
|
202 namely {\tt load}, {\tt find}, {\tt free}, {\tt call}.
|
|
203
|
|
204 \begin{table}[h]
|
|
205 \begin{center}
|
|
206 \begin{tabular*}{0.75\textwidth}{ll}
|
|
207 Signature character & accepted Python data types\\
|
|
208 \hline
|
|
209 \sigchar{B} & bool \\
|
|
210 \sigchar{c} & if string, take first item\\
|
|
211 \sigchar{s} & int, check in range\\
|
|
212 \sigchar{i} & int\\
|
|
213 \sigchar{j} & int\\
|
|
214 \sigchar{l} & long, casted to long long\\
|
|
215 \sigchar{f} & float\\
|
|
216 \sigchar{d} & double\\
|
|
217 \sigchar{p} & string or long casted to void*\\
|
|
218 \sigchar{v} & no return type\\
|
|
219 \end{tabular*}
|
|
220 \caption{Type signature encoding for Python bindings}
|
|
221 \label{Pysigchar}
|
|
222 \end{center}
|
|
223 \end{table}
|
|
224
|
|
225 \pagebreak
|
|
226
|
|
227 \subsection{R language bindings}
|
|
228
|
|
229 The R package {\tt rdyncall} implements the R langugae bindings providing the function
|
|
230 {\tt .dyncall() }.
|
|
231
|
|
232 \begin{table}[h]
|
|
233 \begin{center}
|
|
234 \begin{tabular*}{0.75\textwidth}{ll}
|
|
235 Signature character & accepted R data types\\
|
|
236 \hline
|
|
237 \sigchar{B} & coerced to logical vector, first item\\
|
|
238 \sigchar{c} & coerced to integer vector, first item truncated char\\
|
|
239 \sigchar{C} & coerced to integer vector, first item truncated to unsigned char\\
|
|
240 \sigchar{s} & coerced to integer vector, first item truncated to short\\
|
|
241 \sigchar{S} & coerced to integer vector, first item truncated to unsigned short\\
|
|
242 \sigchar{i} & coerced to integer vector, first item\\
|
|
243 \sigchar{I} & coerced to integer vector, first item casted to unsigned int\\
|
|
244 \sigchar{j} & coerced to integer vector, first item\\
|
|
245 \sigchar{J} & coerced to integer vector, first item casted to unsigned long\\
|
|
246 \sigchar{l} & coerced to numeric, first item casted to long long\\
|
|
247 \sigchar{L} & coerced to numeric, first item casted to unsigned long long\\
|
|
248 \sigchar{f} & coerced to numeric, first item casted to float\\
|
|
249 \sigchar{d} & coerced to numeric, first item\\
|
|
250 \sigchar{p} & external pointer or coerced to string vector, first item\\
|
|
251 \sigchar{Z} & coerced to string vector, first item\\
|
|
252 \sigchar{v} & no return type\\
|
|
253 \end{tabular*}
|
|
254 \caption{Type signature encoding for R bindings}
|
|
255 \label{Rsigchar}
|
|
256 \end{center}
|
|
257 \end{table}
|
|
258
|
|
259 Some notes on the R Binding:
|
|
260 \begin{itemize}
|
|
261 \item Unsigned 32-bit integers are represented as signed integers in R.
|
|
262 \item 64-bit integer types do not exist in R, therefore we use double floats
|
|
263 to represent 64-bit integers (using only the 52-bit mantissa part).
|
|
264 \end{itemize}
|
|
265
|
|
266 \pagebreak
|
|
267
|
|
268 \subsection{Ruby language bindings}
|
|
269
|
|
270 The Ruby gem {\tt rbdc} implements the Ruby language bindings.
|
|
271
|
|
272 \begin{table}[h]
|
|
273 \begin{center}
|
|
274 \begin{tabular*}{0.75\textwidth}{ll}
|
|
275 Signature character & accepted Ruby data types\\
|
|
276 \hline
|
1
|
277 \sigchar{B} & TrueClass, FalseClass, NilClass, Fixnum casted to bool\\
|
0
|
278 \sigchar{c}, \sigchar{C} & Fixnum cast to (unsigned) char\\
|
|
279 \sigchar{s}, \sigchar{S} & Fixnum cast to (unsigned) short\\
|
|
280 \sigchar{i}, \sigchar{I} & Fixnum cast to (unsigned) int\\
|
|
281 \sigchar{j}, \sigchar{J} & Fixnum cast to (unsigned) long\\
|
|
282 \sigchar{l}, \sigchar{L} & Fixnum cast to (unsigned) long long\\
|
|
283 \sigchar{f} & Float cast to float\\
|
|
284 \sigchar{d} & Float cast to double\\
|
|
285 \sigchar{p}, \sigchar{Z} & String cast to void*\\
|
|
286 \sigchar{v} & no return type\\
|
|
287 \end{tabular*}
|
|
288 \caption{Type signature encoding for Ruby bindings}
|
|
289 \label{Rubysigchar}
|
|
290 \end{center}
|
|
291 \end{table}
|