2010-04-14 3 views
10

그래서 멋진 OCaml 코드 (50000 라인)가 있습니다. C로 변환하고 싶습니다. 그래서 무료 OCaml에서 C 로의 번역기가 있습니까?무료 OCaml-C 변환기가 있습니까?

+2

왜 그렇게하고 싶습니까? 네가하고있는 일을 할 수있는 더 좋은 방법이 있다고 확신한다. – tiftik

+0

오 ... 아니 다른 방법은 없습니다 ... (손으로 하나지만 그것을 엿 보자) 내가 어도비 플래시 플레이어에 대한 어도비 알케미라는 일부 도구를 사용하여 그것을 컴파일하는 C 코드가 필요해 ... 그래서 10 - 200x 속도 손실이지만 강철은 순수 ActionScript에서 컴파일 된 코드보다 빠릅니다 ... 주요 아이디어 - 응용 프로그램이 느려지더라도 웹 페이지 내에서 실행되도록 ... – Rella

답변

9

이것은 아마도 당신이 원하는 아니지만, 당신은 OCaml의 컴파일러는 C에서의 런타임 코드를 덤프 얻을 수 있습니다 : 당신이 얻을 것은 기본적으로 바이트 코드의 정적 덤프입니다

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

. 당신은 the OCaml manual 자세한 정보는

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

로 컴파일 할 수 있습니다

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

: 결과는 같을 것이다.

+0

그리고이 코드를 C 컴파일러 (gcc 예)? – Rella

+0

물론, 왜 안 되니? 위의 정보가 추가되었습니다. –

+0

Grate,하지만 어떻게 C의 OCaml 라이브러리에서 함수를 호출 할 수 있습니까?(나는 OCaml 라이브러리를 C에서 호출하는 치료법을 알고 있지만, OCaml 라이브러리를 C에 중첩시킬 수있을뿐만 아니라 C에서 함수를 호출 할 수 있어야합니다.) – Rella

3

프로젝트 OCamlJS 프로젝트가 좋은 출발점이 될 것입니다. OCaml을 JavaScript로 컴파일합니다. 그것을 수정하여 OCaml을 ActionScript로 컴파일 할 수 있어야합니다. C로 컴파일하는 것은 더 많은 작업 일 것입니다. 어떤 종류의 가비지 콜렉션도 없지만 불가능하지는 않습니다. 특히 Adobe Alchemy가 이러한 요구 사항 중 일부를 충족시키는 API를 제공하는 경우 더욱 그렇습니다.

3

OCaml 코드가 클라이언트 측 ("질문하는 코멘트에 기반한 귀하의 의도 인 것 같습니다)"를 실행하고 싶다면, 첫 번째 생각은 다음 중 하나 일 것입니다. 에 OcamlJava 같은

  • 사용 뭔가 자바 바이트 코드를 OCaml를 컴파일하고 자바 웹 시작하거나 유사한 사용하여 해당 배포합니다.
  • .NET에서 실행되는 F # (Microsoft 버전 OCaml)의 포트로 은 웹에서 을 웹 배포하기 위해 제공하는 것입니다.

그리고 난 정말 미친 어쩌면 경우 :

  • 포트 연금술을 사용 플래시에 (내가 'C'로 구현 믿고 )하고 의 OCaml의 바이트 코드를 실행 한 OCaml의 인터프리터 나의 원래 (언 포트 된) 코드.

2 단계 OCaml-to-C, C-to-Flash는 실제로 어필하지 않습니다.

4

C 소스 코드를 컴파일러에 OCaml의 바이트 코드 실행 파일이 있습니다 : https://github.com/ocaml-bytes/ocamlcc

그래서, 먼저 ocamlcc을 사용하여 바이트 코드의 실행 파일에 대한 코드를 컴파일이.

관련 문제