2016-06-07 14 views
5

Tôi phát hiện ra rằng có hai quy ước gọi điện thoại sử dụng GHC's FFI: ccallcapi. Các tài liệu không có nhiều thông tin về hai quy ước. Sự khác biệt giữa chúng là gì và khi nào tôi nên sử dụng mỗi loại? Là một nhanh hơn khác?Sự khác biệt giữa các quy ước gọi điện của CCall và CAPI

+2

Tôi đã nhấp vào liên kết và có thể tôi chỉ nói rằng tài liệu GHC mới trông tuyệt vời! – epsilonhalbe

+1

Tôi nghĩ rằng sự khác biệt nằm ở việc nhập các tệp c và tệp tiêu đề đơn giản, nhưng đây chỉ là phỏng đoán, tôi thực sự chưa bao giờ sử dụng FFI. – epsilonhalbe

Trả lời

6

ccall là cách thông thường. Nó hoạt động bằng cách liên kết trực tiếp với một ký hiệu được định nghĩa trong một thư viện (thường được viết bằng C).

capi là tiện ích mở rộng ghc hoạt động ở cấp nguồn C. Đó là lý do tại sao nó có thể truy cập những thứ không tồn tại ở cấp ABI, chẳng hạn như macro. (Tôi không biết nó được triển khai như thế nào, nhưng tôi đoán nó sẽ tạo ra một wrapper hàm C nhỏ, sau đó nó biên dịch với trình biên dịch C đằng sau hậu trường.)

Tôi sẽ sử dụng ccall nếu có thể. Đó là một phần của tiêu chuẩn ngôn ngữ và trông ít "huyền diệu" nói chung.

+6

Bạn có bất kỳ lý do cụ thể nào để ưu tiên 'ccall' trên' capi' không? Các thư viện C thường được định nghĩa bởi API của chúng, không phải ABI và việc sử dụng 'ccall' thường gây ra sự cố khi chuyển sang các nền tảng kỳ lạ (như Android), chọn thực hiện một số chức năng như macro có thể dễ dàng tránh được bằng cách sử dụng' capi'. Tôi đã không bao giờ gặp phải một vấn đề gây ra bằng cách sử dụng 'capi' trên' ccall' (mặc dù đó có lẽ chỉ là bởi vì mọi người hiếm khi sử dụng 'capi' ở nơi đầu tiên). –

Các vấn đề liên quan