-
Notifications
You must be signed in to change notification settings - Fork 1
/
ANNOUNCEMENT.txt
284 lines (203 loc) · 10.2 KB
/
ANNOUNCEMENT.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
Initial Announcement: Package rdyncall released on CRAN. (Version 0.7.3)
Short Introduction
------------------
The package facilities dynamic R bindings to the C interface of some common
shared libraries and a flexible Foreign Function Interface for the
interoperability between R and C.
Since the initial presentation of the package at Use!R 2009, a number of
improvements have been done to rdyncall, the low-level DynCall libraries
and the build system for an official release on CRAN.
Overview
--------
The package comprises a toolkit to work with C interfaces to native code from
within the dynamic R interpreter without the need for C wrapper compilation:
- Dynamic R bindings to some common C shared libraries, across platforms.
- Foreign Function Interface that supports almost all C arg/return types
and has built-in type-checking facility.
- Portable naming and loading of shared libraries across platforms.
- Handling of aggregate C struct and union data types.
- Wrapping of R functions as C callbacks.
- Binding of C functions to R in batches.
The intended audience for this package are developers experienced with C, that
.. need complete R bindings of C libraries.
.. want to write cross-platform portable system-level code in R.
.. need a FFI that supports almost all C fundamental types for arguments
and return types and thus does not need compilation of wrapper C code
.. want to work with C struct/union types directly in R
.. are interested in dynamic binding techniques between static and dynamic
languages and cross-platform binding strategies.
Brief Tour 1/2: Dynamic R Bindings to C Libraries
-------------------------------------------------
The dynamic binding interface consists of a single function, similar to
'library' or 'require':
> dynport(portname)
portname refers to a 'DynPort' file name that represents an R binding to a
common C interface and library.
The function the above has the side effect of attaching a newly created R name
space, populated with thin R helper objects to C entities of the underlying
C library:
- call wrapper to C functions
- symbolic constants of C macros and enums,
- type information objects for C struct and union data types.
The package contains a repository of the following DynPort files:
Port Name | Description of C Shared Library/API
------------+-------------------------------------------------
expat | Expat XML Parser Library
GL | OpenGL 1.1 API
GLU | OpenGL Utility Library
SDL | Simple DirectMedia Layer library
SDL_image | Loading of image files (png,jpeg..)
SDL_mixer | Loading/Playing of ogg/mp3/mod music files.
SDL_ttf | Loading/Rendering of True Type Fonts.
glew | OpenGL Extension Wrangler (includes OpenGL 3.0)
gl3 | strict OpenGL 3 (untested)
R | R shared library
ode | Open Dynamics (Physics-) Engine (untested)
cuda | NVIDIA Cuda (untested)
opencl | OpenCL (untested)
stdio | C Standard Library I/O Functions
In order to use a DynPort on a host system, the shared C libraries
need to be installed first.
See manual page on 'rdyncall-demos' (type ?'rdyncall-demos') for a detailed
description of the installation notes for several libraries the above,
collected for a large range of operating-systems and OS distributions.
Since the rdyncall package is alredy ported across major R platforms, code
that uses a DynPort can run cross-platform without compilation.
Here is a small example for using the SDL and OpenGL for multimedia/3D:
-- snip
# load SDL and OpenGL bindings
dynport(SDL)
dynport(GL)
# initialize video sub-system
SDL_Init(SDL_INIT_VIDEO)
# open double-buffered OpenGL window surface
surface <- SDL_SetVideoMode(640,480,32,SDL_OPENGL+SDL_DOUBLEBUF)
# print dimension by accessing fields external C pointer to struct SDL_Surface
print( paste("dimenstion:", surface$w, "x", surface$h ))
# clear buffer
glClearColor(0.3,0.6,0.8,0)
glClear(GL_COLOR_BUFFER_BIT)
# update display
SDL_GL_SwapBuffers()
-- snap
A more detailed version including user-interface handling is available
in 'demo(SDL)'.
Brief Tour 2/2: Alternative FFI via '.dyncall'
----------------------------------------------
The alternative foreign function interface offered by '.dyncal' has a similar
intend such as '.C'. It allows to call shared library functions directly from R,
but without additional wrapper C code needed, because it supports almost all
fundamental C data types and uses a function type signature text specification
for type-checking and flexible conversions between R and C values.
The interface is as following:
> .dyncall(address, signature, ...)
'signature' is a character string that encodes the arguments and return-type of
a C function.
Here is an example of C function from the OpenGL API:
void glClearColor(float red, float green, float blue, float alpha);
one would specify the function type via "ffff)v" as type signature and
pass additional arguments for '...':
> .dyncall(addressOf_glClearColor, "ffff)v", 0.3,0.7,1,0)
Support for pointers (low-level void and typed pointers to struct/union) and
wrapping of R functions to first-level C function pointers is also available.
-- snip
# load C math library across major platforms (Windows,Mac OS X,Linux)
mathlib <- dynfind(c("msvcrt","m","m.so.6"))
# resolve symbol 'sqrt'
x <- .dynsym(mathlib,"sqrt")
# C function call 'double sqrt(double x)' with x=144
.dyncall(x, "d)d", 144)
# .dyncall uses complex mapping of types, same works with 'integer' argument:
.dyncall(x, "d)d", 144L)
-- snap
Implementation Details
----------------------
This package contains low-level services related to the generic invocation
of machine-code functions using official calling convention specifications
as the binary interface. A similar service exists for the oppositve direction
in order to write R functions and wrap them as first-level C function callback
pointers.
The implementation is based on libraries from the DynCall Project that
implement a small amount of code in Assembly and have to play closely
together with the calling conventions of various processor-architectures and
platforms.
The implementation can be tricky has to be done on a calling-convention
basis. The efforts legitimate this non-portsble approach due to a
very small code size and a generic machine-call solution designed for
dynamic interpreters. (total size of shared lib object in rdyncall is ~60kb )
Portability and Platforms
-------------------------
A large set of platforms and calling conventions are already supported and a
suite of testing tools ensure a stable implementation at low-level.
Processor-Architectures:
- Intel i386 32-bit and AMD 64-bit Platforms
- PowerPC 32-bit (support for callbacks on System V systems not yet implemented)
- ARM 32-bit (with support for Thumb)
- MIPS 32- and 64-bit (support for callbacks not yet implemented)
- SPARC 32-bit and 64-bit (support for callbacks not yet implemented)
The DynCall libraries are tested on Linux, Mac OS X, Windows, BSD derivates,
Solaris and more exotic platforms such as game consoles, Plan9, Haiku and Minix.
The R Package has been tested on several major 32- and 64-bit R platforms
including Windows 32/64-bit, Linux (i386,amd64,ppc,arm), NetBSD (i386,amd64),
Solaris (i386,amd64).
As of this release, no support for callbacks is available on MIPS or SPARC.
Callbacks on PowerPC 32-bit for Mac OS X work fine, for other
ELF/System V-based PowerPC systems, callbacks are not yet implemented.
Known Bugs
----------
* PowerPC/Mac OS X 10.4: Building Universal Binaries are broken.. in particular
the as for i386 assembler.
Workaround for PowerPC users: install with "--no-multiarch" or use prebuilt
binaries built on OS X >= 10.5.
* SPARC Assembly sources are currently implemented for GNU assembler and do
not assemble using the 'fbe' Assembler tool on Solaris.
More Information
----------------
More demos and examples are in the package.
A 20-page vignette with the title "Foreign Library Interface" is available via
> vignette("FLI")
A cross-platform audio/visual OpenGL-based demo-scene production
written in 100% pure R is available here:
http://dyncall.org/demos/soulsalicious/
A video of demo is also at the website.
The website of the DynCall Project is at
http://dyncall.org/
Help and Feedback
-----------------
The package contains new methods for dynamic binding of native code to R
that were designed to work cross-platform. Thus the package required intensive
testing on a large range of processor/OS/tool-chain combinations.
It was (and still is!) also very helpful to run tests on different
'distributions' of the same OS for checking e.g. the search algorithm for
locating shared libraries by a short name across operating-systems
(see '?dynfind' for details on this).
I am very thankful for any feedback including bug-reports, success and
failure stories or ideas of improvements. If you feel that an important
architecture, platform or build-tool is missing here please let me know too.
The DynCall authors appreciate any support for porting the DynCall libraries
and the R package e.g. remote development accounts, qemu/gxemul images,
hardware. In particular we are currently looking for the following
arch/os/compilers environment for porting the DynCall libraries and rdyncall:
- Sparc/Solaris/SunPro
- PowerPC/AIX/XL C
- MIPS/IRIX/MIPSpro
If you can help us out, please get in contact us.
ChangeLog
---------
0.7.3: [2011-07-19] Added vignette, new ports, new tool-chain an fixes for bugs
o bugfix for Fedora/x64: added search path 'lib64' folder for 'dynfind'.
o added support for Sun make, DynCall uses Makefile.embedded.
o added sparc and sparc64 support using gcc tool-chain.
o added support for amd64 using solaris tool-chain.
o added vignette "foreign library interface".
o bugfix for solaris/x64: added search path 'amd64' folder for 'dynfind'.
o bugfix in examples for libm using 'm.so.6' besides 'm' on unix
(needed by debian 6 sid unstable)
0.7.2: [2011-04-27] Minor fixes
o added win64/mingw64 support.
0.7.1: [2011-04-26] Minor fixes
o minor Makevars fix for parallel builds.
0.7.0: [2011-04-20] Initial Release
o first upload to CRAN.
enjoy,
- Daniel