Hello, MPIR-developers!

I want to inform you about new MPIR-related project called X-MPIR. The
idea  is  to  develop  a  whole  set  of  bindings  for  a wide set of
programming languages using automatic translation.

MPIR/GMP  have  overwhelming  API - hundreds of functions with lots of
parameters.  It  is  hard  to  manually  write  wrapper  even  for one
programming   language.   However,  API  is  quite  regular  and  code
generation  will  easily  solve this problem - it doesn't matter 20 or
200  functions  to  generate,  once you have described them in regular
form.  Almost all popular languages can have their MPIR interface with
just a tiny bit of programming.

I've  created small proof-of-concept interface generator for C# (under
Win32/Win64).  All  significant MPIR functions are implemented, 220 in
total. 

>>> STRUCTURE

>From  the  end  user's point of view wrapper consists of one C# unit -
xmpir.cs,  and two DLL's - xmpir32.dll and xmpir64.dll. If you want to
use  MPIR  from  C# you just have to include xmpir.cs into you project
and  to place DLL's into binaries folder. Interface is very similar to
the original one.

Deep in the project internals we have:
* mpir.x - formal description of MPIR interface
*  xgen_core.php  and  xgen_wrapper.php  -  interface generator. It is
  written in PHP because this language is very similar to C and have a
  lot of text-processing functions.
*  computer-generated  file:  xmpir.c,  which  must  be linked against
  static  MPIR  library.  xmpir32.dll and xmpir64.dll are just xmpir.c
  compiled with 32 or 64-bit compilers.
* computer-generated file: xmpir.cs, C# wrapper itself.

>>> FEATURES AND FUTURE

Essential features of the new interface are:
*  automatic switching between 32-bit and 64-bit dynamic libraries. C#
  is  designed  to  be  platform-agnostic,  i.e. carefully written C#
  program  should   be   able   to  be executed without recompilation
  under  any  OS  -  32-bit  or  64-bit. However, this goal is hard to
  achieve  when  you use external libraries written using native code.
  New interface solves this problem.
* solution of some 32/64-bit issues. X-MPIR ABI isn't changed when you
  migrate  from  32-bit  OS  to 64-bit one. For example, X-MPIR always
  accepts  64-bit  bitcounts  (but raises an exception when you try to
  specify values which don't fit into the current machine word)
* similarity to the original interface
*  easy  to  use.  This  interface  is  intended  to be shipped in the
  precompiled  form - to ease installation for those who is unfamiliar
  with C.

Future development:
*  c#  interface  under Linux/Mono in the same "no recompilation of C#
  program needed" way.
*   interfaces   for  another  programming  languages.  Java,  Python,
  FreePascal... Something else?
*  some  way of errors handling - current version of interface doesn't
  handle divisions by zero and memory allocation errors
* automatic switching to either 32 or 64-bit libraries may be extended
  to  the  automatic selection of the optimized library. We can choose
  between  libraries  optimized for P4, Core, Core 2, AMD - all in the
  runtime, without recompilation of application.

>>> LIMITATIONS

Limitations and drawbacks:
*  printf-like  input/output  functions  were  not included in the new
  interface.   It   is   hard  to  interface  such  functions  in  the
  interoperable way
*  new  interface have constant performance penalty which is about 300
  CPU  cycles per function call ('constant' = it is approximately same
  for all functions)

>>> DOWNLOAD

New  interface (C# file, precompiled "Generic C" DLLs, code generator)
can be downloaded from http://www.alglib.net/x/xmpir/xmpir-0.1.zip 

>>> LICENSE

License  is  LGPL  3, both for the core part (DLLs) and for the client
part  (xmpir.cs). That is because I want to keep things simple for the
first time and to synchronize overall license with MPIR's one.

However  I  think  that the client part of the wrapper may be licensed
under  terms  which are different from LGPL 3 (but are compatible with
LGPL 3). LGPL requirements may be satisfied even with non-LGPL license
for  xmpir.cs  (I  am  talking  about permission to use shared library
mechanism  to  distribute  the  rest of the application under non-LGPL
license).


>>> EXAMPLE

Here is example of a simple C# program which uses new interface:

> using System;
> using System.Runtime.InteropServices;
> using System.Diagnostics;
> class MyClass
> {
> [STAThread]
> static void Main(string[] args)
> {
> mpir.mpz_t f = mpir.mpz_init_set_ui(1);
> int i;
> for(i=2; i<=30; i++)
> mpir.mpz_mul_si(f, f, i);
> System.Console.Write("30! = ");
> System.Console.WriteLine(mpir.mpz_get_string(10,f));
> mpir.mpz_clear(f);
> }
> }


Anybody  interested  to  participate?  There  are several difficulties
which  slow  down development. For example, manual takes too much time
because   English  isn't my native language (I haven't started working
on manual yet). Maybe someone wants to help?


-- 
With best regards,
 Sergey                          mailto:sergey.bochka...@alglib.net

-- 
You received this message because you are subscribed to the Google Groups 
"mpir-devel" group.
To post to this group, send email to mpir-de...@googlegroups.com.
To unsubscribe from this group, send email to 
mpir-devel+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/mpir-devel?hl=en.

Reply via email to