2010-04-14 2 views
10

Итак, у меня есть хороший код OCaml (50000 строк). Я хочу передать его на C. Итак, есть ли бесплатный переводчик OCaml to C?Есть ли бесплатный переводчик OCaml-C?

+2

Зачем вам это нужно? Я уверен, что есть лучшие способы сделать то, что вы делаете. – tiftik

+0

Ох ... Нет, нет других способов ... (от руки один, но давайте пропустим его) Мне нужен C-код для его компиляции с помощью какого-то инструмента под названием Adobe Alchemy для Adobe Flash-плеера ... Поэтому я получу 10- 200x потеря скорости, но она будет быстрее, чем код, составленный из чистого ActionScript ... Основная идея - сделать приложение запуститься внутри веб-страницы, даже если оно медленное в нем ... – Rella

ответ

9

Это, вероятно, не то, что вы хотите, но вы можете получить компилятор OCaml, чтобы сбросить его выполнения кода в C:

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

Что вы получаете в основном статический дамп байткод. Результат будет выглядеть так:

#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); 
} 

Вы можете скомпилировать его с

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

Для получения дополнительной информации см the OCaml manual.

+0

, и вы можете скомпилировать этот код с помощью компилятора C (gcc напр.)? – Rella

+0

Конечно, почему бы и нет? Добавлена ​​информация выше. –

+0

Grate, но как теперь, например, вызвать функции из моей библиотеки OCaml из C?(Я знаю, что метод crapy для вызова библиотеки OCaml из C, но для его переноса мне нужно не только вложить OCaml lib в C, но и вызывать его функции с C) – Rella

3

Проект OCamlJS будет хорошей отправной точкой. Он компилирует OCaml в JavaScript; его можно было бы изменить, чтобы скомпилировать OCaml в ActionScript. Компиляция на C, вероятно, будет более эффективной - никакой сборки мусора любого рода - но не невозможно, особенно если Adobe Alchemy предоставляет API для удовлетворения некоторых из этих потребностей.

3

Если у меня был какой-то код OCaml, я хотел запустить клиентский интерфейс «в браузере» (который, кажется, является вашим намерением на основе комментариев с вопросом), я должен сказать, что моя первая мысль заключалась в том, чтобы сделать один из

  • использовать что-то вроде OcamlJava для компиляции OCaml в Java байткод и развертывания, что с помощью Java Web Start или похожи.
  • Порт на F # (версия Microsoft OCaml) работает на .NET и использует независимо от того, что MS предоставляет для веб-развертывания , что.

А может быть, если бы я был на самом деле с ума:

  • Порт переводчик OCaml (который я считаю, реализуется в «C») для вспышки с помощью алхимии и запустить его OCaml байткодом из мой оригинальный (непортированный) код.

Двухэтапный OCaml-to-C, C-to-Flash на самом деле не привлекателен.

4

Существует OCaml байткодом исполняемый файл C исходный код компилятора: https://github.com/ocaml-bytes/ocamlcc

Итак, первый компилировать код в байт-код исполняемый файл, то используйте ocamlcc.