我正在爲現有庫(用C語言編寫)編寫一個FFI接口。Squeak中的FFI:Singleton ExternalLibrary與ExternalStructures中的類方法與方法?
該庫使用了大量的不透明結構,因此我定義了幾個ExternalStructures
(沒有字段)用作void*
。
現在,我已經看到了與庫接口的兩種方式(或四個):
有每個導出函數的方法的ExternalLibrary
:這可能會在實例類的方法,然後用單身模式有一個單一的實例。或實現與「更加複雜」語法包括在FFI編譯的moduleName
像在類側的方法:
ffiTestFloats: f1 with: f2
"FFITestLibrary ffiTestFloats: $A with: 65.0"
<cdecl: float 'ffiTestFloats' (float float) module:'SqueakFFIPrims'>
^self externalCallFailed
有什麼好?
此外,我已經看到了其他方式做到這一點,根本沒有ExternalLibrary
,並直接在ExternalStructure
執行方法。我更喜歡這個第二部分,但是,所有的FFI接口定義都通過幾個類傳播,並且維護和移植到其他平臺,Smalltalk方言或庫版本可能更復雜。
那麼,做這件事的「正確」方式是什麼?
我不知道哪個是Squeak的方式,但我喜歡每個導出函數使用一個方法的ExternalLibrary方法。在ExternalStructure中使用這些方法可能會很棘手,因爲可能有幾個結構或者根本沒有一個用於某些功能。 –