2010-04-14 14 views
10

Así que tengo un buen código OCaml (50000 líneas). Quiero portarlo a C. Entonces, ¿hay algún traductor de OCaml a C gratis?¿Hay algún traductor OCaml to C gratis?

+2

¿Por qué querrías hacer eso? Estoy seguro de que hay mejores formas de hacer lo que sea que estés haciendo. – tiftik

+0

Oh ... No, no hay otras formas ... (a mano es una, pero vamos a esbozarlo) Necesito el código C para compilarlo usando alguna herramienta llamada Adobe Alchemy para Adobe Flash Player ... Así que obtendré 10- 200x de pérdida de velocidad, pero el acero será más rápido que el código compilado a partir de ActionScript puro ... Idea principal: hacer que una aplicación se ejecute dentro de la página web, incluso si es lenta ... – Rella

Respuesta

9

Esto probablemente no es lo que quiere, pero se puede obtener el compilador OCaml para volcar su código en tiempo de ejecución en C:

ocamlc -output-obj -o foo.c foo.ml 

Lo que se obtiene es básicamente un vertedero estática del código de bytes. El resultado será algo como:

#include <caml/mlvalues.h> 
CAMLextern void caml_startup_code(
      code_t code, asize_t code_size, 
      char *data, asize_t data_size, 
      char *section_table, asize_t section_table_size, 
      char **argv); 
static int caml_code[] = { 
0x00000054, 0x000003df, 0x00000029, 0x0000002a, 0x00000001, 0x00000000, 
/* ... */ 
} 

static char caml_data[] = { 
132, 149, 166, 190, 0, 0, 3, 153, 0, 0, 0, 118, 
/* ... */ 
}; 

static char caml_sections[] = { 
132, 149, 166, 190, 0, 0, 21, 203, 0, 0, 0, 117, 
/* ... */ 
}; 

/* ... */ 

void caml_startup(char ** argv) 
{ 
    caml_startup_code(caml_code, sizeof(caml_code), 
         caml_data, sizeof(caml_data), 
         caml_sections, sizeof(caml_sections), 
         argv); 
} 

Se puede compilar con

gcc -L/usr/lib/ocaml foo.c -lcamlrun -lm -lncurses 

Para obtener más información, consulte the OCaml manual.

+0

y puede compilar este código utilizando el compilador C (gcc por ejemplo)? – Rella

+0

Claro, ¿por qué no? Información agregada arriba. –

+0

Grate, pero ¿cómo ahora, por ejemplo, llamar funciones desde mi biblioteca OCaml desde C?(Conozco la forma de llamar a la biblioteca de OCaml desde C, pero para poder portarlo necesito poder anidar OCaml lib en C pero poder invocar sus funciones desde C) – Rella

3

El proyecto OCamlJS sería un buen punto de partida. Compila OCaml a JavaScript; debería ser posible modificarlo para compilar OCaml a ActionScript. Compilar en C probablemente sería más trabajo, sin recolección de basura de ningún tipo, pero no imposible, especialmente si Adobe Alchemy proporciona API para satisfacer algunas de esas necesidades.

3

Si tuviera algún código OCaml quería ejecutar el lado del cliente "en el navegador" (que parece ser su intención basada en comentarios con la pregunta), tengo que decir que mi primer pensamiento sería hacer uno de

  • usar algo como OcamlJava a compilar OCaml a código de bytes de Java y desplegar que el uso de iniciar Java web o similar.
  • Puerto a F # (versión de Microsoft de OCaml) que se ejecuta en .NET y usa lo que MS proporcione a web-deploy eso.

Y tal vez si estaba realmente loco:

  • Puerto del intérprete OCaml (que creen se implementa en 'C') a flash usando Alquimia y hacer que se ejecute el código de bytes OCaml de mi código original (no protegido).

Un OCaml-to-C de dos etapas, C-to-Flash realmente no atrae mucho.

4

No es un archivo ejecutable de código de bytes OCaml a C compilador de código fuente: https://github.com/ocaml-bytes/ocamlcc

Así, compilar primero el código ejecutable a un código de bytes a continuación, utilizar ocamlcc.