2009-08-15 2 views
11

Tôi có kinh nghiệm với OCaml. Bạn phải viết một bài cho mọi chức năng bạn muốn sử dụng để chuyển đổi các loại ngay cả C int < -> OCaml int. Liên kết cũng gây đau đớn. Tôi thậm chí không muốn điều về lập bản đồ đối tượng C++.Ngôn ngữ cấp cao nào có thể dễ dàng giao tiếp với C/C++?

Còn các ngôn ngữ phổ biến khác thì sao? Nó luôn luôn là một nỗi đau?

EDIT:

Hãy tránh trùng lặp. Và trạng thái C và C++ giao tiếp các khả năng riêng biệt.

EDIT 2:

Xin được cụ thể. "X có thể gọi C" không cung cấp quá nhiều thông tin.

+2

Nó không phải là một ngôn ngữ cấp cao nhưng giao diện ASM thực sự tốt đẹp với C và C++! :-). Lời khuyên khác tôi có thể cung cấp cho bạn là khi bạn có quá nhiều rắc rối khi liên kết mã C/C++ với mã Python của bạn, bạn luôn có thể tạo một DLL tốt đẹp cho mã C/C++ của bạn. Một số người thích COM dlls là tốt. – toto

+1

C++ ** là ** ngôn ngữ cao, sự kiện không phải là ** dễ dàng ** một – Artyom

Trả lời

7

Gần như tất cả các ngôn ngữ kịch bản (Perl, Python, Lua, PHP, Ruby, Tcl) đều được nhúng vào C và C++.

Một bài báo khảo sát tốt của những giá trị tương đối của các API:

H. Muhammad and R. Ierusalimschy. C APIs in extension 
and extensible languages. Journal of Universal Computer 
Science, 13(6):839–853, 2007. 

Xem thêm này very similar question (và my answer in particular;)).

+0

Tôi thích cú pháp tô sáng :) – Skilldrick

+0

Skilldrick: Tôi cũng vậy. Tôi tự hỏi tại sao nó làm điều đó: http://meta.stackexchange.com/questions/14664/how-does-so-syntax-highlight-citations-so-well –

+0

-1: "được thiết kế để nhúng vào C và C++. " là sai (như trong, nó không phải là sự thật) cho tất cả các ngôn ngữ được trích dẫn nhưng Lua. Chỉ có Lua được thiết kế cho cái này, cái còn lại là sự thích ứng có thể thực hiện được. Có một sự khác biệt trong quá trình nhúng một ngôn ngữ được thiết kế để nhúng và nhúng một ngôn ngữ mà nó không phải là mục tiêu thiết kế chính. – Klaim

15

Python có API C rất tốt. Nó có thể được tích hợp vào C++ cũng rất dễ dàng và thuận tiện bằng cách sử dụng boost :: python C++ binding cho Python C API.

+1

Bạn nên tham khảo mô-đun ctypes và http://docs.python.org/extending/extending.html – Novelocrat

0

interfacing với các đối tượng C++ sẽ luôn luôn đau đớn, vì không có ABI chuẩn (giao diện nhị phân).

+0

Vâng. Tôi đoán bạn đang nói về các chức năng ảo. Bạn có thể làm rất nhiều mà không có chúng. –

+0

Miễn là giao diện bạn sử dụng giao dịch với các quy ước gọi điện, bố cục, v.v., thay vì buộc bạn, lập trình viên, làm như vậy, nó sẽ ổn. – Novelocrat

+0

Nếu bạn có thể giao tiếp với ELF, bạn sẽ có thể giao tiếp với các đối tượng C++ một cách dễ dàng. – Imagist

3

Python có giao diện C tuyệt vời sử dụng mô-đun ctypes tích hợp sẵn. Để giao diện các mô-đun C++, SWIG có thể được sử dụng.

8

Có nhiều mức độ hưởng thụ khác nhau có sẵn trong các ngôn ngữ chính và giao diện C của chúng. Rất vui, bạn có thể sử dụng SWIG cho hầu hết trong số họ.

3

Python là một mạnh mẽ và dễ dàng để học ngôn ngữ cấp cao và có tài liệu tốt của việc mở rộng nó với C và C++:

http://docs.python.org/extending/extending.html

Sử dụng phương pháp này là đơn giản, nhưng bạn muốn viết phần mở rộng của bạn một cách rõ ràng cho Python. Sử dụng SWIG (xem Extending Python with C++ để có hướng dẫn nhỏ), bạn tạo mã C/C++ như thể nó được tự chạy cùng với một tệp giao diện mà SWIG cần để tạo một số mã gói cho bạn mà bạn có thể sử dụng trong Python (hoặc các ngôn ngữ khác, cho vấn đề đó).

+1

Không phải là Boost.Python xem xét nhiều hơn những điều những ngày này? – KayEss

2

Java có giao diện gốc tuyệt vời với JNI, C# có thứ gì đó rất giống nhau.

+2

JNI thật tuyệt vời ... hãy thử JNA – dfa

+0

Ồ, xin lỗi nếu JNI không còn là 'trong' nữa; Đã 8 năm trôi qua kể từ lần cuối tôi làm Java: P –

+0

Bạn có thể cụ thể hơn không? –

0

