2012-10-26 3 views
4

Je veux écrire une bibliothèque OCaml qui sera utilisée par d'autres langages de programmation comme C ou même python. Je ne suis pas sûr que ce soit même faisable, et je suppose que je dois abandonner la sécurité de type et ajouter des contrôles d'exécution à l'interface pour le langage typé dynamiquement.Liaisons et introspection pour la bibliothèque OCaml

Est-ce faisable? Existe-t-il des outils pour atteindre cet objectif afin de générer automatiquement des liaisons? Je pense que des choses comme Corba ne correspondent pas bien avec ocaml ABI, mais je peux me tromper. EDIT: en abandonnant l'exigence d'exécution et en utilisant uniquement les langages ayant une interface llvm, je pourrais utiliser llvm comme un ABI commun, mais cela semble difficile.

Répondre

9

OCaml a un FFI à interact with C code. Le code de la liaison doit être écrit en C, pas en OCaml (qui n'a pas de représentation directe des valeurs C, alors que C a des représentations des valeurs OCaml). Mon conseil serait:

  1. Du côté C, décider quelle serait la meilleure interface pour exporter que les programmeurs C voudraient (ou programmeurs Python écriture des liaisons Python à partir de l'interface C)
  2. Définir un « faible couche -level » sur le côté OCaml qui obtient votre valeur OCaml le plus près possible de la représentation C
  3. Ecrire des wrappers C pour convertir ce bas niveau de représentation OCaml à votre représentation optimale C

La raison de l'étape (2) est d'avoir l'étape (3) aussi petite que possible. La manipulation des valeurs OCaml à partir du côté C est un peu douloureuse, en particulier vous risquez d'avoir une mauvaise interaction avec le Garbage Collector, ce qui signifie des segfaults - en plus vous n'obtenez aucune sécurité de type. Donc, moins vous devez faire de travail du côté C, mieux c'est.

Il y a quelques projets pour faire un peu de travail d'emballage pour vous. Par exemple, CamlIDL, et je pense que Swig a un certain support pour OCaml. Je n'ai jamais utilisé ceux-ci, cependant, donc je ne peux pas commenter.

Si vous savez à quelle langue de haut niveau vous souhaitez convertir votre interface, il peut y avoir un pont spécialisé qui n'a pas besoin d'un pas C. Par exemple, il existe des bibliothèques qui interagissent directement avec les représentations Python (recherchez Pycaml, ne savez pas comment elles sont testées au combat) ou avec le moteur d'exécution Java (le projet OCamlJava). Une interface C est toujours un pari sûr qui permettra à d'autres personnes de créer des ponts vers leurs propres langues.