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: ccall
và capi
. 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
Trả lời
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.
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). –
- 1. Sự khác biệt giữa các quy ước gọi C và C++ là gì?
- 2. Sự khác biệt giữa Gọi() và BeginInvoke()
- 3. Khi nào thì sử dụng các quy ước gọi điện
- 4. sự khác biệt giữa việc gọi siêu và gọi điện thoại siêu()
- 5. Sự khác biệt giữa các quy ước không gian tên Ruby này là gì?
- 6. Sự khác biệt giữa quy ước đặt tên cho BEM và SUIT CSS
- 7. Sự khác biệt giữa winforms, WPF và tàu điện ngầm?
- 8. Sự khác biệt giữa "gọi" và "gọi" là gì?
- 9. Sự khác biệt giữa Color.red và Color.RED
- 10. Sự khác biệt giữa "**/* /" và "** /"?
- 11. Sự khác biệt giữa os.system và subprocess gọi
- 12. Làm thế nào để std :: function biết về quy ước gọi điện thoại?
- 13. Sự khác biệt giữa sự khác biệt biểu tượng và sự khác biệt tự động?
- 14. Sự khác biệt giữa org.apache.spark.ml.classification và org.apache.spark.mllib.classification
- 15. Sự khác biệt giữa ". +" Và ". +?"
- 16. Quy ước đặt tên phương thức Java có sự khác biệt về loại và asType?
- 17. Sự khác biệt giữa $ * và $ @
- 18. Sự khác biệt giữa móc và gọi lại là gì?
- 19. Sự khác biệt giữa = và: =
- 20. Sự khác biệt giữa encodeURL và encodeRedirectURL
- 21. Sự khác biệt giữa $ (...) và `...`
- 22. Sự khác biệt giữa. và #
- 23. Sự khác biệt giữa $ # và $ {# @}
- 24. Sự khác biệt giữa SSLCACertificateFile và SSLCertificateChainFile
- 25. Sự khác biệt giữa lưu và save_model()
- 26. Sự khác biệt giữa nproc và ulimit?
- 27. Sự khác biệt giữa Assembly.CreateInstance và Activator.CreateInstance?
- 28. Sự khác biệt giữa self.navigationController.navigationItem và self.navigationItem
- 29. Sự khác biệt giữa Window.load và document.readyState
- 30. Sự khác biệt giữa. và: trong Lua
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
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