g-wrap-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Providing an API reference


From: Andreas Rottmann
Subject: Re: Providing an API reference
Date: Fri, 21 Oct 2005 23:17:19 +0200
User-agent: Gnus/5.1002 (Gnus v5.10.2) Emacs/21.4 (gnu/linux)

address@hidden (Ludovic Courtès) writes:

> Hi,
>
> I've started augmenting the doc with an API reference.  I believe that
> this could complement what's already written since the doc is currently
> closer to a tutorial than to a reference.
>
Indeed!

> Writing an API reference may sound ambitious given the amount of work
> there is to document everything, and given that parts of the API are
> still in flux.  Anyway, my guess is that the most important parts of the
> `-cg' API are relatively stable, and the high-level `wrap-' API will not
> change much.
>
Yeah, that's the basic idea.

> Given these (optimistic?) assumptions, I'm trying to document both the
> high-level API (the `wrap-' interface) and the code-generation API (the
> `-cg'), or at least the its most important parts---the rest can
> hopefully easily be inferred once you've got a feel of how it works.
> The point in documenting the code-generation interface is that it's what
> makes G-Wrap so flexible compared to pure declarative wrapper
> generators.
>
> Everything is in my archive located at
> http://www.laas.fr/~lcourtes/software/address@hidden , in
> `g-wrap--devo--1.9.6--patch-9'.  Obviously, this is just the beginning
> of the story...
>
I've merged that patch now into the development branch.

> I'd be glad to hear comments about what I've done so far.
>
I greatly appreciate your involvement. Sorry for being a bit slow to
comment on the patches not merged yet, instead here are some random
notes about my ideas about G-Wraps future and C-binding helpers for
Scheme in general:

I'm not at all convinced my effort to make G-Wrap support Scheme 48
makes much sense at all, for these reasons:

* Most of G-Wraps complexity stems from C code generation, which is
  not necessary with a Scheme-level FFI, such as Scheme 48 and PLT
  Scheme provide. It seems a different, more simple tool, with the
  different features would be much more suitable:

  With a Scheme-level FFI, you can conviniently bind a given C API
  by writing Scheme code; it seems backwards to use a code
  generator, as you have one in Scheme itself in the form of
  macros. The problem is a different one: extracting certain
  information from the C API that is not (convieniently) available
  without invoking a compiler, such as the values of C macros and
  enumerations. With the code-generation approach, this knowledge is
  compiled into wrapper functions (and thus hidden away). With a
  tool I envision, that knowledge would be _extracted_ at the tools
  run time, by generating simple C programs that print those values
  in S-expression form, invoking the compiler on the C code, and
  running the resulting executable. This is quite different from
  what G-Wrap does, and retrofitting such functionality into G-Wrap
  would make it even more complex.

  I can really recommend reading the paper about the PLT FFI, linked
  from [0], to see how expressive a Scheme-Level FFI is; hiding it
  below a code generator only takes away from that.

  [0] http://community.schemewiki.org/?ffi

* Now that my focus has shifted from Guile to Scheme 48, and
  portable Scheme in general, I view my rewrite using GOOPS
  ambivalently; the rewrite has certainly made G-Wrap more flexible
  and extensible, and probably given it a clearer structure,
  however, due to GOOPS' use of keywords (while they are
  R5RS-compatible and supported by some other implementations),
  GOOPS is fundamentally non-standard, without touching the core of
  implementations that don't provide #:foo-style keywords it isn't
  possible to implement it on other Schemes. IMO, G-Wrap supporting
  multiple back-ends only makes sense when it also is able to run on
  these implementations, or else it probably won't get much usage.

So in short: G-Wrap's future looks brightest when staying a Guile
(-only) tool; a much more simple, portable C-binding tool can be
achieved by:

  * Implementing a PLT-style FFI. This already goes a long way towards
    easing the work of creating bindings; I wrote a simple mysql
    binding for Scheme 48 in 135 lines of pure Scheme. Actually, the
    RTI (run time information) layer in G-Wrap can be seen as a
    half-implementation of that approach; implementing a subset of the
    PLT FFI for Guile based on that part of G-Wrap would be not very
    hard (speaking from my experience on doing the same thing for
    Scheme 48).

  * Supplement that with tools that can extract the low-level C API
    information from headers, by parsing and compilation (as outlined
    above). Also G-Wrap could profit from a C header parser, as
    writing the declarations for the wrappers is quite tedious if more
    than a few functions are involved. I haven't really looked at it,
    but scheffig[1] is a tool that looks similiar to G-Wrap on a
    superficial level (generates C wrapper functions) and leverages
    the FCC C parser written by Mike Sperber, which probably is quite
    portable.

    [1] http://blogs.macbay.de/unspecific/stories/5261/

  * The low-level API information, as extracted in the above step still
    doesn't contain enough information for useful Scheme bindings, as
    part of the information needed for binding a C library are only
    available in its documentation, for example the semantics of memory
    allocation, for example whether a "double *" function argument in
    fact an array of a certain size, specified by another argument of
    that function, or a output argument. This information would be
    encapsulated in hand-written high-level bindings that make use of
    the automatically generated low-level bindings that result from
    header parsing.

Regards, Rotty
-- 
Andreas Rottmann         | address@hidden      | address@hidden | address@hidden
http://yi.org/rotty      | GnuPG Key: http://yi.org/rotty/gpg.asc
Fingerprint              | DFB4 4EB4 78A4 5EEE 6219  F228 F92F CFC5 01FD 5B62
v2sw7MYChw5pr5OFma7u7Lw2m5g/l7Di6e6t5BSb7en6g3/5HZa2Xs6MSr1/2p7 hackerkey.com

Always be wary of the Software Engineer who carries a screwdriver.
  -- Robert Paul




reply via email to

[Prev in Thread] Current Thread [Next in Thread]