Tôi đã liên kết các thư viện FORTRAN cùng một lúc. Tôi sẽ nói với bạn nhiều hơn, nhưng đó là thời gian cho giấc ngủ ngắn của tôi.

0

Tcl có thể gọi C/C++

3

Bạn có thể muốn recent comp.compilers thread này về giao diện ngoại chức năng khác nhau. Người ta cho rằng Haskell là một trong những người đẹp nhất.

1

R có thể mở rộng qua C, C++ và Fortran, được mô tả trong R Extensions Manual và gói đóng góp Rcpp giúp dễ dàng gọi các hàm C++ hơn.

5

Sự cố này đã trở nên quan trọng trong hơn 20 năm. Nhà nước của nghệ thuật trong việc giải quyết nó là để xác định một ngôn ngữ định nghĩa giao diện hoặc IDL. Sau đó, bạn có một công cụ tự động tạo ra các hàm bạn đã sử dụng để viết bằng tay. Cụm từ khác được sử dụng phổ biến là giao diện chức năng nước ngoài hoặc FFI.

Thật không may, hầu hết trong số họ không phải là rất tốt. Từ trải nghiệm cá nhân:

  • tolua và SWIG không đáng sử dụng cho Lua và C; nó dễ dàng hơn để viết các chức năng ràng buộc bằng tay. IDL cho tolua nói riêng hầu như không phải là một tệp tiêu đề C, vì vậy bạn hãy duy trì hai phiên bản của mỗi khai báo.

  • tolua ++ có giá trị sử dụng để ràng buộc Lua và C++ — giá trị phiền toái của việc mô phỏng đối tượng C++ bằng tay rất đáng kể.

  • SWIG bao gồm nhiều ngôn ngữ nhưng tôi luôn thấy khó sử dụng.

Từ đọc về kinh nghiệm của người khác:

  • Các Glasgow Haskell Compiler dường như có giao diện ngoài chức năng đẹp nhất, và nếu tôi nhớ chính xác, IDL là hài lòng khi đơn giản: bạn chỉ cần cung cấp cho các Haskell loại hàm C bạn đang cố gắng nhập.

  • Standard ML of New Jersey cũng có vẻ có giao diện chức năng khá đẹp; đã có một bài báo trong BABEL-01 về nó.

Đối với bất kỳ ngôn ngữ nhất định bạn muốn tương thích với C, bạn nên hỏi về giao diện ngoại chức nănghỏi nếu có một IDL và các công cụ liên quan.

+0

SWIG có thể là một nỗi đau, nhưng nó có lợi ích của việc phải học nó một lần. –

0

Khả năng tích hợp của Lua với C (và mở rộng C++) là lớp học hoàn toàn đầu tiên. Đó là một ngôn ngữ nhỏ tuyệt vời, quá. Tôi không nghĩ rằng nó gần như là tình yêu xứng đáng.

liên kết: http://www.lua.org/

0

triển khai Common Lisp thường sẽ có một FFI hoạt động thực sự tốt với C. Những điều tốt đẹp là bạn không cần phải viết bất kỳ mã C để sử dụng thư viện C; tất cả những gì bạn cần làm là viết khai báo hàm C là Lisp.

Yếu tố đã sao chép hệ thống FFI này từ Lisp.

3

Tôi sẽ không sử dụng Python trong trường hợp này, ngay cả khi có Boost.Python để giúp nhúng nó. Ngay cả những người Python nói nó có ý nghĩa hơn khi nhúng C trong Python so với cách khác, đơn giản vì Python không được thiết kế để nhúng.

Tôi thích sử dụng ngôn ngữ được thực hiện cụ thể được nhúng trong C++ hoặc C, như Lua, Falcon hoặc ChaiScript. Tuy nhiên tôi cũng muốn có một ngôn ngữ đầy đủ. Nếu tôi muốn viết một ứng dụng dưới những ràng buộc nặng nề (như các trò chơi trên bảng điều khiển), tôi thích sử dụng Lua được thiết kế cho việc này. Nếu không, tôi muốn sử dụng Falcon hoặc ChaiScript.

Falcon là một lựa chọn tốt để Python trong trường hợp này (nhúng một ngôn ngữ cấp cao trong C++): http://falconpl.org
Nó được thiết kế để làm việc với C++ và thậm chí cả các thư viện chuẩn được thực hiện trong C++.

Tôi cũng muốn sử dụng ChaiScript khi tôi muốn chỉ bao gồm các tiêu đề và đi với một ngôn ngữ scripring: http://chaiscript.org Nó được thiết kế để được tiêu đề duy nhất và dễ dàng tích hợp trong C++. Trong thực tế nó được thực hiện để làm việc với C + + chỉ.

Cả hai đều là ngôn ngữ cấp cao. Falcon trông giống Python và Ruby nhưng có lợi thế hơn là đề xuất nhiều mô hình lập trình hơn cả hai. Chaiscript trông giống như một C++ đơn giản vì vậy nó có thể không phải là sự lựa chọn tốt nhất cho những người không sử dụng cú pháp như vậy nhưng nếu không nó dễ dàng bị ràng buộc với mã C++ thực của bạn. Falcon cũng vậy, nhưng không theo cách tương tự và cú pháp dễ dàng hơn đối với những người không lập trình.